LMMS
Loading...
Searching...
No Matches
juce_FileBrowserComponent.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28
30 const File& initialFileOrDirectory,
31 const FileFilter* fileFilter_,
32 FilePreviewComponent* previewComp_)
33 : FileFilter ({}),
34 fileFilter (fileFilter_),
35 flags (flags_),
36 previewComp (previewComp_),
37 currentPathBox ("path"),
38 fileLabel ("f", TRANS ("file:")),
39 thread ("JUCE FileBrowser"),
40 wasProcessActive (true)
41{
42 // You need to specify one or other of the open/save flags..
43 jassert ((flags & (saveMode | openMode)) != 0);
44 jassert ((flags & (saveMode | openMode)) != (saveMode | openMode));
45
46 // You need to specify at least one of these flags..
47 jassert ((flags & (canSelectFiles | canSelectDirectories)) != 0);
48
50
51 if (initialFileOrDirectory == File())
52 {
54 }
55 else if (initialFileOrDirectory.isDirectory())
56 {
57 currentRoot = initialFileOrDirectory;
58 }
59 else
60 {
61 chosenFiles.add (initialFileOrDirectory);
62 currentRoot = initialFileOrDirectory.getParentDirectory();
63 filename = initialFileOrDirectory.getFileName();
64 }
65
66 fileList.reset (new DirectoryContentsList (this, thread));
67 fileList->setDirectory (currentRoot, true, true);
68
69 if ((flags & useTreeView) != 0)
70 {
71 auto tree = new FileTreeComponent (*fileList);
72 fileListComponent.reset (tree);
73
74 if ((flags & canSelectMultipleItems) != 0)
75 tree->setMultiSelectEnabled (true);
76
77 addAndMakeVisible (tree);
78 }
79 else
80 {
81 auto list = new FileListComponent (*fileList);
82 fileListComponent.reset (list);
83 list->setOutlineThickness (1);
84
85 if ((flags & canSelectMultipleItems) != 0)
86 list->setMultipleSelectionEnabled (true);
87
88 addAndMakeVisible (list);
89 }
90
91 fileListComponent->addListener (this);
92
93 addAndMakeVisible (currentPathBox);
94 currentPathBox.setEditableText (true);
95 resetRecentPaths();
96 currentPathBox.onChange = [this] { updateSelectedPath(); };
97
98 addAndMakeVisible (filenameBox);
99 filenameBox.setMultiLine (false);
100 filenameBox.setSelectAllWhenFocused (true);
101 filenameBox.setText (filename, false);
102 filenameBox.onTextChange = [this] { sendListenerChangeMessage(); };
103 filenameBox.onReturnKey = [this] { changeFilename(); };
104 filenameBox.onFocusLost = [this]
105 {
106 if (! isSaveMode())
107 selectionChanged();
108 };
109
110 filenameBox.setReadOnly ((flags & (filenameBoxIsReadOnly | canSelectMultipleItems)) != 0);
111
112 addAndMakeVisible (fileLabel);
113 fileLabel.attachToComponent (&filenameBox, true);
114
115 if (previewComp != nullptr)
116 addAndMakeVisible (previewComp);
117
118 lookAndFeelChanged();
119
120 setRoot (currentRoot);
121
122 if (filename.isNotEmpty())
123 setFileName (filename);
124
125 thread.startThread (4);
126
127 startTimer (2000);
128}
129
131{
132 fileListComponent.reset();
133 fileList.reset();
134 thread.stopThread (10000);
135}
136
137//==============================================================================
139{
140 listeners.add (newListener);
141}
142
144{
145 listeners.remove (listener);
146}
147
148//==============================================================================
150{
151 return (flags & saveMode) != 0;
152}
153
155{
156 if (chosenFiles.isEmpty() && currentFileIsValid())
157 return 1;
158
159 return chosenFiles.size();
160}
161
163{
164 if ((flags & canSelectDirectories) != 0 && filenameBox.getText().isEmpty())
165 return currentRoot;
166
167 if (! filenameBox.isReadOnly())
168 return currentRoot.getChildFile (filenameBox.getText());
169
170 return chosenFiles[index];
171}
172
174{
175 auto f = getSelectedFile (0);
176
177 if ((flags & canSelectDirectories) == 0 && f.isDirectory())
178 return false;
179
180 return isSaveMode() || f.exists();
181}
182
187
189{
190 fileListComponent->deselectAllFiles();
191}
192
193//==============================================================================
195{
196 return (flags & canSelectFiles) != 0
197 && (fileFilter == nullptr || fileFilter->isFileSuitable (file));
198}
199
201{
202 return true;
203}
204
206{
207 if (f.isDirectory())
208 return (flags & canSelectDirectories) != 0
209 && (fileFilter == nullptr || fileFilter->isDirectorySuitable (f));
210
211 return (flags & canSelectFiles) != 0 && f.exists()
212 && (fileFilter == nullptr || fileFilter->isFileSuitable (f));
213}
214
215//==============================================================================
217{
218 return currentRoot;
219}
220
221void FileBrowserComponent::setRoot (const File& newRootDirectory)
222{
223 bool callListeners = false;
224
225 if (currentRoot != newRootDirectory)
226 {
227 callListeners = true;
228 fileListComponent->scrollToTop();
229
230 String path (newRootDirectory.getFullPathName());
231
232 if (path.isEmpty())
234
235 StringArray rootNames, rootPaths;
236 getRoots (rootNames, rootPaths);
237
238 if (! rootPaths.contains (path, true))
239 {
240 bool alreadyListed = false;
241
242 for (int i = currentPathBox.getNumItems(); --i >= 0;)
243 {
244 if (currentPathBox.getItemText (i).equalsIgnoreCase (path))
245 {
246 alreadyListed = true;
247 break;
248 }
249 }
250
251 if (! alreadyListed)
252 currentPathBox.addItem (path, currentPathBox.getNumItems() + 2);
253 }
254 }
255
256 currentRoot = newRootDirectory;
257 fileList->setDirectory (currentRoot, true, true);
258
259 if (auto* tree = dynamic_cast<FileTreeComponent*> (fileListComponent.get()))
260 tree->refresh();
261
262 auto currentRootName = currentRoot.getFullPathName();
263
264 if (currentRootName.isEmpty())
265 currentRootName = File::getSeparatorString();
266
267 currentPathBox.setText (currentRootName, dontSendNotification);
268
269 goUpButton->setEnabled (currentRoot.getParentDirectory().isDirectory()
270 && currentRoot.getParentDirectory() != currentRoot);
271
272 if (callListeners)
273 {
274 Component::BailOutChecker checker (this);
275 listeners.callChecked (checker, [&] (FileBrowserListener& l) { l.browserRootChanged (currentRoot); });
276 }
277}
278
280{
281 filenameBox.setText (newName, true);
282
283 fileListComponent->setSelectedFile (currentRoot.getChildFile (newName));
284}
285
287{
288 currentPathBox.clear();
289
290 StringArray rootNames, rootPaths;
291 getRoots (rootNames, rootPaths);
292
293 for (int i = 0; i < rootNames.size(); ++i)
294 {
295 if (rootNames[i].isEmpty())
296 currentPathBox.addSeparator();
297 else
298 currentPathBox.addItem (rootNames[i], i + 1);
299 }
300
301 currentPathBox.addSeparator();
302}
303
305{
306 setRoot (getRoot().getParentDirectory());
307}
308
310{
311 fileList->refresh();
312}
313
314void FileBrowserComponent::setFileFilter (const FileFilter* const newFileFilter)
315{
316 if (fileFilter != newFileFilter)
317 {
318 fileFilter = newFileFilter;
319 refresh();
320 }
321}
322
324{
325 return isSaveMode() ? ((flags & canSelectDirectories) != 0 ? TRANS("Choose")
326 : TRANS("Save"))
327 : TRANS("Open");
328}
329
334
339
344
345//==============================================================================
347{
349 .layoutFileBrowserComponent (*this, fileListComponent.get(), previewComp,
351}
352
353//==============================================================================
355{
356 goUpButton.reset (getLookAndFeel().createFileBrowserGoUpButton());
357
358 if (auto* buttonPtr = goUpButton.get())
359 {
360 addAndMakeVisible (*buttonPtr);
361 buttonPtr->onClick = [this] { goUp(); };
362 buttonPtr->setTooltip (TRANS ("Go up to parent directory"));
363 }
364
368
370 filenameBox.applyColourToAllText (findColour (filenameBoxTextColourId));
371
372 resized();
373 repaint();
374}
375
376//==============================================================================
378{
379 Component::BailOutChecker checker (this);
380
381 if (previewComp != nullptr)
382 previewComp->selectedFileChanged (getSelectedFile (0));
383
384 // You shouldn't delete the browser when the file gets changed!
385 jassert (! checker.shouldBailOut());
386
387 listeners.callChecked (checker, [] (FileBrowserListener& l) { l.selectionChanged(); });
388}
389
391{
392 StringArray newFilenames;
393 bool resetChosenFiles = true;
394
395 for (int i = 0; i < fileListComponent->getNumSelectedFiles(); ++i)
396 {
397 const File f (fileListComponent->getSelectedFile (i));
398
400 {
401 if (resetChosenFiles)
402 {
403 chosenFiles.clear();
404 resetChosenFiles = false;
405 }
406
407 chosenFiles.add (f);
408 newFilenames.add (f.getRelativePathFrom (getRoot()));
409 }
410 }
411
412 if (newFilenames.size() > 0)
413 filenameBox.setText (newFilenames.joinIntoString (", "), false);
414
416}
417
419{
420 Component::BailOutChecker checker (this);
421 listeners.callChecked (checker, [&] (FileBrowserListener& l) { l.fileClicked (f, e); });
422}
423
425{
426 if (f.isDirectory())
427 {
428 setRoot (f);
429
431 filenameBox.setText ({});
432 }
433 else
434 {
435 Component::BailOutChecker checker (this);
436 listeners.callChecked (checker, [&] (FileBrowserListener& l) { l.fileDoubleClicked (f); });
437 }
438}
439
441
443{
444 #if JUCE_LINUX || JUCE_BSD || JUCE_WINDOWS
445 if (key.getModifiers().isCommandDown()
446 && (key.getKeyCode() == 'H' || key.getKeyCode() == 'h'))
447 {
448 fileList->setIgnoresHiddenFiles (! fileList->ignoresHiddenFiles());
449 fileList->refresh();
450 return true;
451 }
452 #endif
453
455 return false;
456}
457
458//==============================================================================
460{
461 if (filenameBox.getText().containsChar (File::getSeparatorChar()))
462 {
463 auto f = currentRoot.getChildFile (filenameBox.getText());
464
465 if (f.isDirectory())
466 {
467 setRoot (f);
468 chosenFiles.clear();
469
471 filenameBox.setText ({});
472 }
473 else
474 {
475 setRoot (f.getParentDirectory());
476 chosenFiles.clear();
477 chosenFiles.add (f);
478 filenameBox.setText (f.getFileName());
479 }
480 }
481 else
482 {
484 }
485}
486
487//==============================================================================
489{
490 auto newText = currentPathBox.getText().trim().unquoted();
491
492 if (newText.isNotEmpty())
493 {
494 auto index = currentPathBox.getSelectedId() - 1;
495
496 StringArray rootNames, rootPaths;
497 getRoots (rootNames, rootPaths);
498
499 if (rootPaths[index].isNotEmpty())
500 {
501 setRoot (File (rootPaths[index]));
502 }
503 else
504 {
505 File f (newText);
506
507 for (;;)
508 {
509 if (f.isDirectory())
510 {
511 setRoot (f);
512 break;
513 }
514
515 if (f.getParentDirectory() == f)
516 break;
517
518 f = f.getParentDirectory();
519 }
520 }
521 }
522}
523
525{
526 #if JUCE_WINDOWS
527 Array<File> roots;
529 rootPaths.clear();
530
531 for (int i = 0; i < roots.size(); ++i)
532 {
533 const File& drive = roots.getReference(i);
534
535 String name (drive.getFullPathName());
536 rootPaths.add (name);
537
538 if (drive.isOnHardDisk())
539 {
540 String volume (drive.getVolumeLabel());
541
542 if (volume.isEmpty())
543 volume = TRANS("Hard Drive");
544
545 name << " [" << volume << ']';
546 }
547 else if (drive.isOnCDRomDrive())
548 {
549 name << " [" << TRANS("CD/DVD drive") << ']';
550 }
551
552 rootNames.add (name);
553 }
554
555 rootPaths.add ({});
556 rootNames.add ({});
557
558 rootPaths.add (File::getSpecialLocation (File::userDocumentsDirectory).getFullPathName());
559 rootNames.add (TRANS("Documents"));
560 rootPaths.add (File::getSpecialLocation (File::userMusicDirectory).getFullPathName());
561 rootNames.add (TRANS("Music"));
562 rootPaths.add (File::getSpecialLocation (File::userPicturesDirectory).getFullPathName());
563 rootNames.add (TRANS("Pictures"));
564 rootPaths.add (File::getSpecialLocation (File::userDesktopDirectory).getFullPathName());
565 rootNames.add (TRANS("Desktop"));
566
567 #elif JUCE_MAC
568 rootPaths.add (File::getSpecialLocation (File::userHomeDirectory).getFullPathName());
569 rootNames.add (TRANS("Home folder"));
570 rootPaths.add (File::getSpecialLocation (File::userDocumentsDirectory).getFullPathName());
571 rootNames.add (TRANS("Documents"));
572 rootPaths.add (File::getSpecialLocation (File::userMusicDirectory).getFullPathName());
573 rootNames.add (TRANS("Music"));
574 rootPaths.add (File::getSpecialLocation (File::userPicturesDirectory).getFullPathName());
575 rootNames.add (TRANS("Pictures"));
576 rootPaths.add (File::getSpecialLocation (File::userDesktopDirectory).getFullPathName());
577 rootNames.add (TRANS("Desktop"));
578
579 rootPaths.add ({});
580 rootNames.add ({});
581
582 for (auto& volume : File ("/Volumes").findChildFiles (File::findDirectories, false))
583 {
584 if (volume.isDirectory() && ! volume.getFileName().startsWithChar ('.'))
585 {
586 rootPaths.add (volume.getFullPathName());
587 rootNames.add (volume.getFileName());
588 }
589 }
590
591 #else
592 rootPaths.add ("/");
593 rootNames.add ("/");
594 rootPaths.add (File::getSpecialLocation (File::userHomeDirectory).getFullPathName());
595 rootNames.add (TRANS("Home folder"));
596 rootPaths.add (File::getSpecialLocation (File::userDesktopDirectory).getFullPathName());
597 rootNames.add (TRANS("Desktop"));
598 #endif
599}
600
602{
603 getDefaultRoots (rootNames, rootPaths);
604}
605
607{
608 const auto isProcessActive = isForegroundOrEmbeddedProcess (this);
609
610 if (wasProcessActive != isProcessActive)
611 {
612 wasProcessActive = isProcessActive;
613
614 if (isProcessActive && fileList != nullptr)
615 refresh();
616 }
617}
618
619//==============================================================================
620std::unique_ptr<AccessibilityHandler> FileBrowserComponent::createAccessibilityHandler()
621{
622 return std::make_unique<AccessibilityHandler> (*this, AccessibilityRole::group);
623}
624
625} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
static File getCurrentWorkingDirectory()
Definition File.cpp:1395
Definition juce_Array.h:56
int size() const noexcept
Definition juce_Array.h:215
ElementType & getReference(int index) noexcept
Definition juce_Array.h:267
@ arrowColourId
Definition juce_ComboBox.h:360
@ textColourId
Definition juce_ComboBox.h:357
@ backgroundColourId
Definition juce_ComboBox.h:356
Definition juce_Component.h:2331
bool shouldBailOut() const noexcept
Definition juce_Component.cpp:3252
void addAndMakeVisible(Component *child, int zOrder=-1)
Definition juce_Component.cpp:1554
void repaint()
Definition juce_Component.cpp:1917
Colour findColour(int colourID, bool inheritFromParent=false) const
Definition juce_Component.cpp:2219
LookAndFeel & getLookAndFeel() const noexcept
Definition juce_Component.cpp:2173
Definition juce_DirectoryContentsDisplayComponent.h:38
void refresh()
Definition juce_FileBrowserComponent.cpp:309
void updateSelectedPath()
Definition juce_FileBrowserComponent.cpp:488
int flags
Definition juce_FileBrowserComponent.h:272
void resized() override
Definition juce_FileBrowserComponent.cpp:346
static void getDefaultRoots(StringArray &rootNames, StringArray &rootPaths)
Definition juce_FileBrowserComponent.cpp:524
void timerCallback() override
Definition juce_FileBrowserComponent.cpp:606
void sendListenerChangeMessage()
Definition juce_FileBrowserComponent.cpp:377
File getSelectedFile(int index) const noexcept
Definition juce_FileBrowserComponent.cpp:162
@ saveMode
Definition juce_FileBrowserComponent.h:56
@ canSelectFiles
Definition juce_FileBrowserComponent.h:58
@ doNotClearFileNameOnRootChange
Definition juce_FileBrowserComponent.h:66
@ canSelectDirectories
Definition juce_FileBrowserComponent.h:60
void selectionChanged() override
Definition juce_FileBrowserComponent.cpp:390
std::unique_ptr< DirectoryContentsList > fileList
Definition juce_FileBrowserComponent.h:269
ComboBox currentPathBox
Definition juce_FileBrowserComponent.h:279
FileBrowserComponent(int flags, const File &initialFileOrDirectory, const FileFilter *fileFilter, FilePreviewComponent *previewComp)
Definition juce_FileBrowserComponent.cpp:29
File currentRoot
Definition juce_FileBrowserComponent.h:273
bool wasProcessActive
Definition juce_FileBrowserComponent.h:284
Array< File > chosenFiles
Definition juce_FileBrowserComponent.h:274
virtual String getActionVerb() const
Definition juce_FileBrowserComponent.cpp:323
ListenerList< FileBrowserListener > listeners
Definition juce_FileBrowserComponent.h:275
virtual void getRoots(StringArray &rootNames, StringArray &rootPaths)
Definition juce_FileBrowserComponent.cpp:601
bool isFileOrDirSuitable(const File &) const
Definition juce_FileBrowserComponent.cpp:205
void browserRootChanged(const File &) override
Definition juce_FileBrowserComponent.cpp:440
void setFileFilter(const FileFilter *newFileFilter)
Definition juce_FileBrowserComponent.cpp:314
void goUp()
Definition juce_FileBrowserComponent.cpp:304
void fileClicked(const File &, const MouseEvent &) override
Definition juce_FileBrowserComponent.cpp:418
void setFilenameBoxLabel(const String &name)
Definition juce_FileBrowserComponent.cpp:330
void setRoot(const File &newRootDirectory)
Definition juce_FileBrowserComponent.cpp:221
const FileFilter * fileFilter
Definition juce_FileBrowserComponent.h:270
void deselectAllFiles()
Definition juce_FileBrowserComponent.cpp:188
std::unique_ptr< DirectoryContentsDisplayComponent > fileListComponent
Definition juce_FileBrowserComponent.h:277
DirectoryContentsDisplayComponent * getDisplayComponent() const noexcept
Definition juce_FileBrowserComponent.cpp:340
FilePreviewComponent * getPreviewComponent() const noexcept
Definition juce_FileBrowserComponent.cpp:335
void removeListener(FileBrowserListener *listener)
Definition juce_FileBrowserComponent.cpp:143
void lookAndFeelChanged() override
Definition juce_FileBrowserComponent.cpp:354
void setFileName(const String &newName)
Definition juce_FileBrowserComponent.cpp:279
bool isDirectorySuitable(const File &) const override
Definition juce_FileBrowserComponent.cpp:200
std::unique_ptr< Button > goUpButton
Definition juce_FileBrowserComponent.h:282
File getHighlightedFile() const noexcept
Definition juce_FileBrowserComponent.cpp:183
TextEditor filenameBox
Definition juce_FileBrowserComponent.h:280
void changeFilename()
Definition juce_FileBrowserComponent.cpp:459
FilePreviewComponent * previewComp
Definition juce_FileBrowserComponent.h:278
bool isFileSuitable(const File &) const override
Definition juce_FileBrowserComponent.cpp:194
bool isSaveMode() const noexcept
Definition juce_FileBrowserComponent.cpp:149
int getNumSelectedFiles() const noexcept
Definition juce_FileBrowserComponent.cpp:154
std::unique_ptr< AccessibilityHandler > createAccessibilityHandler() override
Definition juce_FileBrowserComponent.cpp:620
const File & getRoot() const
Definition juce_FileBrowserComponent.cpp:216
~FileBrowserComponent() override
Definition juce_FileBrowserComponent.cpp:130
bool currentFileIsValid() const
Definition juce_FileBrowserComponent.cpp:173
@ currentPathBoxTextColourId
Definition juce_FileBrowserComponent.h:226
@ filenameBoxBackgroundColourId
Definition juce_FileBrowserComponent.h:228
@ currentPathBoxBackgroundColourId
Definition juce_FileBrowserComponent.h:225
@ filenameBoxTextColourId
Definition juce_FileBrowserComponent.h:229
@ currentPathBoxArrowColourId
Definition juce_FileBrowserComponent.h:227
TimeSliceThread thread
Definition juce_FileBrowserComponent.h:283
void addListener(FileBrowserListener *listener)
Definition juce_FileBrowserComponent.cpp:138
Label fileLabel
Definition juce_FileBrowserComponent.h:281
bool keyPressed(const KeyPress &) override
Definition juce_FileBrowserComponent.cpp:442
void fileDoubleClicked(const File &) override
Definition juce_FileBrowserComponent.cpp:424
void resetRecentPaths()
Definition juce_FileBrowserComponent.cpp:286
Definition juce_FileBrowserListener.h:38
FileFilter(const String &filterDescription)
Definition juce_FileFilter.cpp:26
Definition juce_File.h:45
bool isOnHardDisk() const
Definition juce_linux_Files.cpp:46
bool isOnCDRomDrive() const
Definition juce_linux_Files.cpp:38
static StringRef getSeparatorString()
Definition juce_posix_SharedCode.h:114
const String & getFullPathName() const noexcept
Definition juce_File.h:153
@ userMusicDirectory
Definition juce_File.h:875
@ userDocumentsDirectory
Definition juce_File.h:869
@ userPicturesDirectory
Definition juce_File.h:881
@ userDesktopDirectory
Definition juce_File.h:872
@ userHomeDirectory
Definition juce_File.h:863
static void findFileSystemRoots(Array< File > &results)
Definition juce_linux_CommonFile.cpp:48
@ findDirectories
Definition juce_File.h:559
static File JUCE_CALLTYPE getSpecialLocation(const SpecialLocationType type)
Definition juce_linux_Files.cpp:107
String getVolumeLabel() const
Definition juce_posix_SharedCode.h:676
static juce_wchar getSeparatorChar()
Definition juce_posix_SharedCode.h:113
Definition juce_FilePreviewComponent.h:44
Definition juce_FileTreeComponent.h:45
Definition juce_KeyPress.h:40
Definition juce_MouseEvent.h:39
Definition juce_StringArray.h:35
String joinIntoString(StringRef separatorString, int startIndex=0, int numberOfElements=-1) const
Definition juce_StringArray.cpp:289
bool contains(StringRef stringToLookFor, bool ignoreCase=false) const
Definition juce_StringArray.cpp:189
void clear()
Definition juce_StringArray.cpp:107
int size() const noexcept
Definition juce_StringArray.h:136
void add(String stringToAdd)
Definition juce_StringArray.cpp:136
Definition juce_String.h:53
bool isEmpty() const noexcept
Definition juce_String.h:310
@ backgroundColourId
Definition juce_TextEditor.h:209
* e
Definition inflate.c:1404
int * l
Definition inflate.c:1579
register unsigned i
Definition inflate.c:1575
unsigned f
Definition inflate.c:1572
static char filename[]
Definition features.c:5
static const char * name
Definition pugl.h:1582
#define TRANS(stringLiteral)
Definition juce_LocalisedStrings.h:208
#define jassert(expression)
Definition carla_juce.cpp:31
@ dontSendNotification
Definition juce_NotificationType.h:33
void ignoreUnused(Types &&...) noexcept
Definition juce_MathsFunctions.h:333
@ list
Definition juce_AccessibilityRole.h:56
@ tree
Definition juce_AccessibilityRole.h:58
@ group
Definition juce_AccessibilityRole.h:61
static bool isForegroundOrEmbeddedProcess(Component *viewComponent)
Definition juce_gui_basics.cpp:120
jack_client_t client jack_client_t client jack_client_t client jack_client_t JackInfoShutdownCallback void arg jack_client_t jack_port_t port void func jack_client_t const char const char unsigned long flags
Definition juce_linux_JackAudio.cpp:69
static float volume(float level)
Definition nekobee_voice_render.c:99
ZCONST char * key
Definition crypt.c:587
struct zdirent * file
Definition win32.c:1500
#define const
Definition zconf.h:137