From fedbb67452a930837d676599f431d997df28d7d2 Mon Sep 17 00:00:00 2001 From: ed Date: Tue, 31 Oct 2017 11:10:06 +0000 Subject: [PATCH] Projucer: Show the option to remove references or move to trash when deleting file groups and hide the file group information after deleting --- .../Project/UI/Sidebar/jucer_FileTreeItems.h | 62 ++++++++++++------- .../UI/Sidebar/jucer_ProjectTreeItemBase.h | 6 +- .../UI/jucer_FileGroupInformationComponent.h | 2 + .../UI/jucer_ProjectContentComponent.cpp | 9 +++ .../UI/jucer_ProjectContentComponent.h | 1 + 5 files changed, 54 insertions(+), 26 deletions(-) diff --git a/extras/Projucer/Source/Project/UI/Sidebar/jucer_FileTreeItems.h b/extras/Projucer/Source/Project/UI/Sidebar/jucer_FileTreeItems.h index 93c95b9bda..dcfcd3a0bb 100644 --- a/extras/Projucer/Source/Project/UI/Sidebar/jucer_FileTreeItems.h +++ b/extras/Projucer/Source/Project/UI/Sidebar/jucer_FileTreeItems.h @@ -56,41 +56,52 @@ public: void deleteItem() override { item.removeItemFromProject(); } - virtual void deleteAllSelectedItems() override + void deleteAllSelectedItems() override { - TreeView* tree = getOwnerView(); - const int numSelected = tree->getNumSelectedItems(); - OwnedArray filesToTrash; - OwnedArray itemsToRemove; + auto* tree = getOwnerView(); + Array filesToTrash; + Array itemsToRemove; - for (int i = 0; i < numSelected; ++i) + for (auto i = 0; i < tree->getNumSelectedItems(); ++i) { if (auto* p = dynamic_cast (tree->getSelectedItem (i))) { - itemsToRemove.add (new Project::Item (p->item)); + itemsToRemove.add (p->item); - if (p->getFile().existsAsFile()) - filesToTrash.add (new File (p->getFile())); + if (p->item.isGroup()) + { + for (auto j = 0; j < p->item.getNumChildren(); ++j) + { + auto associatedFile = p->item.getChild (j).getFile(); + + if (associatedFile.existsAsFile()) + filesToTrash.addIfNotAlreadyThere (associatedFile); + } + } + else if (p->getFile().existsAsFile()) + { + filesToTrash.addIfNotAlreadyThere (p->getFile()); + } } } if (filesToTrash.size() > 0) { String fileList; - const int maxFilesToList = 10; - for (int i = jmin (maxFilesToList, filesToTrash.size()); --i >= 0;) - fileList << filesToTrash.getUnchecked(i)->getFullPathName() << "\n"; + auto maxFilesToList = 10; + for (auto i = jmin (maxFilesToList, filesToTrash.size()); --i >= 0;) + fileList << filesToTrash.getUnchecked(i).getFullPathName() << "\n"; if (filesToTrash.size() > maxFilesToList) fileList << "\n...plus " << (filesToTrash.size() - maxFilesToList) << " more files..."; - int r = AlertWindow::showYesNoCancelBox (AlertWindow::NoIcon, "Delete Project Items", - "As well as removing the selected item(s) from the project, do you also want to move their files to the trash:\n\n" - + fileList, - "Just remove references", - "Also move files to Trash", - "Cancel", - tree->getTopLevelComponent()); + auto r = AlertWindow::showYesNoCancelBox (AlertWindow::NoIcon, "Delete Project Items", + "As well as removing the selected item(s) from the project, do you also want to move their files to the trash:\n\n" + + fileList, + "Just remove references", + "Also move files to Trash", + "Cancel", + tree->getTopLevelComponent()); if (r == 0) return; @@ -105,7 +116,7 @@ public: for (int i = filesToTrash.size(); --i >= 0;) { - const File f (*filesToTrash.getUnchecked(i)); + auto f = filesToTrash.getUnchecked(i); om.closeFile (f, false); @@ -115,10 +126,17 @@ public: } } - for (int i = itemsToRemove.size(); --i >= 0;) + for (auto i = itemsToRemove.size(); --i >= 0;) { - if (auto* itemToRemove = treeRootItem->findTreeViewItem (*itemsToRemove.getUnchecked(i))) + if (auto itemToRemove = treeRootItem->findTreeViewItem (itemsToRemove.getUnchecked (i))) { + if (auto* pcc = getProjectContentComponent()) + { + if (auto* fileInfoComp = dynamic_cast (pcc->getEditorComponentContent())) + if (fileInfoComp->getGroupPath() == itemToRemove->getFile().getFullPathName()) + pcc->hideEditor(); + } + om.closeFile (itemToRemove->getFile(), false); itemToRemove->deleteItem(); } diff --git a/extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h b/extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h index b97ebe7833..780a56e097 100644 --- a/extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h +++ b/extras/Projucer/Source/Project/UI/Sidebar/jucer_ProjectTreeItemBase.h @@ -46,11 +46,9 @@ struct ProjectTreeItemBase : public JucerTreeViewBase, void closeSettingsPage() { if (auto* pcc = getProjectContentComponent()) - { - if (auto* content = dynamic_cast (pcc->getEditorComponent()->getChildComponent (0))) - if (content->getViewedComponent()->getComponentID() == getUniqueName()) + if (auto* content = pcc->getEditorComponentContent()) + if (content->getComponentID() == getUniqueName()) pcc->hideEditor(); - } } void deleteAllSelectedItems() override diff --git a/extras/Projucer/Source/Project/UI/jucer_FileGroupInformationComponent.h b/extras/Projucer/Source/Project/UI/jucer_FileGroupInformationComponent.h index 14e13d5016..f8c6d30adb 100644 --- a/extras/Projucer/Source/Project/UI/jucer_FileGroupInformationComponent.h +++ b/extras/Projucer/Source/Project/UI/jucer_FileGroupInformationComponent.h @@ -106,6 +106,8 @@ public: return existing.release(); } + String getGroupPath() const { return item.getFile().getFullPathName(); } + //============================================================================== void valueTreePropertyChanged (ValueTree&, const Identifier&) override { itemChanged(); } void valueTreeChildAdded (ValueTree&, ValueTree&) override { itemChanged(); } diff --git a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp index dab399aaff..c516fe8de1 100644 --- a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp +++ b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp @@ -447,6 +447,15 @@ bool ProjectContentComponent::setEditorComponent (Component* editor, return false; } +Component* ProjectContentComponent::getEditorComponentContent() const +{ + if (contentView != nullptr) + if (auto* vp = dynamic_cast (contentView.get())) + return vp->viewport.getViewedComponent(); + + return nullptr; +} + void ProjectContentComponent::closeDocument() { if (currentDocument != nullptr) diff --git a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.h b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.h index b1cf8fc800..f9ef722f2a 100644 --- a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.h +++ b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.h @@ -66,6 +66,7 @@ public: void hideEditor(); bool setEditorComponent (Component* editor, OpenDocumentManager::Document* doc); + Component* getEditorComponentContent() const; Component* getEditorComponent() const { return contentView; } Component& getSidebarComponent() { return sidebarTabs; }