| @@ -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; | |||
| } | |||
| @@ -58,7 +58,7 @@ MainWindow::MainWindow() | |||
| { | |||
| commandManager->getKeyMappings()->resetToDefaultMappings(); | |||
| ScopedPointer <XmlElement> keys (getAppProperties().getXmlValue ("keyMappings")); | |||
| ScopedPointer <XmlElement> 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); | |||
| } | |||
| @@ -77,15 +77,7 @@ public: | |||
| private: | |||
| ScopedPointer <Project> 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); | |||
| @@ -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() | |||
| { | |||
| @@ -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 | |||
| @@ -966,3 +966,8 @@ bool Project::ExporterIterator::next() | |||
| return true; | |||
| } | |||
| PropertiesFile& Project::getStoredProperties() const | |||
| { | |||
| return getAppSettings().getProjectProperties (getProjectUID()); | |||
| } | |||
| @@ -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); | |||
| @@ -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<XmlElement> 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<XmlElement> xml (getAppProperties().getXmlValue ("lastDocs_" + project->getProjectUID())); | |||
| ScopedPointer<XmlElement> xml (project->getStoredProperties().getXmlValue ("lastDocs")); | |||
| if (xml != nullptr) | |||
| { | |||
| @@ -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<XmlElement> treeOpenness (project->getStoredProperties() | |||
| .getXmlValue (opennessStateKey)); | |||
| if (treeOpenness != nullptr) | |||
| { | |||
| tree.restoreOpennessState (*treeOpenness, true); | |||
| for (int i = tree.getNumSelectedItems(); --i >= 0;) | |||
| { | |||
| JucerTreeViewBase* item = dynamic_cast<JucerTreeViewBase*> (tree.getSelectedItem (i)); | |||
| if (item != nullptr) | |||
| item->cancelDelayedSelectionTimer(); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| void TreePanelBase::saveOpenness() | |||
| { | |||
| if (project != nullptr) | |||
| { | |||
| const ScopedPointer<XmlElement> opennessState (tree.getOpennessState (true)); | |||
| if (opennessState != nullptr) | |||
| project->getStoredProperties().setValue (opennessStateKey, opennessState); | |||
| else | |||
| project->getStoredProperties().removeValue (opennessStateKey); | |||
| } | |||
| } | |||
| //============================================================================== | |||
| JucerTreeViewBase::JucerTreeViewBase() | |||
| : textX (0) | |||
| @@ -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<XmlElement> treeOpenness (getAppProperties().getXmlValue (opennessStateKey)); | |||
| if (treeOpenness != nullptr) | |||
| { | |||
| tree.restoreOpennessState (*treeOpenness, true); | |||
| for (int i = tree.getNumSelectedItems(); --i >= 0;) | |||
| { | |||
| JucerTreeViewBase* item = dynamic_cast<JucerTreeViewBase*> (tree.getSelectedItem (i)); | |||
| if (item != nullptr) | |||
| item->cancelDelayedSelectionTimer(); | |||
| } | |||
| } | |||
| } | |||
| void saveOpenness() | |||
| { | |||
| const ScopedPointer<XmlElement> 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<int> (0, 2, getWidth() - 2, getHeight() - 2); | |||
| } | |||
| const Project* project; | |||
| TreeView tree; | |||
| ScopedPointer<JucerTreeViewBase> rootItem; | |||
| @@ -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() | |||
| @@ -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<XmlElement> 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<XmlElement> xml (props->getXmlValue ("editorColours")); | |||
| ScopedPointer<XmlElement> xml (getGlobalProperties().getXmlValue ("editorColours")); | |||
| if (xml == nullptr) | |||
| xml = XmlDocument::parse (BinaryData::colourscheme_dark_xml); | |||
| @@ -118,10 +136,10 @@ void StoredSettings::reload() | |||
| loadSwatchColours(); | |||
| } | |||
| Array<File> StoredSettings::getLastProjects() const | |||
| Array<File> StoredSettings::getLastProjects() | |||
| { | |||
| StringArray s; | |||
| s.addTokens (props->getValue ("lastProjects"), "|", ""); | |||
| s.addTokens (getGlobalProperties().getValue ("lastProjects"), "|", ""); | |||
| Array<File> f; | |||
| for (int i = 0; i < s.size(); ++i) | |||
| @@ -136,7 +154,7 @@ void StoredSettings::setLastProjects (const Array<File>& 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 | |||
| @@ -38,14 +38,16 @@ public: | |||
| void initialise(); | |||
| PropertiesFile& getProps(); | |||
| PropertiesFile& getGlobalProperties(); | |||
| PropertiesFile& getProjectProperties (const String& projectUID); | |||
| void flush(); | |||
| void reload(); | |||
| //============================================================================== | |||
| RecentlyOpenedFilesList recentFiles; | |||
| Array<File> getLastProjects() const; | |||
| Array<File> getLastProjects(); | |||
| void setLastProjects (const Array<File>& files); | |||
| //============================================================================== | |||
| @@ -67,7 +69,7 @@ public: | |||
| StringArray monospacedFontNames; | |||
| private: | |||
| ScopedPointer<PropertiesFile> props; | |||
| OwnedArray<PropertiesFile> propertyFiles; | |||
| void loadSwatchColours(); | |||
| @@ -75,7 +77,7 @@ private: | |||
| }; | |||
| StoredSettings& getAppSettings(); | |||
| PropertiesFile& getAppProperties(); | |||
| PropertiesFile& getGlobalProperties(); | |||
| #endif // __JUCER_STOREDSETTINGS_JUCEHEADER__ | |||