| @@ -547,18 +547,23 @@ public: | |||
| project.deleteExporter (name.getTrailingIntValue()); | |||
| } | |||
| static void newExporterMenuItemChosen (int resultCode, ProjectSettingsComponent* settingsComp) | |||
| { | |||
| if (resultCode > 0 && settingsComp != nullptr) | |||
| settingsComp->project.addNewExporter (ProjectExporter::getExporterNames() [resultCode - 1]); | |||
| } | |||
| void createNewExporter (TextButton& button) | |||
| { | |||
| StringArray exporters (ProjectExporter::getExporterNames()); | |||
| PopupMenu menu; | |||
| const StringArray exporters (ProjectExporter::getExporterNames()); | |||
| for (int i = 0; i < exporters.size(); ++i) | |||
| menu.addItem (i + 1, "Create a new " + exporters[i] + " target"); | |||
| const int r = menu.showAt (&button); | |||
| if (r > 0) | |||
| project.addNewExporter (exporters [r - 1]); | |||
| menu.showMenuAsync (PopupMenu::Options().withTargetComponent (&button), | |||
| ModalCallbackFunction::forComponent (newExporterMenuItemChosen, this)); | |||
| } | |||
| void createNewConfig() | |||
| @@ -436,18 +436,39 @@ void ProjectTreeViewBase::refreshSubItems() | |||
| addSubItems(); | |||
| } | |||
| void ProjectTreeViewBase::showMultiSelectionPopupMenu() | |||
| static void treeViewMultiSelectItemChosen (int resultCode, ProjectTreeViewBase* item) | |||
| { | |||
| PopupMenu m; | |||
| m.addItem (6, "Delete"); | |||
| switch (m.show()) | |||
| switch (resultCode) | |||
| { | |||
| case 6: deleteAllSelectedItems(); break; | |||
| case 1: item->deleteAllSelectedItems(); break; | |||
| default: break; | |||
| } | |||
| } | |||
| void ProjectTreeViewBase::showMultiSelectionPopupMenu() | |||
| { | |||
| PopupMenu m; | |||
| m.addItem (1, "Delete"); | |||
| m.showMenuAsync (PopupMenu::Options(), | |||
| ModalCallbackFunction::create (treeViewMultiSelectItemChosen, this)); | |||
| } | |||
| static void treeViewMenuItemChosen (int resultCode, ProjectTreeViewBase* item) | |||
| { | |||
| item->handlePopupMenuResult (resultCode); | |||
| } | |||
| void ProjectTreeViewBase::launchPopupMenu (PopupMenu& m) | |||
| { | |||
| m.showMenuAsync (PopupMenu::Options(), | |||
| ModalCallbackFunction::create (treeViewMenuItemChosen, this)); | |||
| } | |||
| void ProjectTreeViewBase::handlePopupMenuResult (int) | |||
| { | |||
| } | |||
| void ProjectTreeViewBase::itemDoubleClicked (const MouseEvent& e) | |||
| { | |||
| invokeShowDocument(); | |||
| @@ -65,6 +65,9 @@ public: | |||
| virtual void addFiles (const StringArray& files, int insertIndex); | |||
| virtual void moveSelectedItemsTo (OwnedArray <Project::Item>& selectedNodes, int insertIndex); | |||
| virtual void showMultiSelectionPopupMenu(); | |||
| void launchPopupMenu (PopupMenu&); // runs asynchronously, and produces a callback to handlePopupMenuResult(). | |||
| virtual void handlePopupMenuResult (int resultCode); | |||
| void invokeShowDocument(); | |||
| virtual ProjectTreeViewBase* findTreeViewItem (const Project::Item& itemToFind); | |||
| @@ -120,13 +120,17 @@ void GroupTreeViewItem::showPopupMenu() | |||
| if (! isRoot()) | |||
| m.addItem (2, "Delete"); | |||
| const int res = m.show(); | |||
| switch (res) | |||
| launchPopupMenu (m); | |||
| } | |||
| void GroupTreeViewItem::handlePopupMenuResult (int resultCode) | |||
| { | |||
| switch (resultCode) | |||
| { | |||
| case 1: triggerAsyncRename (item); break; | |||
| case 2: deleteAllSelectedItems(); break; | |||
| case 3: item.sortAlphabetically (false); break; | |||
| default: processCreateFileMenuItem (res); break; | |||
| default: processCreateFileMenuItem (resultCode); break; | |||
| } | |||
| } | |||
| @@ -228,7 +232,7 @@ void SourceFileTreeViewItem::setName (const String& newName) | |||
| ProjectTreeViewBase* SourceFileTreeViewItem::createSubItem (const Project::Item& child) | |||
| { | |||
| jassertfalse | |||
| return 0; | |||
| return nullptr; | |||
| } | |||
| void SourceFileTreeViewItem::showDocument() | |||
| @@ -242,10 +246,9 @@ void SourceFileTreeViewItem::showDocument() | |||
| void SourceFileTreeViewItem::showPopupMenu() | |||
| { | |||
| GroupTreeViewItem* parentGroup = dynamic_cast <GroupTreeViewItem*> (getParentProjectItem()); | |||
| PopupMenu m; | |||
| GroupTreeViewItem* parentGroup = dynamic_cast <GroupTreeViewItem*> (getParentProjectItem()); | |||
| if (parentGroup != nullptr) | |||
| { | |||
| parentGroup->addCreateFileMenuItems (m); | |||
| @@ -264,8 +267,14 @@ void SourceFileTreeViewItem::showPopupMenu() | |||
| m.addSeparator(); | |||
| m.addItem (3, "Delete"); | |||
| const int res = m.show(); | |||
| switch (res) | |||
| launchPopupMenu (m); | |||
| } | |||
| void SourceFileTreeViewItem::handlePopupMenuResult (int resultCode) | |||
| { | |||
| GroupTreeViewItem* parentGroup = dynamic_cast <GroupTreeViewItem*> (getParentProjectItem()); | |||
| switch (resultCode) | |||
| { | |||
| case 1: getFile().startAsProcess(); break; | |||
| case 2: revealInFinder(); break; | |||
| @@ -274,7 +283,7 @@ void SourceFileTreeViewItem::showPopupMenu() | |||
| default: | |||
| if (parentGroup != nullptr) | |||
| parentGroup->processCreateFileMenuItem (res); | |||
| parentGroup->processCreateFileMenuItem (resultCode); | |||
| break; | |||
| } | |||
| @@ -42,6 +42,7 @@ public: | |||
| void createLeftEdgeComponents (OwnedArray<Component>& components) {} | |||
| void showDocument(); | |||
| void showPopupMenu(); | |||
| void handlePopupMenuResult (int resultCode); | |||
| String getDisplayName() const; | |||
| void setName (const String& newName); | |||
| }; | |||
| @@ -62,6 +63,7 @@ public: | |||
| void createLeftEdgeComponents (OwnedArray<Component>& components) {} | |||
| void showDocument(); | |||
| void showPopupMenu(); | |||
| void handlePopupMenuResult (int resultCode); | |||
| void addFiles (const StringArray& files, int insertIndex); | |||
| void addNewGroup(); | |||