diff --git a/extras/Introjucer/Source/Application/jucer_AppearanceSettings.cpp b/extras/Introjucer/Source/Application/jucer_AppearanceSettings.cpp index 97c22baebd..c694659847 100644 --- a/extras/Introjucer/Source/Application/jucer_AppearanceSettings.cpp +++ b/extras/Introjucer/Source/Application/jucer_AppearanceSettings.cpp @@ -79,7 +79,7 @@ AppearanceSettings::AppearanceSettings (bool updateAppWhenChanged) File AppearanceSettings::getSchemesFolder() { - File f (getAppProperties().getFile().getSiblingFile ("Schemes")); + File f (getGlobalProperties().getFile().getSiblingFile ("Schemes")); f.createDirectory(); return f; } diff --git a/extras/Introjucer/Source/Application/jucer_MainWindow.cpp b/extras/Introjucer/Source/Application/jucer_MainWindow.cpp index 07e1d31266..4d5e204a53 100644 --- a/extras/Introjucer/Source/Application/jucer_MainWindow.cpp +++ b/extras/Introjucer/Source/Application/jucer_MainWindow.cpp @@ -58,7 +58,7 @@ MainWindow::MainWindow() { commandManager->getKeyMappings()->resetToDefaultMappings(); - ScopedPointer keys (getAppProperties().getXmlValue ("keyMappings")); + ScopedPointer keys (getGlobalProperties().getXmlValue ("keyMappings")); if (keys != nullptr) commandManager->getKeyMappings()->restoreFromXml (*keys); @@ -82,7 +82,7 @@ MainWindow::~MainWindow() removeKeyListener (commandManager->getKeyMappings()); // save the current size and position to our settings file.. - getAppProperties().setValue ("lastMainWindowPos", getWindowStateAsString()); + getGlobalProperties().setValue ("lastMainWindowPos", getWindowStateAsString()); clearContentComponent(); currentProject = nullptr; @@ -125,7 +125,7 @@ bool MainWindow::closeProject (Project* project) if (project == nullptr) return true; - getAppProperties().setValue (getProjectWindowPosName(), getWindowStateAsString()); + project->getStoredProperties().setValue (getProjectWindowPosName(), getWindowStateAsString()); ProjectContentComponent* const pcc = getProjectContentComponent(); @@ -169,10 +169,10 @@ void MainWindow::restoreWindowPosition() String windowState; if (currentProject != nullptr) - windowState = getAppProperties().getValue (getProjectWindowPosName()); + windowState = currentProject->getStoredProperties().getValue (getProjectWindowPosName()); if (windowState.isEmpty()) - windowState = getAppProperties().getValue ("lastMainWindowPos"); + windowState = getGlobalProperties().getValue ("lastMainWindowPos"); restoreWindowStateFromString (windowState); } diff --git a/extras/Introjucer/Source/Application/jucer_MainWindow.h b/extras/Introjucer/Source/Application/jucer_MainWindow.h index 3bdf09dfe2..0ae0c1fb5b 100644 --- a/extras/Introjucer/Source/Application/jucer_MainWindow.h +++ b/extras/Introjucer/Source/Application/jucer_MainWindow.h @@ -77,15 +77,7 @@ public: private: ScopedPointer currentProject; - String getProjectWindowPosName() const - { - jassert (currentProject != nullptr); - if (currentProject == nullptr) - return String::empty; - - return "projectWindowPos_" + currentProject->getProjectUID(); - } - + static const char* getProjectWindowPosName() { return "projectWindowPos"; } void createProjectContentCompIfNeeded(); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainWindow); diff --git a/extras/Introjucer/Source/Project/jucer_ConfigPage.cpp b/extras/Introjucer/Source/Project/jucer_ConfigPage.cpp index cd998220d3..d9075ac328 100644 --- a/extras/Introjucer/Source/Project/jucer_ConfigPage.cpp +++ b/extras/Introjucer/Source/Project/jucer_ConfigPage.cpp @@ -70,7 +70,7 @@ namespace ProjectSettingsTreeClasses bool isMissing() { return false; } bool canBeSelected() const { return true; } bool mightContainSubItems() { return false; } - String getUniqueName() const { return config->project.getProjectUID() + "_config_" + config->getName(); } + String getUniqueName() const { return "config_" + config->getName(); } String getRenamingName() const { return getDisplayName(); } String getDisplayName() const { return config->getName(); } void setName (const String&) {} @@ -170,7 +170,7 @@ namespace ProjectSettingsTreeClasses bool canBeSelected() const { return true; } bool mightContainSubItems() { return exporter->getNumConfigurations() > 0; } - String getUniqueName() const { return project.getProjectUID() + "_exporter_" + String (exporterIndex); } + String getUniqueName() const { return "exporter_" + String (exporterIndex); } String getRenamingName() const { return getDisplayName(); } String getDisplayName() const { return exporter->getName(); } void setName (const String&) {} @@ -292,7 +292,7 @@ namespace ProjectSettingsTreeClasses bool canBeSelected() const { return true; } bool mightContainSubItems() { return false; } - String getUniqueName() const { return project.getProjectUID() + "_modules"; } + String getUniqueName() const { return "modules"; } String getRenamingName() const { return getDisplayName(); } String getDisplayName() const { return "Modules"; } void setName (const String&) {} @@ -353,7 +353,7 @@ namespace ProjectSettingsTreeClasses void showDocument() { showSettingsPage (new SettingsComp (project)); } bool canBeSelected() const { return true; } bool mightContainSubItems() { return project.getNumExporters() > 0; } - String getUniqueName() const { return project.getProjectUID() + "_config_root"; } + String getUniqueName() const { return "config_root"; } void addSubItems() { diff --git a/extras/Introjucer/Source/Project/jucer_Module.cpp b/extras/Introjucer/Source/Project/jucer_Module.cpp index 5e053577f1..1e44ec3705 100644 --- a/extras/Introjucer/Source/Project/jucer_Module.cpp +++ b/extras/Introjucer/Source/Project/jucer_Module.cpp @@ -146,7 +146,7 @@ File ModuleList::getLocalModulesFolder (Project* project) { File defaultJuceFolder (getDefaultModulesFolder (project)); - File f (getAppProperties().getValue ("lastJuceFolder", defaultJuceFolder.getFullPathName())); + File f (getGlobalProperties().getValue ("lastJuceFolder", defaultJuceFolder.getFullPathName())); f = getModulesFolderForJuceOrModulesFolder (f); if ((! ModuleList::isModulesFolder (f)) && ModuleList::isModulesFolder (defaultJuceFolder)) @@ -163,7 +163,7 @@ File ModuleList::getModuleFolder (const String& uid) const void ModuleList::setLocalModulesFolder (const File& file) { //jassert (FileHelpers::isJuceFolder (file)); - getAppProperties().setValue ("lastJuceFolder", file.getFullPathName()); + getGlobalProperties().setValue ("lastJuceFolder", file.getFullPathName()); } struct ModuleSorter diff --git a/extras/Introjucer/Source/Project/jucer_Project.cpp b/extras/Introjucer/Source/Project/jucer_Project.cpp index ec991feadc..01576d3a2f 100644 --- a/extras/Introjucer/Source/Project/jucer_Project.cpp +++ b/extras/Introjucer/Source/Project/jucer_Project.cpp @@ -966,3 +966,8 @@ bool Project::ExporterIterator::next() return true; } + +PropertiesFile& Project::getStoredProperties() const +{ + return getAppSettings().getProjectProperties (getProjectUID()); +} diff --git a/extras/Introjucer/Source/Project/jucer_Project.h b/extras/Introjucer/Source/Project/jucer_Project.h index 12c2bd44e6..92332c7cee 100644 --- a/extras/Introjucer/Source/Project/jucer_Project.h +++ b/extras/Introjucer/Source/Project/jucer_Project.h @@ -253,6 +253,9 @@ public: //============================================================================== String getFileTemplate (const String& templateName); + //============================================================================== + PropertiesFile& getStoredProperties() const; + //============================================================================== void valueTreePropertyChanged (ValueTree& tree, const Identifier& property); void valueTreeChildAdded (ValueTree& parentTree, ValueTree& childWhichHasBeenAdded); diff --git a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp index 73bdb4467c..9490e1a8e6 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp @@ -37,7 +37,7 @@ class FileTreeTab : public TreePanelBase { public: FileTreeTab (Project& project) - : TreePanelBase ("treeViewState_" + project.getProjectUID()) + : TreePanelBase (&project, "fileTreeState") { tree.setMultiSelectEnabled (true); setRoot (new GroupTreeViewItem (project.getMainGroup())); @@ -49,7 +49,7 @@ class ConfigTreeTab : public TreePanelBase { public: ConfigTreeTab (Project& project) - : TreePanelBase ("settingsTreeViewState_" + project.getProjectUID()) + : TreePanelBase (&project, "settingsTreeState") { tree.setMultiSelectEnabled (false); setRoot (createProjectConfigTreeViewRoot (project)); @@ -189,8 +189,6 @@ void ProjectContentComponent::setProject (Project* newProject) { if (project != newProject) { - PropertiesFile& settings = getAppProperties(); - if (project != nullptr) project->removeChangeListener (this); @@ -199,10 +197,12 @@ void ProjectContentComponent::setProject (Project* newProject) if (project != nullptr && treeViewTabs.isShowing()) { + PropertiesFile& settings = project->getStoredProperties(); + if (treeViewTabs.getWidth() > 0) - settings.setValue ("projectTreeviewWidth_" + project->getProjectUID(), treeViewTabs.getWidth()); + settings.setValue ("projectPanelWidth", treeViewTabs.getWidth()); - settings.setValue ("lastTab_" + project->getProjectUID(), treeViewTabs.getCurrentTabName()); + settings.setValue ("lastTab", treeViewTabs.getCurrentTabName()); } treeViewTabs.clearTabs(); @@ -214,7 +214,9 @@ void ProjectContentComponent::setProject (Project* newProject) createProjectTabs(); - const String lastTabName (settings.getValue ("lastTab_" + project->getProjectUID())); + PropertiesFile& settings = project->getStoredProperties(); + + const String lastTabName (settings.getValue ("lastTab")); int lastTabIndex = treeViewTabs.getTabNames().indexOf (lastTabName); if (lastTabIndex < 0 || lastTabIndex > treeViewTabs.getNumTabs()) @@ -222,7 +224,7 @@ void ProjectContentComponent::setProject (Project* newProject) treeViewTabs.setCurrentTabIndex (lastTabIndex); - int lastTreeWidth = settings.getValue ("projectTreeviewWidth_" + project->getProjectUID()).getIntValue(); + int lastTreeWidth = settings.getValue ("projectPanelWidth").getIntValue(); if (lastTreeWidth < 150) lastTreeWidth = 240; @@ -283,7 +285,7 @@ void ProjectContentComponent::saveOpenDocumentList() ScopedPointer xml (recentDocumentList.createXML()); if (xml != nullptr) - getAppProperties().setValue ("lastDocs_" + project->getProjectUID(), xml); + project->getStoredProperties().setValue ("lastDocs", xml); } } @@ -291,7 +293,7 @@ void ProjectContentComponent::reloadLastOpenDocuments() { if (project != nullptr) { - ScopedPointer xml (getAppProperties().getXmlValue ("lastDocs_" + project->getProjectUID())); + ScopedPointer xml (project->getStoredProperties().getXmlValue ("lastDocs")); if (xml != nullptr) { diff --git a/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.cpp b/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.cpp index 0399f2ffe7..0b297a83b3 100644 --- a/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.cpp +++ b/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.cpp @@ -27,6 +27,45 @@ #include "../Project/jucer_ProjectContentComponent.h" +//============================================================================== +void TreePanelBase::setRoot (JucerTreeViewBase* root) +{ + rootItem = root; + tree.setRootItem (root); + tree.getRootItem()->setOpen (true); + + if (project != nullptr) + { + const ScopedPointer treeOpenness (project->getStoredProperties() + .getXmlValue (opennessStateKey)); + if (treeOpenness != nullptr) + { + tree.restoreOpennessState (*treeOpenness, true); + + for (int i = tree.getNumSelectedItems(); --i >= 0;) + { + JucerTreeViewBase* item = dynamic_cast (tree.getSelectedItem (i)); + + if (item != nullptr) + item->cancelDelayedSelectionTimer(); + } + } + } +} + +void TreePanelBase::saveOpenness() +{ + if (project != nullptr) + { + const ScopedPointer opennessState (tree.getOpennessState (true)); + + if (opennessState != nullptr) + project->getStoredProperties().setValue (opennessStateKey, opennessState); + else + project->getStoredProperties().removeValue (opennessStateKey); + } +} + //============================================================================== JucerTreeViewBase::JucerTreeViewBase() : textX (0) diff --git a/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h b/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h index 7b3f631253..f6675e5deb 100644 --- a/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h +++ b/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h @@ -28,7 +28,7 @@ #include "../jucer_Headers.h" class ProjectContentComponent; - +class Project; //============================================================================== class JucerTreeViewBase : public TreeViewItem @@ -109,8 +109,8 @@ private: class TreePanelBase : public Component { public: - TreePanelBase (const String& opennessStateKey_) - : opennessStateKey (opennessStateKey_) + TreePanelBase (const Project* p, const String& treeviewID) + : project (p), opennessStateKey (treeviewID) { addAndMakeVisible (&tree); tree.setRootItemVisible (true); @@ -125,34 +125,8 @@ public: tree.setRootItem (nullptr); } - void setRoot (JucerTreeViewBase* root) - { - rootItem = root; - tree.setRootItem (root); - tree.getRootItem()->setOpen (true); - - const ScopedPointer treeOpenness (getAppProperties().getXmlValue (opennessStateKey)); - if (treeOpenness != nullptr) - { - tree.restoreOpennessState (*treeOpenness, true); - - for (int i = tree.getNumSelectedItems(); --i >= 0;) - { - JucerTreeViewBase* item = dynamic_cast (tree.getSelectedItem (i)); - - if (item != nullptr) - item->cancelDelayedSelectionTimer(); - } - } - } - - void saveOpenness() - { - const ScopedPointer opennessState (tree.getOpennessState (true)); - - if (opennessState != nullptr) - getAppProperties().setValue (opennessStateKey, opennessState); - } + void setRoot (JucerTreeViewBase* root); + void saveOpenness(); void deleteSelectedItems() { @@ -194,6 +168,7 @@ public: return Rectangle (0, 2, getWidth() - 2, getHeight() - 2); } + const Project* project; TreeView tree; ScopedPointer rootItem; diff --git a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h index 17d69e8913..dc3f4ace31 100644 --- a/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h +++ b/extras/Introjucer/Source/Utility/jucer_MiscUtilities.h @@ -189,7 +189,7 @@ public: setResizeLimits (minW, minH, maxW, maxH); setContentOwned (content, false); - const String windowState (getAppProperties().getValue (windowPosProperty)); + const String windowState (getGlobalProperties().getValue (windowPosProperty)); if (windowState.isNotEmpty()) restoreWindowStateFromString (windowState); @@ -202,7 +202,7 @@ public: ~FloatingToolWindow() { - getAppProperties().setValue (windowPosProperty, getWindowStateAsString()); + getGlobalProperties().setValue (windowPosProperty, getWindowStateAsString()); } void closeButtonPressed() diff --git a/extras/Introjucer/Source/Utility/jucer_StoredSettings.cpp b/extras/Introjucer/Source/Utility/jucer_StoredSettings.cpp index 6d8adaedb3..80f97198c9 100644 --- a/extras/Introjucer/Source/Utility/jucer_StoredSettings.cpp +++ b/extras/Introjucer/Source/Utility/jucer_StoredSettings.cpp @@ -33,9 +33,9 @@ StoredSettings& getAppSettings() return *JucerApplication::getApp().settings; } -PropertiesFile& getAppProperties() +PropertiesFile& getGlobalProperties() { - return getAppSettings().getProps(); + return getAppSettings().getGlobalProperties(); } //============================================================================== @@ -54,16 +54,48 @@ void StoredSettings::initialise() reload(); } -PropertiesFile& StoredSettings::getProps() +PropertiesFile& StoredSettings::getGlobalProperties() { - jassert (props != nullptr); - return *props; + return *propertyFiles.getUnchecked (0); +} + +static PropertiesFile* createPropsFile (const String& filename) +{ + PropertiesFile::Options options; + options.applicationName = filename; + options.filenameSuffix = "settings"; + options.osxLibrarySubFolder = "Application Support"; + #if JUCE_LINUX + options.folderName = ".introjucer"; + #else + options.folderName = "Introjucer"; + #endif + + return new PropertiesFile (options); +} + +PropertiesFile& StoredSettings::getProjectProperties (const String& projectUID) +{ + const String filename ("Introjucer_Project_" + projectUID); + + for (int i = propertyFiles.size(); --i >= 0;) + { + PropertiesFile* const props = propertyFiles.getUnchecked(i); + if (props->getFile().getFileNameWithoutExtension() == filename) + return *props; + } + + PropertiesFile* p = createPropsFile (filename); + propertyFiles.add (p); + return *p; } void StoredSettings::flush() { - if (props != nullptr) + for (int i = propertyFiles.size(); --i >= 0;) { + PropertiesFile* const props = propertyFiles.getUnchecked(i); + { const ScopedPointer xml (appearance.settings.createXml()); props->setValue ("editorColours", xml); @@ -87,28 +119,14 @@ void StoredSettings::flush() void StoredSettings::reload() { - props = nullptr; - - { - // These settings are used in defining the properties file's location. - PropertiesFile::Options options; - options.applicationName = "Introjucer"; - options.filenameSuffix = "settings"; - options.osxLibrarySubFolder = "Application Support"; - #if JUCE_LINUX - options.folderName = ".introjucer"; - #else - options.folderName = "Introjucer"; - #endif - - props = new PropertiesFile (options); - } + propertyFiles.clear(); + propertyFiles.add (createPropsFile ("Introjucer")); // recent files... - recentFiles.restoreFromString (props->getValue ("recentFiles")); + recentFiles.restoreFromString (getGlobalProperties().getValue ("recentFiles")); recentFiles.removeNonExistentFiles(); - ScopedPointer xml (props->getXmlValue ("editorColours")); + ScopedPointer xml (getGlobalProperties().getXmlValue ("editorColours")); if (xml == nullptr) xml = XmlDocument::parse (BinaryData::colourscheme_dark_xml); @@ -118,10 +136,10 @@ void StoredSettings::reload() loadSwatchColours(); } -Array StoredSettings::getLastProjects() const +Array StoredSettings::getLastProjects() { StringArray s; - s.addTokens (props->getValue ("lastProjects"), "|", ""); + s.addTokens (getGlobalProperties().getValue ("lastProjects"), "|", ""); Array f; for (int i = 0; i < s.size(); ++i) @@ -136,7 +154,7 @@ void StoredSettings::setLastProjects (const Array& files) for (int i = 0; i < files.size(); ++i) s.add (files.getReference(i).getFullPathName()); - props->setValue ("lastProjects", s.joinIntoString ("|")); + getGlobalProperties().setValue ("lastProjects", s.joinIntoString ("|")); } //============================================================================== @@ -155,10 +173,11 @@ void StoredSettings::loadSwatchColours() #undef COL const int numSwatchColours = 24; + PropertiesFile& props = getGlobalProperties(); for (int i = 0; i < numSwatchColours; ++i) - swatchColours.add (Colour::fromString (props->getValue ("swatchColour" + String (i), - colours [2 + i].toString()))); + swatchColours.add (Colour::fromString (props.getValue ("swatchColour" + String (i), + colours [2 + i].toString()))); } int StoredSettings::ColourSelectorWithSwatches::getNumSwatches() const diff --git a/extras/Introjucer/Source/Utility/jucer_StoredSettings.h b/extras/Introjucer/Source/Utility/jucer_StoredSettings.h index 5f8534d3c2..760221ccbd 100644 --- a/extras/Introjucer/Source/Utility/jucer_StoredSettings.h +++ b/extras/Introjucer/Source/Utility/jucer_StoredSettings.h @@ -38,14 +38,16 @@ public: void initialise(); - PropertiesFile& getProps(); + PropertiesFile& getGlobalProperties(); + PropertiesFile& getProjectProperties (const String& projectUID); + void flush(); void reload(); //============================================================================== RecentlyOpenedFilesList recentFiles; - Array getLastProjects() const; + Array getLastProjects(); void setLastProjects (const Array& files); //============================================================================== @@ -67,7 +69,7 @@ public: StringArray monospacedFontNames; private: - ScopedPointer props; + OwnedArray propertyFiles; void loadSwatchColours(); @@ -75,7 +77,7 @@ private: }; StoredSettings& getAppSettings(); -PropertiesFile& getAppProperties(); +PropertiesFile& getGlobalProperties(); #endif // __JUCER_STOREDSETTINGS_JUCEHEADER__