From fad59e53d21a1cd6ba41fa212262f073a1a841e6 Mon Sep 17 00:00:00 2001 From: jules Date: Wed, 8 Feb 2012 09:18:17 +0000 Subject: [PATCH] Introjucer: made treeview remember its openness state. --- .../Source/Application/jucer_MainWindow.cpp | 5 ++ .../Project/jucer_ProjectContentComponent.cpp | 23 +++++- .../Project/jucer_ProjectContentComponent.h | 1 + .../Source/Project/jucer_TreeViewTypes.h | 2 - .../Utility/jucer_JucerTreeViewBase.cpp | 71 +++++++++++-------- .../Source/Utility/jucer_JucerTreeViewBase.h | 12 ++-- 6 files changed, 72 insertions(+), 42 deletions(-) diff --git a/extras/Introjucer/Source/Application/jucer_MainWindow.cpp b/extras/Introjucer/Source/Application/jucer_MainWindow.cpp index 9fcd804e18..1402a837de 100644 --- a/extras/Introjucer/Source/Application/jucer_MainWindow.cpp +++ b/extras/Introjucer/Source/Application/jucer_MainWindow.cpp @@ -139,6 +139,11 @@ bool MainWindow::closeProject (Project* project) if (! OpenDocumentManager::getInstance()->closeAllDocumentsUsingProject (*project, true)) return false; + ProjectContentComponent* const pcc = getProjectContentComponent(); + + if (pcc != nullptr) + pcc->saveTreeViewState(); + FileBasedDocument::SaveResult r = project->saveIfNeededAndUserAgrees(); if (r == FileBasedDocument::savedOk) diff --git a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp index 951ec311cf..295a2f5c56 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.cpp @@ -59,6 +59,8 @@ void ProjectContentComponent::setProject (Project* newProject) { if (project != newProject) { + PropertiesFile& settings = StoredSettings::getInstance()->getProps(); + if (project != nullptr) project->removeChangeListener (this); @@ -67,7 +69,7 @@ void ProjectContentComponent::setProject (Project* newProject) if (projectTree != nullptr) { - StoredSettings::getInstance()->getProps().setValue ("projectTreeviewWidth", projectTree->getWidth()); + settings.setValue ("projectTreeviewWidth", projectTree->getWidth()); projectTree->deleteRootItem(); projectTree = nullptr; } @@ -86,7 +88,7 @@ void ProjectContentComponent::setProject (Project* newProject) projectTree->setRootItem (new GroupTreeViewItem (project->getMainGroup())); projectTree->getRootItem()->setOpen (true); - String lastTreeWidth (StoredSettings::getInstance()->getProps().getValue ("projectTreeviewWidth")); + String lastTreeWidth (settings.getValue ("projectTreeviewWidth")); if (lastTreeWidth.getIntValue() < 150) lastTreeWidth = "250"; @@ -103,10 +105,27 @@ void ProjectContentComponent::setProject (Project* newProject) invokeDirectly (CommandIDs::showProjectSettings, true); updateMissingFileStatuses(); + + const ScopedPointer treeOpenness (settings.getXmlValue ("treeViewState_" + project->getProjectUID())); + + if (treeOpenness != nullptr) + projectTree->restoreOpennessState (*treeOpenness, true); } } } +void ProjectContentComponent::saveTreeViewState() +{ + if (projectTree != nullptr) + { + const ScopedPointer opennessState (projectTree->getOpennessState (true)); + + if (opennessState != nullptr) + StoredSettings::getInstance()->getProps() + .setValue ("treeViewState_" + project->getProjectUID(), opennessState); + } +} + void ProjectContentComponent::changeListenerCallback (ChangeBroadcaster*) { updateMissingFileStatuses(); diff --git a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h index 0fd020f5bc..98cca0af4c 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h +++ b/extras/Introjucer/Source/Project/jucer_ProjectContentComponent.h @@ -45,6 +45,7 @@ public: void paint (Graphics& g); void setProject (Project* project); + void saveTreeViewState(); bool showEditorForFile (const File& f); bool showDocument (OpenDocumentManager::Document* doc); diff --git a/extras/Introjucer/Source/Project/jucer_TreeViewTypes.h b/extras/Introjucer/Source/Project/jucer_TreeViewTypes.h index fc9da30293..c9914a4621 100644 --- a/extras/Introjucer/Source/Project/jucer_TreeViewTypes.h +++ b/extras/Introjucer/Source/Project/jucer_TreeViewTypes.h @@ -39,7 +39,6 @@ public: bool acceptsFileDrop (const StringArray& files) const { return false; } bool acceptsDragItems (const OwnedArray & selectedNodes) { return false; } ProjectTreeViewBase* createSubItem (const Project::Item& child); - void createLeftEdgeComponents (OwnedArray& components) {} void showDocument(); void showPopupMenu(); void handlePopupMenuResult (int resultCode); @@ -60,7 +59,6 @@ public: void checkFileStatus(); void moveSelectedItemsTo (OwnedArray & selectedNodes, int insertIndex); ProjectTreeViewBase* createSubItem (const Project::Item& child); - void createLeftEdgeComponents (OwnedArray& components) {} void showDocument(); void showPopupMenu(); void handlePopupMenuResult (int resultCode); diff --git a/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.cpp b/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.cpp index 2effae3816..c62054dd53 100644 --- a/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.cpp +++ b/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.cpp @@ -28,7 +28,7 @@ //============================================================================== JucerTreeViewBase::JucerTreeViewBase() - : numLeftHandComps (0) + : textX (0) { setLinesDrawnForSubItems (false); } @@ -38,26 +38,10 @@ Font JucerTreeViewBase::getFont() const return Font (getItemHeight() * 0.6f); } -int JucerTreeViewBase::getTextX() const -{ - return (numLeftHandComps + 1) * getItemHeight() + 8; -} - void JucerTreeViewBase::paintItem (Graphics& g, int width, int height) { if (isSelected()) g.fillAll (Colour (0x401111ee)); - - const int x = getTextX(); - - g.setColour (Colours::black); - - getIcon()->drawWithin (g, Rectangle (0.0f, 2.0f, height + 6.0f, height - 4.0f), - RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize, 1.0f); - - g.setFont (getFont()); - g.setColour (isMissing() ? Colours::red : Colours::black); - g.drawFittedText (getDisplayName(), x, 0, width - x, height, Justification::centredLeft, 1, 0.8f); } void JucerTreeViewBase::paintOpenCloseButton (Graphics& g, int width, int height, bool isMouseOver) @@ -74,38 +58,63 @@ void JucerTreeViewBase::paintOpenCloseButton (Graphics& g, int width, int height } //============================================================================== -class TreeLeftHandButtonHolderComponent : public Component +class TreeItemComponent : public Component { public: - TreeLeftHandButtonHolderComponent (OwnedArray& comps) + TreeItemComponent (JucerTreeViewBase& item_) + : item (item_) { - components.swapWithArray (comps); setInterceptsMouseClicks (false, true); - for (int i = 0; i < components.size(); ++i) - addAndMakeVisible (components.getUnchecked(i)); + item.createLeftEdgeComponents (leftComps); + + for (int i = 0; i < leftComps.size(); ++i) + addAndMakeVisible (leftComps.getUnchecked(i)); + + addAndMakeVisible (rightHandComponent = item.createRightEdgeComponent()); + } + + void paint (Graphics& g) + { + g.setColour (Colours::black); + + const int height = getHeight(); + + item.getIcon()->drawWithin (g, Rectangle (0.0f, 2.0f, height + 6.0f, height - 4.0f), + RectanglePlacement::centred | RectanglePlacement::onlyReduceInSize, 1.0f); + + g.setFont (item.getFont()); + g.setColour (item.isMissing() ? Colours::red : Colours::black); + + const int right = rightHandComponent != nullptr ? rightHandComponent->getX() - 2 + : getWidth(); + + g.drawFittedText (item.getDisplayName(), + item.textX, 0, right - item.textX, height, Justification::centredLeft, 1, 0.8f); } void resized() { const int edge = 1; const int itemSize = getHeight() - edge * 2; + item.textX = (leftComps.size() + 1) * getHeight() + 8; - for (int i = 0; i < components.size(); ++i) - components.getUnchecked(i)->setBounds (5 + (i + 1) * getHeight(), edge, itemSize, itemSize); + for (int i = 0; i < leftComps.size(); ++i) + leftComps.getUnchecked(i)->setBounds (5 + (i + 1) * getHeight(), edge, itemSize, itemSize); + + if (rightHandComponent != nullptr) + rightHandComponent->setBounds (getWidth() - itemSize - edge, edge, itemSize, itemSize); } private: - OwnedArray components; + JucerTreeViewBase& item; + OwnedArray leftComps; + ScopedPointer rightHandComponent; }; Component* JucerTreeViewBase::createItemComponent() { - OwnedArray components; - createLeftEdgeComponents (components); - numLeftHandComps = components.size(); - - return numLeftHandComps == 0 ? nullptr : new TreeLeftHandButtonHolderComponent (components); + return new TreeItemComponent (*this); } //============================================================================== @@ -149,7 +158,7 @@ private: void JucerTreeViewBase::showRenameBox() { Rectangle r (getItemPosition (true)); - r.setLeft (r.getX() + getTextX()); + r.setLeft (r.getX() + textX); r.setHeight (getItemHeight()); new RenameTreeItemCallback (*this, *getOwnerView(), r); diff --git a/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h b/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h index 0aba5ef7d3..c473d0638f 100644 --- a/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h +++ b/extras/Introjucer/Source/Utility/jucer_JucerTreeViewBase.h @@ -33,6 +33,8 @@ class JucerTreeViewBase : public TreeViewItem { public: + JucerTreeViewBase(); + int getItemWidth() const { return -1; } int getItemHeight() const { return 20; } @@ -48,7 +50,8 @@ public: virtual void setName (const String& newName) = 0; virtual bool isMissing() = 0; virtual const Drawable* getIcon() const = 0; - virtual void createLeftEdgeComponents (OwnedArray& components) = 0; + virtual void createLeftEdgeComponents (OwnedArray&) {} + virtual Component* createRightEdgeComponent() { return nullptr; } virtual void showPopupMenu(); virtual void showMultiSelectionPopupMenu(); @@ -72,12 +75,7 @@ public: } }; -protected: - JucerTreeViewBase(); - -private: - int numLeftHandComps; - int getTextX() const; + int textX; };