diff --git a/examples/Utilities/MultithreadingDemo.h b/examples/Utilities/MultithreadingDemo.h index 443755e4a3..d3d8b7db20 100644 --- a/examples/Utilities/MultithreadingDemo.h +++ b/examples/Utilities/MultithreadingDemo.h @@ -335,7 +335,7 @@ private: m.addItem (1, "Use one thread per ball", true, ! isUsingPool); m.addItem (2, "Use a thread pool", true, isUsingPool); - m.showMenuAsync (PopupMenu::Options().withTargetComponent (&controlButton), + m.showMenuAsync (PopupMenu::Options().withTargetComponent (controlButton), ModalCallbackFunction::forComponent (menuItemChosenCallback, this)); } diff --git a/extras/Projucer/Source/Application/jucer_Application.cpp b/extras/Projucer/Source/Application/jucer_Application.cpp index 4c11fb4609..67f20243f4 100644 --- a/extras/Projucer/Source/Application/jucer_Application.cpp +++ b/extras/Projucer/Source/Application/jucer_Application.cpp @@ -359,8 +359,6 @@ enum recentProjectsBaseID = 100, openWindowsBaseID = 300, activeDocumentsBaseID = 400, - colourSchemeBaseID = 1000, - codeEditorColourSchemeBaseID = 1500, showPathsID = 1999, examplesBaseID = 2000 }; @@ -496,16 +494,24 @@ void ProjucerApplication::createBuildMenu (PopupMenu& menu) void ProjucerApplication::createColourSchemeItems (PopupMenu& menu) { - PopupMenu colourSchemes; + PopupMenu colourSchemeMenu; - colourSchemes.addItem (colourSchemeBaseID + 0, "Dark", true, selectedColourSchemeIndex == 0); - colourSchemes.addItem (colourSchemeBaseID + 1, "Grey", true, selectedColourSchemeIndex == 1); - colourSchemes.addItem (colourSchemeBaseID + 2, "Light", true, selectedColourSchemeIndex == 2); + colourSchemeMenu.addItem (PopupMenu::Item ("Dark") + .setTicked (selectedColourSchemeIndex == 0) + .setAction ([this] { setColourScheme (0, true); updateEditorColourSchemeIfNeeded(); })); - menu.addSubMenu ("Colour Scheme", colourSchemes); + colourSchemeMenu.addItem (PopupMenu::Item ("Grey") + .setTicked (selectedColourSchemeIndex == 1) + .setAction ([this] { setColourScheme (1, true); updateEditorColourSchemeIfNeeded(); })); + + colourSchemeMenu.addItem (PopupMenu::Item ("Light") + .setTicked (selectedColourSchemeIndex == 2) + .setAction ([this] { setColourScheme (2, true); updateEditorColourSchemeIfNeeded(); })); + + menu.addSubMenu ("Colour Scheme", colourSchemeMenu); //========================================================================== - PopupMenu editorColourSchemes; + PopupMenu editorColourSchemeMenu; auto& appearanceSettings = getAppSettings().appearance; @@ -513,21 +519,22 @@ void ProjucerApplication::createColourSchemeItems (PopupMenu& menu) auto schemes = appearanceSettings.getPresetSchemes(); auto i = 0; - for (auto s : schemes) + + for (auto& s : schemes) { - editorColourSchemes.addItem (codeEditorColourSchemeBaseID + i, s, - editorColourSchemeWindow == nullptr, - selectedEditorColourSchemeIndex == i); + editorColourSchemeMenu.addItem (PopupMenu::Item (s) + .setEnabled (editorColourSchemeWindow == nullptr) + .setTicked (selectedEditorColourSchemeIndex == i) + .setAction ([this, i] { setEditorColourScheme (i, true); })); ++i; } - numEditorColourSchemes = i; - - editorColourSchemes.addSeparator(); - editorColourSchemes.addItem (codeEditorColourSchemeBaseID + numEditorColourSchemes, - "Create...", editorColourSchemeWindow == nullptr); + editorColourSchemeMenu.addSeparator(); + editorColourSchemeMenu.addItem (PopupMenu::Item ("Create...") + .setEnabled (editorColourSchemeWindow == nullptr) + .setAction ([this] { showEditorColourSchemeWindow(); })); - menu.addSubMenu ("Editor Colour Scheme", editorColourSchemes); + menu.addSubMenu ("Editor Colour Scheme", editorColourSchemeMenu); } void ProjucerApplication::createWindowMenu (PopupMenu& menu) @@ -538,14 +545,11 @@ void ProjucerApplication::createWindowMenu (PopupMenu& menu) menu.addSeparator(); int counter = 0; + for (auto* window : mainWindowList.windows) - { if (window != nullptr) - { if (auto* project = window->getProject()) menu.addItem (openWindowsBaseID + counter++, project->getProjectNameString()); - } - } menu.addSeparator(); menu.addCommandItem (commandManager.get(), CommandIDs::closeAllWindows); @@ -956,19 +960,6 @@ void ProjucerApplication::handleMainMenuCommand (int menuItemID) else jassertfalse; } - else if (menuItemID >= colourSchemeBaseID && menuItemID < (colourSchemeBaseID + 3)) - { - setColourScheme (menuItemID - colourSchemeBaseID, true); - updateEditorColourSchemeIfNeeded(); - } - else if (menuItemID >= codeEditorColourSchemeBaseID && menuItemID < (codeEditorColourSchemeBaseID + numEditorColourSchemes)) - { - setEditorColourScheme (menuItemID - codeEditorColourSchemeBaseID, true); - } - else if (menuItemID == (codeEditorColourSchemeBaseID + numEditorColourSchemes)) - { - showEditorColourSchemeWindow(); - } else if (menuItemID == showPathsID) { showPathsWindow (true); diff --git a/extras/Projucer/Source/Application/jucer_Application.h b/extras/Projucer/Source/Application/jucer_Application.h index 9b5ddc38b4..3552ef538b 100644 --- a/extras/Projucer/Source/Application/jucer_Application.h +++ b/extras/Projucer/Source/Application/jucer_Application.h @@ -208,7 +208,7 @@ private: ChildProcess makeProcess; #endif - int selectedColourSchemeIndex = 0, selectedEditorColourSchemeIndex = 0, numEditorColourSchemes = 0; + int selectedColourSchemeIndex = 0, selectedEditorColourSchemeIndex = 0; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjucerApplication) diff --git a/extras/Projucer/Source/Project/UI/jucer_ModulesInformationComponent.h b/extras/Projucer/Source/Project/UI/jucer_ModulesInformationComponent.h index d5fa108f31..eba10620ac 100644 --- a/extras/Projucer/Source/Project/UI/jucer_ModulesInformationComponent.h +++ b/extras/Projucer/Source/Project/UI/jucer_ModulesInformationComponent.h @@ -218,112 +218,114 @@ private: void showCopyModeMenu() { PopupMenu m; - m.addItem (1, "Set all modules to copy locally"); - m.addItem (2, "Set all modules to not copy locally"); - auto res = m.showAt (&setCopyModeButton); + m.addItem (PopupMenu::Item ("Set all modules to copy locally") + .setAction ([&] { project.getEnabledModules().setLocalCopyModeForAllModules (true); })); - if (res != 0) - project.getEnabledModules().setLocalCopyModeForAllModules (res == 1); + m.addItem (PopupMenu::Item ("Set all modules to not copy locally") + .setAction ([&] { project.getEnabledModules().setLocalCopyModeForAllModules (false); })); + + m.showMenuAsync (PopupMenu::Options().withTargetComponent (setCopyModeButton)); } - void showGlobalPathsMenu() + static void setAllModulesToUseGlobalPaths (Project& project, bool useGlobal) { - auto areAnyModulesSelected = (list.getNumSelectedRows() > 0); + auto& moduleList = project.getEnabledModules(); - PopupMenu m; - m.addItem (1, "Set all modules to use global paths"); - m.addItem (2, "Set all modules to not use global paths"); - m.addItem (3, "Set selected modules to use global paths", areAnyModulesSelected); - m.addItem (4, "Set selected modules to not use global paths", areAnyModulesSelected); + for (auto id : moduleList.getAllModules()) + moduleList.getShouldUseGlobalPathValue (id).setValue (useGlobal); + } - auto res = m.showAt (&globalPathsButton); + static void setSelectedModulesToUseGlobalPaths (Project& project, SparseSet selected, bool useGlobal) + { + auto& moduleList = project.getEnabledModules(); - if (res != 0) - { - auto enableGlobalPaths = (res % 2 == 1); + for (int i = 0; i < selected.size(); ++i) + moduleList.getShouldUseGlobalPathValue (moduleList.getModuleID (selected[i])).setValue (useGlobal); + } - auto& moduleList = project.getEnabledModules(); + void showGlobalPathsMenu() + { + PopupMenu m; - if (res < 3) - { - auto moduleIDs = moduleList.getAllModules(); + m.addItem (PopupMenu::Item ("Set all modules to use global paths") + .setAction ([&] { setAllModulesToUseGlobalPaths (project, true); })); - for (auto id : moduleIDs) - moduleList.getShouldUseGlobalPathValue (id).setValue (enableGlobalPaths); - } - else - { - auto selected = list.getSelectedRows(); + m.addItem (PopupMenu::Item ("Set all modules to not use global paths") + .setAction ([&] { setAllModulesToUseGlobalPaths (project, false); })); - for (int i = 0; i < selected.size(); ++i) - moduleList.getShouldUseGlobalPathValue (moduleList.getModuleID (selected[i])).setValue (enableGlobalPaths); - } - } + m.addItem (PopupMenu::Item ("Set selected modules to use global paths") + .setEnabled (list.getNumSelectedRows() > 0) + .setAction ([&] { setSelectedModulesToUseGlobalPaths (project, list.getSelectedRows(), true); })); + + m.addItem (PopupMenu::Item ("Set selected modules to not use global paths") + .setEnabled (list.getNumSelectedRows() > 0) + .setAction ([&] { setSelectedModulesToUseGlobalPaths (project, list.getSelectedRows(), false); })); + + m.showMenuAsync (PopupMenu::Options().withTargetComponent (globalPathsButton)); } void showSetPathsMenu() { - enum - { - copyPathsToAllModulesID = 1, - copyPathsID, - pastePathsID - }; - - auto& moduleList = project.getEnabledModules(); - auto moduleToCopy = moduleList.getModuleID (list.getSelectedRow()); + PopupMenu m; + auto moduleToCopy = project.getEnabledModules().getModuleID (list.getSelectedRow()); if (moduleToCopy.isNotEmpty()) { - PopupMenu m; - m.addItem (copyPathsToAllModulesID, "Copy the paths from the module '" + moduleToCopy + "' to all other modules"); - m.addItem (copyPathsID, "Copy paths from selected module", list.getNumSelectedRows() == 1); - m.addItem (pastePathsID, "Paste paths to selected modules", ! modulePathClipboard.empty()); - - int res = m.showAt (©PathButton); - - if (res == copyPathsToAllModulesID) - { - for (Project::ExporterIterator exporter (project); exporter.next();) - { - for (int i = 0; i < moduleList.getNumModules(); ++i) - { - auto modID = moduleList.getModuleID (i); - - if (modID != moduleToCopy) - exporter->getPathForModuleValue (modID) = exporter->getPathForModuleValue (moduleToCopy).get(); - } - } - } - else if (res == copyPathsID) - { - modulePathClipboard.clear(); - - for (Project::ExporterIterator exporter (project); exporter.next();) - modulePathClipboard[exporter->getName()] = exporter->getPathForModuleValue (moduleToCopy).get(); - } - else if (res == pastePathsID) - { - for (int selectionId = 0; selectionId < list.getNumSelectedRows(); ++selectionId) - { - auto rowNumber = list.getSelectedRow (selectionId); - auto modID = moduleList.getModuleID (rowNumber); - - for (Project::ExporterIterator exporter (project); exporter.next();) - exporter->getPathForModuleValue (modID) = modulePathClipboard[exporter->getName()]; - } - } - - list.repaint(); + m.addItem (PopupMenu::Item ("Copy the paths from the module '" + moduleToCopy + "' to all other modules") + .setAction ([this, moduleToCopy] + { + auto& moduleList = project.getEnabledModules(); + + for (Project::ExporterIterator exporter (project); exporter.next();) + { + for (int i = 0; i < moduleList.getNumModules(); ++i) + { + auto modID = moduleList.getModuleID (i); + + if (modID != moduleToCopy) + exporter->getPathForModuleValue (modID) = exporter->getPathForModuleValue (moduleToCopy).get(); + } + } + + list.repaint(); + })); + + m.addItem (PopupMenu::Item ("Copy paths from selected module") + .setEnabled (list.getNumSelectedRows() == 1) + .setAction ([this, moduleToCopy] + { + modulePathClipboard.clear(); + + for (Project::ExporterIterator exporter (project); exporter.next();) + modulePathClipboard[exporter->getName()] = exporter->getPathForModuleValue (moduleToCopy).get(); + + list.repaint(); + })); + + m.addItem (PopupMenu::Item ("Paste paths to selected modules") + .setEnabled (! modulePathClipboard.empty()) + .setAction ([this] + { + for (int selectionId = 0; selectionId < list.getNumSelectedRows(); ++selectionId) + { + auto rowNumber = list.getSelectedRow (selectionId); + auto modID = project.getEnabledModules().getModuleID (rowNumber); + + for (Project::ExporterIterator exporter (project); exporter.next();) + exporter->getPathForModuleValue (modID) = modulePathClipboard[exporter->getName()]; + } + + list.repaint(); + })); } else { - PopupMenu m; - m.addItem (1, "(Select a module in the list above to use this option)", false); - - m.showAt (©PathButton); + m.addItem (PopupMenu::Item ("(Select a module in the list above to use this option)") + .setEnabled (false)); } + + m.showMenuAsync (PopupMenu::Options().withTargetComponent (copyPathButton)); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ModulesInformationComponent) diff --git a/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp b/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp index 6df273ba15..46894ef99f 100644 --- a/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp +++ b/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp @@ -311,7 +311,7 @@ void PluginListComponent::showOptionsMenu() menu.addItem (10 + i, "Scan for new or updated " + format->getName() + " plug-ins"); } - menu.showMenuAsync (PopupMenu::Options().withTargetComponent (&optionsButton), + menu.showMenuAsync (PopupMenu::Options().withTargetComponent (optionsButton), ModalCallbackFunction::forComponent (optionsMenuStaticCallback, this)); } diff --git a/modules/juce_core/system/juce_CompilerSupport.h b/modules/juce_core/system/juce_CompilerSupport.h index cc9ad8237d..9d1aae4c3f 100644 --- a/modules/juce_core/system/juce_CompilerSupport.h +++ b/modules/juce_core/system/juce_CompilerSupport.h @@ -121,6 +121,12 @@ #define JUCE_CONSTEXPR #endif +#if JUCE_MSVC && _MSC_VER < 1900 + #define JUCE_REF_QUALIFIER +#else + #define JUCE_REF_QUALIFIER & +#endif + #if (! JUCE_MSVC) && (! JUCE_CXX14_IS_AVAILABLE) namespace std { diff --git a/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp b/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp index 17a14d7f8d..29cff0df3c 100644 --- a/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp +++ b/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp @@ -552,26 +552,22 @@ void TabbedButtonBar::setTabBackgroundColour (int tabIndex, Colour newColour) } } -void TabbedButtonBar::extraItemsMenuCallback (int result, TabbedButtonBar* bar) -{ - if (bar != nullptr && result > 0) - bar->setCurrentTabIndex (result - 1); -} - void TabbedButtonBar::showExtraItemsMenu() { PopupMenu m; + Component::SafePointer bar (this); for (int i = 0; i < tabs.size(); ++i) { auto* tab = tabs.getUnchecked(i); if (! tab->button->isVisible()) - m.addItem (i + 1, tab->name, true, i == currentTabIndex); + m.addItem (PopupMenu::Item (tab->name) + .setTicked (i == currentTabIndex) + .setAction ([this, bar, i] { if (bar != nullptr) setCurrentTabIndex (i); })); } - m.showMenuAsync (PopupMenu::Options().withTargetComponent (extraTabsButton.get()), - ModalCallbackFunction::forComponent (extraItemsMenuCallback, this)); + m.showMenuAsync (PopupMenu::Options().withTargetComponent (extraTabsButton.get())); } //============================================================================== diff --git a/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h b/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h index beff97ff04..942ca5b4b7 100644 --- a/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h +++ b/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h @@ -364,7 +364,6 @@ private: std::unique_ptr