Scanner (PluginListComponent& plc, AudioPluginFormat& format, PropertiesFile* properties, int threads) : owner (plc), formatToScan (format), propertiesToUse (properties), pathChooserWindow (TRANS("Select folders to scan..."), String::empty, AlertWindow::NoIcon), progressWindow (TRANS("Scanning for plug-ins..."), TRANS("Searching for all possible plug-in files..."), AlertWindow::NoIcon), progress (0.0), numThreads (threads), finished (false) { FileSearchPath path (formatToScan.getDefaultLocationsToSearch()); if (path.getNumPaths() > 0) // if the path is empty, then paths aren't used for this format. { if (propertiesToUse != nullptr) path = getLastSearchPath (*propertiesToUse, formatToScan); pathList.setSize (500, 300); pathList.setPath (path); pathChooserWindow.addCustomComponent (&pathList); pathChooserWindow.addButton (TRANS("Scan"), 1, KeyPress (KeyPress::returnKey)); pathChooserWindow.addButton (TRANS("Cancel"), 0, KeyPress (KeyPress::escapeKey)); pathChooserWindow.enterModalState (true, ModalCallbackFunction::forComponent (startScanCallback, &pathChooserWindow, this), false); } else { startScan(); } }
Scanner (CabbagePluginListComponent& plc, AudioPluginFormat& format, const StringArray& filesOrIdentifiers, PropertiesFile* properties, bool allowPluginsWhichRequireAsynchronousInstantiation, int threads, const String& title, const String& text) : owner (plc), formatToScan (format), filesOrIdentifiersToScan (filesOrIdentifiers), propertiesToUse (properties), pathChooserWindow (TRANS("Select folders to scan..."), String(), AlertWindow::NoIcon), progressWindow (title, text, AlertWindow::NoIcon), progress (0.0), numThreads (threads), allowAsync (allowPluginsWhichRequireAsynchronousInstantiation), finished (false) { pathChooserWindow.setLookAndFeel(&owner.getLookAndFeel()); progressWindow.setLookAndFeel(&owner.getLookAndFeel()); FileSearchPath path (formatToScan.getDefaultLocationsToSearch()); // You need to use at least one thread when scanning plug-ins asynchronously jassert (! allowAsync || (numThreads > 0)); // If the filesOrIdentifiersToScan argumnent isn't empty, we should only scan these // If the path is empty, then paths aren't used for this format. if (filesOrIdentifiersToScan.isEmpty() && path.getNumPaths() > 0) { #if ! JUCE_IOS if (propertiesToUse != nullptr) path = getLastSearchPath (*propertiesToUse, formatToScan); #endif pathList.setSize (500, 300); pathList.setPath (path); pathChooserWindow.addCustomComponent (&pathList); pathChooserWindow.addButton (TRANS("Scan"), 1, KeyPress (KeyPress::returnKey)); pathChooserWindow.addButton (TRANS("Cancel"), 0, KeyPress (KeyPress::escapeKey)); pathChooserWindow.enterModalState (true, ModalCallbackFunction::forComponent (startScanCallback, &pathChooserWindow, this), false); } else { startScan(); } }
void PluginListComponent::scanFor (AudioPluginFormat* format) { if (format != nullptr) { FileSearchPath path (format->getDefaultLocationsToSearch()); if (path.getNumPaths() > 0) // if the path is empty, then paths aren't used for this format. { #if JUCE_MODAL_LOOPS_PERMITTED if (propertiesToUse != nullptr) path = propertiesToUse->getValue ("lastPluginScanPath_" + format->getName(), path.toString()); AlertWindow aw (TRANS("Select folders to scan..."), String::empty, AlertWindow::NoIcon); FileSearchPathListComponent pathList; pathList.setSize (500, 300); pathList.setPath (path); aw.addCustomComponent (&pathList); aw.addButton (TRANS("Scan"), 1, KeyPress (KeyPress::returnKey)); aw.addButton (TRANS("Cancel"), 0, KeyPress (KeyPress::escapeKey)); if (aw.runModalLoop() == 0) return; path = pathList.getPath(); #else jassertfalse; // XXX this method needs refactoring to work without modal loops.. #endif } if (propertiesToUse != nullptr) { propertiesToUse->setValue ("lastPluginScanPath_" + format->getName(), path.toString()); propertiesToUse->saveIfNeeded(); } currentScanner = new Scanner (*this, *format, path); } }
void FileSearchPath::addPath (const FileSearchPath& other) { for (int i = 0; i < other.getNumPaths(); ++i) addIfNotAlreadyThere (other[i]); }