From aef6a296e0073d1a4ac4dbcf4bc106e3c60b115f Mon Sep 17 00:00:00 2001 From: ed Date: Mon, 3 Jul 2017 16:13:37 +0100 Subject: [PATCH] Projucer: Fixed a crash that occurred when adding missing module dependencies --- .../Source/Project/jucer_ConfigTree_Modules.h | 119 +++++++++++------- 1 file changed, 75 insertions(+), 44 deletions(-) diff --git a/extras/Projucer/Source/Project/jucer_ConfigTree_Modules.h b/extras/Projucer/Source/Project/jucer_ConfigTree_Modules.h index dc49c8948e..27990dcecc 100644 --- a/extras/Projucer/Source/Project/jucer_ConfigTree_Modules.h +++ b/extras/Projucer/Source/Project/jucer_ConfigTree_Modules.h @@ -35,20 +35,14 @@ public: bool canBeSelected() const override { return true; } bool mightContainSubItems() override { return false; } String getUniqueName() const override { return "module_" + moduleID; } - - String getDisplayName() const override - { - auto versionNum = project.getModules().getModuleInfo (moduleID).getVersion(); - return moduleID + (versionNum != ProjucerApplication::getApp().getApplicationVersion() ? String (" (" + versionNum + ")") : ""); - } - + String getDisplayName() const override { return moduleID; } String getRenamingName() const override { return getDisplayName(); } void setName (const String&) override {} bool isMissing() const override { return hasMissingDependencies(); } void showDocument() override { - showSettingsPage (new ModuleSettingsPanel (project, moduleID, *this)); + showSettingsPage (new ModuleSettingsPanel (project, moduleID, getOwnerView())); } void deleteItem() override @@ -104,10 +98,12 @@ private: private Value::Listener { public: - ModuleSettingsPanel (Project& p, const String& modID, ModuleItem& o) + ModuleSettingsPanel (Project& p, const String& modID, TreeView* tree) : group (p.getModules().getModuleInfo (modID).getID(), Icon (getIcons().singleModule, Colours::transparentBlack)), - project (p), owner (o), moduleID (modID) + project (p), + modulesTree (tree), + moduleID (modID) { defaultJuceModulePathValue.referTo (getAppSettings().getStoredPath (Ids::defaultJuceModulePath)); defaultUserModulePathValue.referTo (getAppSettings().getStoredPath (Ids::defaultUserModulePath)); @@ -144,7 +140,7 @@ private: key, exporter->getTargetOSForExporter()))); auto* pathComponent = new DependencyFilePathPropertyComponent (src, "Path for " + exporter->getName().quoted(), - true, "*", project.getProjectFolder()); + true, "*", project.getProjectFolder()); props.add (pathComponent, "A path to the folder that contains the " + moduleID + " module when compiling the " @@ -154,6 +150,7 @@ private: "is empty then the global path will be used."); pathComponent->setEnabled (! isUsingGlobalPathValue.getValue()); + pathComponent->getValue().addListener (this); } globalPathValue.referTo (isUsingGlobalPathValue); @@ -218,7 +215,7 @@ private: private: PropertyGroupComponent group; Project& project; - ModuleItem& owner; + SafePointer modulesTree; String moduleID; Value globalPathValue; Value defaultJuceModulePathValue, defaultUserModulePathValue; @@ -241,8 +238,6 @@ private: if (auto* moduleInfo = dynamic_cast (group.properties.getUnchecked (0))) moduleInfo->refresh(); - - owner.treeHasChanged(); } //============================================================================== @@ -344,21 +339,26 @@ private: list.scanGlobalJuceModulePath(); if (! tryToFix (list)) + { list.scanGlobalUserModulePath(); - if (! tryToFix (list)) - list.scanProjectExporterModulePaths (project); + if (! tryToFix (list)) + { + list.scanProjectExporterModulePaths (project); - bool fixed = tryToFix (list); + if (! tryToFix (list)) + { + AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, + "Adding Missing Dependencies", + "Couldn't locate some of these modules - you'll need to find their " + "folders manually and add them to the list."); - if (ModuleSettingsPanel* p = findParentComponentOfClass()) - p->refresh(); + return; + } + } + } - if (! fixed) - AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, - "Adding Missing Dependencies", - "Couldn't locate some of these modules - you'll need to find their " - "folders manually and add them to the list."); + refreshAndReselectItem(); } void resized() override @@ -392,6 +392,32 @@ private: return (missingDependencies.size() == 0); } + void refreshAndReselectItem() + { + if (auto* settingsPanel = findParentComponentOfClass()) + { + if (settingsPanel->modulesTree == nullptr) + return; + + auto* rootItem = settingsPanel->modulesTree->getRootItem(); + + if (rootItem == nullptr) + return; + + for (auto i = 0; i < rootItem->getNumSubItems(); ++i) + { + if (auto* subItem = dynamic_cast (rootItem->getSubItem (i))) + { + if (subItem->getDisplayName() == moduleID) + { + subItem->setSelected (true, true); + return; + } + } + } + } + } + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MissingDependenciesComponent) }; }; @@ -474,28 +500,20 @@ public: PopupMenu knownModules, jucePathModules, userPathModules, exporterPathsModules; auto index = 100; - auto globalJucePathModules = getAvailableModulesInGlobalJucePath(); - for (auto m : globalJucePathModules) + for (auto m : getAvailableModulesInGlobalJucePath()) jucePathModules.addItem (index++, m, ! modules.isModuleEnabled (m)); knownModules.addSubMenu ("Global JUCE modules path", jucePathModules); index = 200; - auto globalUserPathModules = getAvailableModulesInGlobalUserPath(); for (auto m : getAvailableModulesInGlobalUserPath()) - { - if (! globalJucePathModules.contains (m)) - userPathModules.addItem (index++, m, ! modules.isModuleEnabled (m)); - } + userPathModules.addItem (index++, m, ! modules.isModuleEnabled (m)); knownModules.addSubMenu ("Global user modules path", userPathModules); index = 300; for (auto m : getAvailableModulesInExporterPaths()) - { - if (! globalJucePathModules.contains (m) && ! globalUserPathModules.contains (m)) - exporterPathsModules.addItem (index++, m, ! modules.isModuleEnabled (m)); - } + exporterPathsModules.addItem (index++, m, ! modules.isModuleEnabled (m)); knownModules.addSubMenu ("Exporter paths", exporterPathsModules); @@ -526,14 +544,6 @@ public: } } - StringArray getAvailableModulesInExporterPaths() - { - ModuleList list; - list.scanProjectExporterModulePaths (project); - - return list.getIDs(); - } - StringArray getAvailableModulesInGlobalJucePath() { ModuleList list; @@ -554,7 +564,28 @@ public: list.addAllModulesInFolder (f); } - return list.getIDs(); + auto ids = list.getIDs(); + + for (auto m : getAvailableModulesInGlobalJucePath()) + ids.removeString (m); + + return ids; + } + + StringArray getAvailableModulesInExporterPaths() + { + ModuleList list; + list.scanProjectExporterModulePaths (project); + + auto ids = list.getIDs(); + + for (auto m : getAvailableModulesInGlobalJucePath()) + ids.removeString (m); + + for (auto m : getAvailableModulesInGlobalUserPath()) + ids.removeString (m); + + return ids; } //==============================================================================