diff --git a/extras/Introjucer/Source/Application/jucer_Application.h b/extras/Introjucer/Source/Application/jucer_Application.h index e9307aa038..87064861bf 100644 --- a/extras/Introjucer/Source/Application/jucer_Application.h +++ b/extras/Introjucer/Source/Application/jucer_Application.h @@ -466,7 +466,7 @@ public: bool makeSureUserHasSelectedModuleFolder() { - if (! ModuleList::isLocalModulesFolderValid()) + if (! AvailableModuleList::isLocalModulesFolderValid()) { if (! runModuleUpdate ("Please select a location to store your local set of JUCE modules,\n" "and download the ones that you'd like to use!")) @@ -480,7 +480,7 @@ public: } } - if (ModuleList().isLibraryNewerThanIntrojucer()) + if (AvailableModuleList().isLibraryNewerThanIntrojucer()) { AlertWindow::showMessageBox (AlertWindow::WarningIcon, "Introjucer", @@ -494,12 +494,12 @@ public: bool runModuleUpdate (const String& message) { - ModuleList list; - list.rescan (ModuleList::getDefaultModulesFolder (mainWindowList.getFrontmostProject())); + AvailableModuleList list; + list.rescan (AvailableModuleList::getDefaultModulesFolder (mainWindowList.getFrontmostProject())); JuceUpdater::show (list, mainWindowList.windows[0], message); - ModuleList::setLocalModulesFolder (list.getModulesFolder()); - return ModuleList::isJuceOrModulesFolder (list.getModulesFolder()); + AvailableModuleList::setLocalModulesFolder (list.getModulesFolder()); + return AvailableModuleList::isJuceOrModulesFolder (list.getModulesFolder()); } //============================================================================== diff --git a/extras/Introjucer/Source/Application/jucer_CommandLine.cpp b/extras/Introjucer/Source/Application/jucer_CommandLine.cpp index 8e03c0db13..b78b295d02 100644 --- a/extras/Introjucer/Source/Application/jucer_CommandLine.cpp +++ b/extras/Introjucer/Source/Application/jucer_CommandLine.cpp @@ -213,12 +213,12 @@ namespace hideDockIcon(); std::cout << "Downloading list of available modules..." << std::endl; - ModuleList list; + AvailableModuleList list; list.loadFromWebsite(); for (int i = 0; i < list.modules.size(); ++i) { - const ModuleList::Module* m = list.modules.getUnchecked(i); + const AvailableModuleList::Module* m = list.modules.getUnchecked(i); std::cout << m->uid << ": " << m->version << std::endl; } @@ -248,13 +248,15 @@ namespace << "Name: " << proj.getTitle() << std::endl << "UID: " << proj.getProjectUID() << std::endl; - const int numModules = proj.getNumModules(); + EnabledModuleList modules (proj.getModules()); + + const int numModules = modules.getNumModules(); if (numModules > 0) { std::cout << "Modules:" << std::endl; for (int i = 0; i < numModules; ++i) - std::cout << " " << proj.getModuleID (i) << std::endl; + std::cout << " " << modules.getModuleID (i) << std::endl; } return 0; diff --git a/extras/Introjucer/Source/Application/jucer_JuceUpdater.cpp b/extras/Introjucer/Source/Application/jucer_JuceUpdater.cpp index f7685a9bb0..b01ee22c6f 100644 --- a/extras/Introjucer/Source/Application/jucer_JuceUpdater.cpp +++ b/extras/Introjucer/Source/Application/jucer_JuceUpdater.cpp @@ -28,10 +28,10 @@ //============================================================================== -JuceUpdater::JuceUpdater (ModuleList& moduleList_, const String& message) - : moduleList (moduleList_), +JuceUpdater::JuceUpdater (AvailableModuleList& l, const String& message) + : moduleList (l), messageLabel (String::empty, message), - filenameComp ("Juce Folder", ModuleList::getLocalModulesFolder (nullptr), + filenameComp ("Juce Folder", AvailableModuleList::getLocalModulesFolder (nullptr), true, true, false, "*", String::empty, "Select your Juce folder"), checkNowButton ("Check for available updates on the JUCE website...", "Contacts the website to see if new modules are available"), @@ -73,7 +73,7 @@ JuceUpdater::~JuceUpdater() filenameComp.removeListener (this); } -void JuceUpdater::show (ModuleList& moduleList, Component* mainWindow, const String& message) +void JuceUpdater::show (AvailableModuleList& moduleList, Component* mainWindow, const String& message) { DialogWindow::LaunchOptions o; o.content.setOwned (new JuceUpdater (moduleList, message)); @@ -133,7 +133,7 @@ class WebsiteContacterThread : public Thread, private AsyncUpdater { public: - WebsiteContacterThread (JuceUpdater& owner_, const ModuleList& latestList) + WebsiteContacterThread (JuceUpdater& owner_, const AvailableModuleList& latestList) : Thread ("Module updater"), owner (owner_), downloaded (latestList) @@ -163,7 +163,7 @@ public: private: JuceUpdater& owner; - ModuleList downloaded; + AvailableModuleList downloaded; }; void JuceUpdater::checkNow() @@ -172,7 +172,7 @@ void JuceUpdater::checkNow() websiteContacterThread = new WebsiteContacterThread (*this, latestList); } -void JuceUpdater::backgroundUpdateComplete (const ModuleList& newList) +void JuceUpdater::backgroundUpdateComplete (const AvailableModuleList& newList) { latestList = newList; websiteContacterThread = nullptr; @@ -197,8 +197,8 @@ int JuceUpdater::getNumCheckedModules() const bool JuceUpdater::isLatestVersion (const String& moduleID) const { - const ModuleList::Module* m1 = moduleList.findModuleInfo (moduleID); - const ModuleList::Module* m2 = latestList.findModuleInfo (moduleID); + const AvailableModuleList::Module* m1 = moduleList.findModuleInfo (moduleID); + const AvailableModuleList::Module* m2 = latestList.findModuleInfo (moduleID); return m1 != nullptr && m2 != nullptr && m1->version == m2->version; } @@ -215,7 +215,7 @@ void JuceUpdater::filenameComponentChanged (FilenameComponent*) moduleList.rescan (filenameComp.getCurrentFile()); filenameComp.setCurrentFile (moduleList.getModulesFolder(), true, dontSendNotification); - if (! ModuleList::isModulesFolder (moduleList.getModulesFolder())) + if (! AvailableModuleList::isModulesFolder (moduleList.getModulesFolder())) currentVersionLabel.setText ("(Not a Juce folder)", dontSendNotification); else currentVersionLabel.setText (String::empty, dontSendNotification); @@ -259,8 +259,8 @@ public: setInterceptsMouseClicks (false, true); } - void setModule (const ModuleList::Module* newModule, - const ModuleList::Module* existingModule, + void setModule (const AvailableModuleList::Module* newModule, + const AvailableModuleList::Module* existingModule, const Value& value) { if (newModule != nullptr) @@ -322,7 +322,7 @@ Component* JuceUpdater::refreshComponentForRow (int rowNumber, bool /*isRowSelec if (c == nullptr) c = new UpdateListComponent(); - if (ModuleList::Module* m = latestList.modules [rowNumber]) + if (AvailableModuleList::Module* m = latestList.modules [rowNumber]) c->setModule (m, moduleList.findModuleInfo (m->uid), versionsToDownload.getPropertyAsValue (m->uid, nullptr)); @@ -336,12 +336,12 @@ Component* JuceUpdater::refreshComponentForRow (int rowNumber, bool /*isRowSelec class InstallThread : public ThreadWithProgressWindow { public: - InstallThread (const ModuleList& targetList_, - const ModuleList& list_, const StringArray& itemsToInstall_) + InstallThread (const AvailableModuleList& target, + const AvailableModuleList& l, const StringArray& itemsToInstall_) : ThreadWithProgressWindow ("Installing New Modules", true, true), result (Result::ok()), - targetList (targetList_), - list (list_), + targetList (target), + list (l), itemsToInstall (itemsToInstall_) { } @@ -350,7 +350,7 @@ public: { for (int i = 0; i < itemsToInstall.size(); ++i) { - const ModuleList::Module* m = list.findModuleInfo (itemsToInstall[i]); + const AvailableModuleList::Module* m = list.findModuleInfo (itemsToInstall[i]); jassert (m != nullptr); if (m != nullptr) @@ -377,7 +377,7 @@ public: } } - Result download (const ModuleList::Module& m, MemoryBlock& dest) + Result download (const AvailableModuleList::Module& m, MemoryBlock& dest) { setStatusMessage ("Downloading " + m.uid + "..."); @@ -387,7 +387,7 @@ public: return Result::fail ("Failed to download from: " + m.url.toString (false)); } - Result unzip (const ModuleList::Module& m, const MemoryBlock& data) + Result unzip (const AvailableModuleList::Module& m, const MemoryBlock& data) { setStatusMessage ("Installing " + m.uid + "..."); @@ -403,7 +403,7 @@ public: Result result; private: - ModuleList targetList, list; + AvailableModuleList targetList, list; StringArray itemsToInstall; }; diff --git a/extras/Introjucer/Source/Application/jucer_JuceUpdater.h b/extras/Introjucer/Source/Application/jucer_JuceUpdater.h index c97af7aa2a..391dccba80 100644 --- a/extras/Introjucer/Source/Application/jucer_JuceUpdater.h +++ b/extras/Introjucer/Source/Application/jucer_JuceUpdater.h @@ -36,10 +36,10 @@ class JuceUpdater : public Component, private ValueTree::Listener { public: - JuceUpdater (ModuleList& moduleList, const String& message); + JuceUpdater (AvailableModuleList&, const String& message); ~JuceUpdater(); - static void show (ModuleList& moduleList, Component* mainWindow, const String& message); + static void show (AvailableModuleList&, Component* mainWindow, const String& message); //============================================================================== void resized(); @@ -51,11 +51,11 @@ public: void paintListBoxItem (int rowNumber, Graphics& g, int width, int height, bool rowIsSelected); Component* refreshComponentForRow (int rowNumber, bool isRowSelected, Component* existingComponentToUpdate); - void backgroundUpdateComplete (const ModuleList& newList); + void backgroundUpdateComplete (const AvailableModuleList& newList); private: - ModuleList& moduleList; - ModuleList latestList; + AvailableModuleList& moduleList; + AvailableModuleList latestList; Label messageLabel, label, currentVersionLabel; FilenameComponent filenameComp; diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h index 5b4083462a..ca204c278e 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_Android.h @@ -256,7 +256,7 @@ private: manifest->createNewChildElement ("uses-permission")->setAttribute ("android:name", permissions[i]); } - if (project.isModuleEnabled ("juce_opengl")) + if (project.getModules().isModuleEnabled ("juce_opengl")) { XmlElement* feature = manifest->createNewChildElement ("uses-feature"); feature->setAttribute ("android:glEsVersion", "0x00020000"); diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp index 4b0493c739..7a0629fd3f 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExporter.cpp @@ -81,7 +81,7 @@ ProjectExporter* ProjectExporter::createNewExporter (Project& project, const int default: jassertfalse; return 0; } - File juceFolder (ModuleList::getLocalModulesFolder (&project)); + File juceFolder (AvailableModuleList::getLocalModulesFolder (&project)); File target (exp->getTargetFolder()); if (FileHelpers::shouldPathsBeRelative (juceFolder.getFullPathName(), project.getFile().getFullPathName())) @@ -204,9 +204,9 @@ void ProjectExporter::createPropertyEditors (PropertyListBuilder& props) "filesystem of the machine you use to actually do the compiling."); OwnedArray modules; - ModuleList moduleList; - moduleList.rescan (ModuleList::getDefaultModulesFolder (&project)); - project.createRequiredModules (moduleList, modules); + AvailableModuleList moduleList; + moduleList.rescan (AvailableModuleList::getDefaultModulesFolder (&project)); + project.getModules().createRequiredModules (moduleList, modules); for (int i = 0; i < modules.size(); ++i) modules.getUnchecked(i)->createPropertyEditors (*this, props); diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h index 81c11e6b26..ae74a32cac 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h @@ -85,13 +85,13 @@ public: OwnedArray modules; { - ModuleList moduleList; - Result scanResult (moduleList.rescan (ModuleList::getDefaultModulesFolder (&project))); + AvailableModuleList moduleList; + Result scanResult (moduleList.rescan (AvailableModuleList::getDefaultModulesFolder (&project))); if (scanResult.failed()) return scanResult; - project.createRequiredModules (moduleList, modules); + project.getModules().createRequiredModules (moduleList, modules); } if (errors.size() == 0) writeAppConfigFile (modules, appConfigUserContent); diff --git a/extras/Introjucer/Source/Project/jucer_Module.cpp b/extras/Introjucer/Source/Project/jucer_Module.cpp index acb6a9f03f..c6ded93dfa 100644 --- a/extras/Introjucer/Source/Project/jucer_Module.cpp +++ b/extras/Introjucer/Source/Project/jucer_Module.cpp @@ -30,17 +30,17 @@ //============================================================================== -ModuleList::ModuleList() +AvailableModuleList::AvailableModuleList() { } -ModuleList::ModuleList (const ModuleList& other) +AvailableModuleList::AvailableModuleList (const AvailableModuleList& other) : moduleFolder (other.moduleFolder) { modules.addCopiesOf (other.modules); } -ModuleList& ModuleList::operator= (const ModuleList& other) +AvailableModuleList& AvailableModuleList::operator= (const AvailableModuleList& other) { moduleFolder = other.moduleFolder; modules.clear(); @@ -49,7 +49,7 @@ ModuleList& ModuleList::operator= (const ModuleList& other) return *this; } -bool ModuleList::operator== (const ModuleList& other) const +bool AvailableModuleList::operator== (const AvailableModuleList& other) const { if (modules.size() != other.modules.size()) return false; @@ -66,8 +66,7 @@ bool ModuleList::operator== (const ModuleList& other) const return true; } - -bool ModuleList::isLocalModulesFolderValid() +bool AvailableModuleList::isLocalModulesFolderValid() { return isModulesFolder (getModulesFolderForJuceOrModulesFolder (getLocalModulesFolder (nullptr))); } @@ -94,9 +93,9 @@ static int getBuiltJuceVersion() + JUCE_BUILDNUMBER; } -bool ModuleList::isLibraryNewerThanIntrojucer() +bool AvailableModuleList::isLibraryNewerThanIntrojucer() { - ModuleList list; + AvailableModuleList list; list.rescan (getModulesFolderForJuceOrModulesFolder (getLocalModulesFolder (nullptr))); for (int i = list.modules.size(); --i >= 0;) @@ -111,24 +110,24 @@ bool ModuleList::isLibraryNewerThanIntrojucer() return false; } -bool ModuleList::isJuceFolder (const File& folder) +bool AvailableModuleList::isJuceFolder (const File& folder) { return folder.getFileName().containsIgnoreCase ("juce") && isModulesFolder (folder.getChildFile ("modules")); } -bool ModuleList::isModulesFolder (const File& folder) +bool AvailableModuleList::isModulesFolder (const File& folder) { return folder.getFileName().equalsIgnoreCase ("modules") && folder.isDirectory(); } -bool ModuleList::isJuceOrModulesFolder (const File& folder) +bool AvailableModuleList::isJuceOrModulesFolder (const File& folder) { return isJuceFolder (folder) || isModulesFolder (folder); } -File ModuleList::getModulesFolderForJuceOrModulesFolder (const File& f) +File AvailableModuleList::getModulesFolderForJuceOrModulesFolder (const File& f) { if (f.getFileName() != "modules" && f.isDirectory() && f.getChildFile ("modules").isDirectory()) return f.getChildFile ("modules"); @@ -136,14 +135,14 @@ File ModuleList::getModulesFolderForJuceOrModulesFolder (const File& f) return f; } -File ModuleList::getModulesFolderForExporter (const ProjectExporter& exporter) +File AvailableModuleList::getModulesFolderForExporter (const ProjectExporter& exporter) { File f (exporter.getProject().resolveFilename (exporter.getJuceFolderString())); f = getModulesFolderForJuceOrModulesFolder (f); return f; } -File ModuleList::getDefaultModulesFolder (Project* project) +File AvailableModuleList::getDefaultModulesFolder (Project* project) { if (project != nullptr) { @@ -151,7 +150,7 @@ File ModuleList::getDefaultModulesFolder (Project* project) { const File f (getModulesFolderForExporter (*exporter)); - if (ModuleList::isModulesFolder (f)) + if (AvailableModuleList::isModulesFolder (f)) return f; } } @@ -166,20 +165,20 @@ File ModuleList::getDefaultModulesFolder (Project* project) .getChildFile ("modules"); } -File ModuleList::getLocalModulesFolder (Project* project) +File AvailableModuleList::getLocalModulesFolder (Project* project) { File defaultJuceFolder (getDefaultModulesFolder (project)); File f (getGlobalProperties().getValue ("lastJuceFolder", defaultJuceFolder.getFullPathName())); f = getModulesFolderForJuceOrModulesFolder (f); - if ((! ModuleList::isModulesFolder (f)) && ModuleList::isModulesFolder (defaultJuceFolder)) + if ((! AvailableModuleList::isModulesFolder (f)) && AvailableModuleList::isModulesFolder (defaultJuceFolder)) f = defaultJuceFolder; return f; } -void ModuleList::setLocalModulesFolder (const File& file) +void AvailableModuleList::setLocalModulesFolder (const File& file) { //jassert (FileHelpers::isJuceFolder (file)); getGlobalProperties().setValue ("lastJuceFolder", file.getFullPathName()); @@ -187,24 +186,24 @@ void ModuleList::setLocalModulesFolder (const File& file) struct ModuleSorter { - static int compareElements (const ModuleList::Module* m1, const ModuleList::Module* m2) + static int compareElements (const AvailableModuleList::Module* m1, const AvailableModuleList::Module* m2) { return m1->uid.compareIgnoreCase (m2->uid); } }; -void ModuleList::sort() +void AvailableModuleList::sort() { ModuleSorter sorter; modules.sort (sorter); } -void ModuleList::rescan() +void AvailableModuleList::rescan() { rescan (moduleFolder); } -Result ModuleList::rescan (const File& newModulesFolder) +Result AvailableModuleList::rescan (const File& newModulesFolder) { modules.clear(); moduleFolder = getModulesFolderForJuceOrModulesFolder (newModulesFolder); @@ -242,7 +241,7 @@ Result ModuleList::rescan (const File& newModulesFolder) return Result::ok(); } -bool ModuleList::loadFromWebsite() +bool AvailableModuleList::loadFromWebsite() { modules.clear(); @@ -285,12 +284,12 @@ bool ModuleList::loadFromWebsite() return infoList.isArray(); } -LibraryModule* ModuleList::Module::create() const +LibraryModule* AvailableModuleList::Module::create() const { return new LibraryModule (file); } -bool ModuleList::Module::operator== (const Module& other) const +bool AvailableModuleList::Module::operator== (const Module& other) const { return uid == other.uid && version == other.version @@ -301,12 +300,12 @@ bool ModuleList::Module::operator== (const Module& other) const && url == other.url; } -bool ModuleList::Module::operator!= (const Module& other) const +bool AvailableModuleList::Module::operator!= (const Module& other) const { return ! operator== (other); } -LibraryModule* ModuleList::loadModule (const String& uid) const +LibraryModule* AvailableModuleList::loadModule (const String& uid) const { if (const Module* const m = findModuleInfo (uid)) return m->create(); @@ -314,7 +313,7 @@ LibraryModule* ModuleList::loadModule (const String& uid) const return nullptr; } -const ModuleList::Module* ModuleList::findModuleInfo (const String& uid) const +const AvailableModuleList::Module* AvailableModuleList::findModuleInfo (const String& uid) const { for (int i = modules.size(); --i >= 0;) if (modules.getUnchecked(i)->uid == uid) @@ -323,7 +322,7 @@ const ModuleList::Module* ModuleList::findModuleInfo (const String& uid) const return nullptr; } -void ModuleList::getDependencies (const String& moduleID, StringArray& dependencies) const +void AvailableModuleList::getDependencies (const String& moduleID, StringArray& dependencies) const { ScopedPointer m (loadModule (moduleID)); @@ -350,7 +349,7 @@ void ModuleList::getDependencies (const String& moduleID, StringArray& dependenc } } -void ModuleList::createDependencies (const String& moduleID, OwnedArray&) const +void AvailableModuleList::createDependencies (const String& moduleID, OwnedArray&) const { ScopedPointer m (loadModule (moduleID)); @@ -374,13 +373,13 @@ void ModuleList::createDependencies (const String& moduleID, OwnedArray compiled; findAndAddCompiledCode (exporter, projectSaver, localFolder, compiled); - if (project.shouldShowAllModuleFilesInProject (getID()).getValue()) + if (project.getModules().shouldShowAllModuleFilesInProject (getID()).getValue()) addBrowsableCode (exporter, compiled, localFolder); } @@ -787,3 +786,95 @@ void LibraryModule::addBrowsableCode (ProjectExporter& exporter, const Array& modules) const +{ + for (int i = 0; i < availableModules.modules.size(); ++i) + if (isModuleEnabled (availableModules.modules.getUnchecked(i)->uid)) + modules.add (availableModules.modules.getUnchecked(i)->create()); +} diff --git a/extras/Introjucer/Source/Project/jucer_Module.h b/extras/Introjucer/Source/Project/jucer_Module.h index a3321236e6..079207e5f9 100644 --- a/extras/Introjucer/Source/Project/jucer_Module.h +++ b/extras/Introjucer/Source/Project/jucer_Module.h @@ -86,12 +86,12 @@ private: }; //============================================================================== -class ModuleList +class AvailableModuleList { public: - ModuleList(); - ModuleList (const ModuleList&); - ModuleList& operator= (const ModuleList&); + AvailableModuleList(); + AvailableModuleList (const AvailableModuleList&); + AvailableModuleList& operator= (const AvailableModuleList&); //============================================================================== Result rescan (const File& newModulesFolder); @@ -120,7 +120,7 @@ public: const Module* findModuleInfo (const String& uid) const; - bool operator== (const ModuleList&) const; + bool operator== (const AvailableModuleList&) const; //============================================================================== static bool isJuceFolder (const File& folder); @@ -148,5 +148,34 @@ private: void sort(); }; +//============================================================================== +class EnabledModuleList +{ +public: + EnabledModuleList (Project&, const ValueTree&); + + bool isModuleEnabled (const String& moduleID) const; + Value shouldShowAllModuleFilesInProject (const String& moduleID); + Value shouldCopyModuleFilesLocally (const String& moduleID); + void addModule (const String& moduleID, bool shouldCopyFilesLocally); + void removeModule (const String& moduleID); + void addDefaultModules (bool shouldCopyFilesLocally); + bool isAudioPluginModuleMissing() const; + + void createRequiredModules (const AvailableModuleList& availableModules, + OwnedArray& modules) const; + + int getNumModules() const { return state.getNumChildren(); } + String getModuleID (int index) const { return state.getChild (index) [Ids::ID].toString(); } + + static const Identifier modulesGroupTag, moduleTag; + +private: + Project& project; + ValueTree state; + + UndoManager* getUndoManager() const { return project.getUndoManagerFor (state); } +}; + #endif // __JUCER_MODULE_JUCEHEADER__ diff --git a/extras/Introjucer/Source/Project/jucer_ModulesPanel.h b/extras/Introjucer/Source/Project/jucer_ModulesPanel.h index 5362ef3bd9..49723722b0 100644 --- a/extras/Introjucer/Source/Project/jucer_ModulesPanel.h +++ b/extras/Introjucer/Source/Project/jucer_ModulesPanel.h @@ -34,7 +34,7 @@ public: ModulesPanel (Project& p) : PropertyComponent ("Modules", 500), project (p), - modulesLocation ("modules", ModuleList::getLocalModulesFolder (&project), + modulesLocation ("modules", AvailableModuleList::getLocalModulesFolder (&project), true, true, false, "*", String::empty, "Select a folder containing your JUCE modules..."), modulesLabel (String::empty, "Module source folder:"), @@ -42,7 +42,7 @@ public: moduleListBox (moduleList), copyingMessage (p, moduleList) { - moduleList.rescan (ModuleList::getLocalModulesFolder (&project)); + moduleList.rescan (AvailableModuleList::getLocalModulesFolder (&project)); addAndMakeVisible (&modulesLocation); modulesLocation.addListener (this); @@ -63,7 +63,7 @@ public: { moduleList.rescan (modulesLocation.getCurrentFile()); modulesLocation.setCurrentFile (moduleList.getModulesFolder(), false, dontSendNotification); - ModuleList::setLocalModulesFolder (moduleList.getModulesFolder()); + AvailableModuleList::setLocalModulesFolder (moduleList.getModulesFolder()); moduleListBox.refresh(); } @@ -74,27 +74,27 @@ public: filenameComponentChanged (nullptr); } - bool isEnabled (const ModuleList::Module* m) const + bool isEnabled (const AvailableModuleList::Module* m) const { - return project.isModuleEnabled (m->uid); + return project.getModules().isModuleEnabled (m->uid); } - void setEnabled (const ModuleList::Module* m, bool enable) + void setEnabled (const AvailableModuleList::Module* m, bool enable) { if (enable) - project.addModule (m->uid, true); + project.getModules().addModule (m->uid, true); else - project.removeModule (m->uid); + project.getModules().removeModule (m->uid); refresh(); } - bool areDependenciesMissing (const ModuleList::Module* m) + bool areDependenciesMissing (const AvailableModuleList::Module* m) { return moduleList.getExtraDependenciesNeeded (project, *m).size() > 0; } - void selectionChanged (const ModuleList::Module* selectedModule) + void selectionChanged (const AvailableModuleList::Module* selectedModule) { settings = nullptr; @@ -137,7 +137,7 @@ public: public ListBoxModel { public: - ModuleSelectionListBox (ModuleList& ml) + ModuleSelectionListBox (AvailableModuleList& ml) : list (ml), owner (nullptr) { setColour (ListBox::backgroundColourId, Colours::white.withAlpha (0.4f)); @@ -167,7 +167,7 @@ public: if (rowIsSelected) g.fillAll (findColour (TextEditor::highlightColourId)); - if (const ModuleList::Module* const m = list.modules [rowNumber]) + if (const AvailableModuleList::Module* const m = list.modules [rowNumber]) { const float tickSize = height * 0.7f; @@ -207,12 +207,12 @@ public: void flipRow (int row) { - if (const ModuleList::Module* const m = list.modules [row]) + if (const AvailableModuleList::Module* const m = list.modules [row]) owner->setEnabled (m, ! owner->isEnabled (m)); } private: - ModuleList& list; + AvailableModuleList& list; ModulesPanel* owner; }; @@ -220,7 +220,7 @@ public: class ModuleSettingsPanel : public PropertyPanel { public: - ModuleSettingsPanel (Project& p, ModuleList& list, const String& modID) + ModuleSettingsPanel (Project& p, AvailableModuleList& list, const String& modID) : project (p), moduleList (list), moduleID (modID) { refreshAll(); @@ -228,7 +228,7 @@ public: void refreshAll() { - setEnabled (project.isModuleEnabled (moduleID)); + setEnabled (project.getModules().isModuleEnabled (moduleID)); clear(); PropertyListBuilder props; @@ -239,20 +239,20 @@ public: { props.add (new ModuleInfoComponent (moduleList, moduleID)); - if (project.isModuleEnabled (moduleID)) + if (project.getModules().isModuleEnabled (moduleID)) { - if (const ModuleList::Module* m = moduleList.findModuleInfo (moduleID)) + if (const AvailableModuleList::Module* m = moduleList.findModuleInfo (moduleID)) if (moduleList.getExtraDependenciesNeeded (project, *m).size() > 0) props.add (new MissingDependenciesComponent (project, moduleList, moduleID)); } - props.add (new BooleanPropertyComponent (project.shouldShowAllModuleFilesInProject (moduleID), + props.add (new BooleanPropertyComponent (project.getModules().shouldShowAllModuleFilesInProject (moduleID), "Add source to project", "Make module files browsable in projects"), "If this is enabled, then the entire source tree from this module will be shown inside your project, " "making it easy to browse/edit the module's classes. If disabled, then only the minimum number of files " "required to compile it will appear inside your project."); - props.add (new BooleanPropertyComponent (project.shouldCopyModuleFilesLocally (moduleID), + props.add (new BooleanPropertyComponent (project.getModules().shouldCopyModuleFilesLocally (moduleID), "Create local copy", "Copy the module into the project folder"), "If this is enabled, then a local copy of the entire module will be made inside your project (in the auto-generated JuceLibraryFiles folder), " "so that your project will be self-contained, and won't need to contain any references to files in other folders. " @@ -286,14 +286,14 @@ public: private: Project& project; - ModuleList& moduleList; + AvailableModuleList& moduleList; String moduleID; //============================================================================== class ModuleInfoComponent : public PropertyComponent { public: - ModuleInfoComponent (ModuleList& list, const String& modID) + ModuleInfoComponent (AvailableModuleList& list, const String& modID) : PropertyComponent ("Module", 100), moduleList (list), moduleID (modID) { } @@ -305,7 +305,7 @@ public: g.setColour (Colours::white.withAlpha (0.4f)); g.fillRect (0, 0, getWidth(), getHeight() - 1); - if (const ModuleList::Module* module = moduleList.findModuleInfo (moduleID)) + if (const AvailableModuleList::Module* module = moduleList.findModuleInfo (moduleID)) { AttributedString s; s.setJustification (Justification::topLeft); @@ -322,7 +322,7 @@ public: } private: - ModuleList& moduleList; + AvailableModuleList& moduleList; String moduleID; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ModuleInfoComponent) @@ -333,12 +333,12 @@ public: public ButtonListener { public: - MissingDependenciesComponent (Project& p, ModuleList& list, const String& modID) + MissingDependenciesComponent (Project& p, AvailableModuleList& list, const String& modID) : PropertyComponent ("Dependencies", 100), project (p), moduleList (list), moduleID (modID), fixButton ("Enable Required Modules") { - if (const ModuleList::Module* module = moduleList.findModuleInfo (moduleID)) + if (const AvailableModuleList::Module* module = moduleList.findModuleInfo (moduleID)) missingDependencies = moduleList.getExtraDependenciesNeeded (project, *module); addAndMakeVisible (&fixButton); @@ -365,10 +365,10 @@ public: void buttonClicked (Button*) { - bool isModuleCopiedLocally = project.shouldCopyModuleFilesLocally (moduleID).getValue(); + bool isModuleCopiedLocally = project.getModules().shouldCopyModuleFilesLocally (moduleID).getValue(); for (int i = missingDependencies.size(); --i >= 0;) - project.addModule (missingDependencies[i], isModuleCopiedLocally); + project.getModules().addModule (missingDependencies[i], isModuleCopiedLocally); if (ModulesPanel* mp = findParentComponentOfClass()) mp->refresh(); @@ -381,7 +381,7 @@ public: private: Project& project; - ModuleList& moduleList; + AvailableModuleList& moduleList; String moduleID; StringArray missingDependencies; TextButton fixButton; @@ -396,7 +396,7 @@ public: public Timer { public: - ModuleCopyingInfo (Project& p, ModuleList& modules) + ModuleCopyingInfo (Project& p, AvailableModuleList& modules) : project (p), list (modules), copyModeButton ("Set Copying Mode...") { @@ -432,7 +432,7 @@ public: "This may create problems if some modules expect to share the same parent folder, so you may " "want to make sure that they are all either copied or not."; - if (project.isAudioPluginModuleMissing()) + if (project.getModules().isAudioPluginModuleMissing()) newName = "Warning! Your project is an audio plugin, but you haven't enabled the 'juce_audio_plugin_client' module!"; if (newName != getName()) @@ -450,9 +450,9 @@ public: { const String moduleID (list.modules.getUnchecked(i)->uid); - if (project.isModuleEnabled (moduleID)) + if (project.getModules().isModuleEnabled (moduleID)) { - if (project.shouldCopyModuleFilesLocally (moduleID).getValue()) + if (project.getModules().shouldCopyModuleFilesLocally (moduleID).getValue()) ++numCopied; else ++numNonCopied; @@ -482,8 +482,8 @@ public: { const String moduleID (list.modules.getUnchecked(i)->uid); - if (project.isModuleEnabled (moduleID)) - project.shouldCopyModuleFilesLocally (moduleID) = copyEnabled; + if (project.getModules().isModuleEnabled (moduleID)) + project.getModules().shouldCopyModuleFilesLocally (moduleID) = copyEnabled; } refresh(); @@ -496,13 +496,13 @@ public: private: Project& project; - ModuleList& list; + AvailableModuleList& list; TextButton copyModeButton; }; private: Project& project; - ModuleList moduleList; + AvailableModuleList moduleList; FilenameComponent modulesLocation; Label modulesLabel; TextButton updateModulesButton; diff --git a/extras/Introjucer/Source/Project/jucer_NewProjectWizard.cpp b/extras/Introjucer/Source/Project/jucer_NewProjectWizard.cpp index bd7ae805bd..cd1b430329 100644 --- a/extras/Introjucer/Source/Project/jucer_NewProjectWizard.cpp +++ b/extras/Introjucer/Source/Project/jucer_NewProjectWizard.cpp @@ -131,7 +131,7 @@ struct NewProjectWizardClasses .withFileExtension (Project::projectFileExtension); ScopedPointer project (new Project (projectFile)); - project->addDefaultModules (true); + project->getModules().addDefaultModules (true); if (failedFiles.size() == 0) { @@ -359,7 +359,7 @@ struct NewProjectWizardClasses File editorHFile = editorCppFile.withFileExtension (".h"); project.getProjectTypeValue() = ProjectType::getAudioPluginTypeName(); - project.addModule ("juce_audio_plugin_client", true); + project.getModules().addModule ("juce_audio_plugin_client", true); Project::Item sourceGroup (createSourceGroup (project)); project.getConfigFlag ("JUCE_QUICKTIME") = Project::configFlagDisabled; // disabled because it interferes with RTAS build on PC @@ -532,7 +532,7 @@ struct NewProjectWizardClasses MainWindow* mw = Component::findParentComponentOfClass(); jassert (mw != nullptr); - ScopedPointer wizard (createWizard()); + ScopedPointer wizard (createWizard()); if (wizard != nullptr) { @@ -623,7 +623,7 @@ struct NewProjectWizardClasses for (int i = 0; i < getNumWizards(); ++i) { - ScopedPointer wiz (createWizardType (i)); + ScopedPointer wiz (createWizardType (i)); s.add (wiz->getName()); } diff --git a/extras/Introjucer/Source/Project/jucer_Project.cpp b/extras/Introjucer/Source/Project/jucer_Project.cpp index 8c3684d440..1fcd985bdd 100644 --- a/extras/Introjucer/Source/Project/jucer_Project.cpp +++ b/extras/Introjucer/Source/Project/jucer_Project.cpp @@ -39,8 +39,6 @@ namespace Tags const Identifier file ("FILE"); const Identifier exporters ("EXPORTFORMATS"); const Identifier configGroup ("JUCEOPTIONS"); - const Identifier modulesGroup ("MODULES"); - const Identifier module ("MODULE"); } const char* Project::projectFileExtension = ".jucer"; @@ -121,8 +119,8 @@ void Project::setMissingDefaultValues() getProjectType().setMissingProjectProperties (*this); - if (! projectRoot.getChildWithName (Tags::modulesGroup).isValid()) - addDefaultModules (false); + if (! projectRoot.getChildWithName (EnabledModuleList::modulesGroupTag).isValid()) + getModules().addDefaultModules (false); if (getBundleIdentifier().toString().isEmpty()) getBundleIdentifier() = getDefaultBundleIdentifier(); @@ -191,34 +189,6 @@ void Project::removeDefunctExporters() } } -void Project::addDefaultModules (bool shouldCopyFilesLocally) -{ - addModule ("juce_core", shouldCopyFilesLocally); - - if (! isConfigFlagEnabled ("JUCE_ONLY_BUILD_CORE_LIBRARY")) - { - addModule ("juce_events", shouldCopyFilesLocally); - addModule ("juce_graphics", shouldCopyFilesLocally); - addModule ("juce_data_structures", shouldCopyFilesLocally); - addModule ("juce_gui_basics", shouldCopyFilesLocally); - addModule ("juce_gui_extra", shouldCopyFilesLocally); - addModule ("juce_gui_audio", shouldCopyFilesLocally); - addModule ("juce_cryptography", shouldCopyFilesLocally); - addModule ("juce_video", shouldCopyFilesLocally); - addModule ("juce_opengl", shouldCopyFilesLocally); - addModule ("juce_audio_basics", shouldCopyFilesLocally); - addModule ("juce_audio_devices", shouldCopyFilesLocally); - addModule ("juce_audio_formats", shouldCopyFilesLocally); - addModule ("juce_audio_processors", shouldCopyFilesLocally); - } -} - -bool Project::isAudioPluginModuleMissing() const -{ - return getProjectType().isAudioPlugin() - && ! isModuleEnabled ("juce_audio_plugin_client"); -} - File Project::getBinaryDataCppFile (int index) const { const File cpp (getGeneratedCodeFolder().getChildFile ("BinaryData.cpp")); @@ -891,75 +861,9 @@ void Project::sanitiseConfigFlags() } //============================================================================== -ValueTree Project::getModulesNode() +EnabledModuleList Project::getModules() { - return projectRoot.getOrCreateChildWithName (Tags::modulesGroup, nullptr); -} - -bool Project::isModuleEnabled (const String& moduleID) const -{ - ValueTree modules (projectRoot.getChildWithName (Tags::modulesGroup)); - - for (int i = 0; i < modules.getNumChildren(); ++i) - if (modules.getChild(i) [Ids::ID] == moduleID) - return true; - - return false; -} - -Value Project::shouldShowAllModuleFilesInProject (const String& moduleID) -{ - return getModulesNode().getChildWithProperty (Ids::ID, moduleID) - .getPropertyAsValue (Ids::showAllCode, getUndoManagerFor (getModulesNode())); -} - -Value Project::shouldCopyModuleFilesLocally (const String& moduleID) -{ - return getModulesNode().getChildWithProperty (Ids::ID, moduleID) - .getPropertyAsValue (Ids::useLocalCopy, getUndoManagerFor (getModulesNode())); -} - -void Project::addModule (const String& moduleID, bool shouldCopyFilesLocally) -{ - if (! isModuleEnabled (moduleID)) - { - ValueTree module (Tags::module); - module.setProperty (Ids::ID, moduleID, nullptr); - - ValueTree modules (getModulesNode()); - modules.addChild (module, -1, getUndoManagerFor (modules)); - - shouldShowAllModuleFilesInProject (moduleID) = true; - } - - if (shouldCopyFilesLocally) - shouldCopyModuleFilesLocally (moduleID) = true; -} - -void Project::removeModule (const String& moduleID) -{ - ValueTree modules (getModulesNode()); - - for (int i = 0; i < modules.getNumChildren(); ++i) - if (modules.getChild(i) [Ids::ID] == moduleID) - modules.removeChild (i, getUndoManagerFor (modules)); -} - -void Project::createRequiredModules (const ModuleList& availableModules, OwnedArray& modules) const -{ - for (int i = 0; i < availableModules.modules.size(); ++i) - if (isModuleEnabled (availableModules.modules.getUnchecked(i)->uid)) - modules.add (availableModules.modules.getUnchecked(i)->create()); -} - -int Project::getNumModules() const -{ - return projectRoot.getChildWithName (Tags::modulesGroup).getNumChildren(); -} - -String Project::getModuleID (int index) const -{ - return projectRoot.getChildWithName (Tags::modulesGroup).getChild (index) [Ids::ID].toString(); + return EnabledModuleList (*this, projectRoot.getOrCreateChildWithName (EnabledModuleList::modulesGroupTag, nullptr)); } //============================================================================== diff --git a/extras/Introjucer/Source/Project/jucer_Project.h b/extras/Introjucer/Source/Project/jucer_Project.h index d995154ab9..3b389cac01 100644 --- a/extras/Introjucer/Source/Project/jucer_Project.h +++ b/extras/Introjucer/Source/Project/jucer_Project.h @@ -28,8 +28,9 @@ #include "../jucer_Headers.h" class ProjectExporter; class ProjectType; -class ModuleList; +class AvailableModuleList; class LibraryModule; +class EnabledModuleList; //============================================================================== class Project : public FileBasedDocument, @@ -242,19 +243,7 @@ public: bool isConfigFlagEnabled (const String& name) const; //============================================================================== - bool isModuleEnabled (const String& moduleID) const; - Value shouldShowAllModuleFilesInProject (const String& moduleID); - Value shouldCopyModuleFilesLocally (const String& moduleID); - - void addModule (const String& moduleID, bool shouldCopyFilesLocally); - void removeModule (const String& moduleID); - int getNumModules() const; - String getModuleID (int index) const; - - void addDefaultModules (bool shouldCopyFilesLocally); - bool isAudioPluginModuleMissing() const; - - void createRequiredModules (const ModuleList& availableModules, OwnedArray& modules) const; + EnabledModuleList getModules(); //============================================================================== String getFileTemplate (const String& templateName); @@ -284,7 +273,6 @@ private: void setMissingDefaultValues(); ValueTree getConfigurations() const; ValueTree getConfigNode(); - ValueTree getModulesNode(); void updateOldStyleConfigList(); void moveOldPropertyFromProjectToAllExporters (Identifier name); diff --git a/extras/Introjucer/Source/Utility/jucer_TranslationTool.h b/extras/Introjucer/Source/Utility/jucer_TranslationTool.h index 36232a58ad..f731705e18 100644 --- a/extras/Introjucer/Source/Utility/jucer_TranslationTool.h +++ b/extras/Introjucer/Source/Utility/jucer_TranslationTool.h @@ -170,12 +170,12 @@ struct TranslationHelpers { scanFilesForTranslations (strings, project.getMainGroup()); - const File modulesFolder (ModuleList::getDefaultModulesFolder (&project)); + const File modulesFolder (AvailableModuleList::getDefaultModulesFolder (&project)); OwnedArray modules; - ModuleList moduleList; + AvailableModuleList moduleList; moduleList.rescan (modulesFolder); - project.createRequiredModules (moduleList, modules); + project.getModules().createRequiredModules (moduleList, modules); for (int j = 0; j < modules.size(); ++j) {