diff --git a/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp b/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp index d6c91d3e4d..0481e82ef0 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectInformationComponent.cpp @@ -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() diff --git a/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.cpp b/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.cpp index 0d7cacbecc..9392781df2 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.cpp @@ -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(); diff --git a/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.h b/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.h index 89b75c174d..538d299b75 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.h +++ b/extras/Introjucer/Source/Project/jucer_ProjectTreeViewBase.h @@ -65,6 +65,9 @@ public: virtual void addFiles (const StringArray& files, int insertIndex); virtual void moveSelectedItemsTo (OwnedArray & 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); diff --git a/extras/Introjucer/Source/Project/jucer_TreeViewTypes.cpp b/extras/Introjucer/Source/Project/jucer_TreeViewTypes.cpp index c7443f9a1a..d62a37fe6f 100644 --- a/extras/Introjucer/Source/Project/jucer_TreeViewTypes.cpp +++ b/extras/Introjucer/Source/Project/jucer_TreeViewTypes.cpp @@ -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 (getParentProjectItem()); - PopupMenu m; + GroupTreeViewItem* parentGroup = dynamic_cast (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 (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; } diff --git a/extras/Introjucer/Source/Project/jucer_TreeViewTypes.h b/extras/Introjucer/Source/Project/jucer_TreeViewTypes.h index 183cae4a77..fc9da30293 100644 --- a/extras/Introjucer/Source/Project/jucer_TreeViewTypes.h +++ b/extras/Introjucer/Source/Project/jucer_TreeViewTypes.h @@ -42,6 +42,7 @@ public: void createLeftEdgeComponents (OwnedArray& 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& components) {} void showDocument(); void showPopupMenu(); + void handlePopupMenuResult (int resultCode); void addFiles (const StringArray& files, int insertIndex); void addNewGroup();