diff --git a/muse b/muse index d4f6a0c7b9824..09c070c3d8d34 160000 --- a/muse +++ b/muse @@ -1 +1 @@ -Subproject commit d4f6a0c7b9824002599f6f5e15d3dcef6aca4281 +Subproject commit 09c070c3d8d345b661406a5dd0b4bb1c8297a47f diff --git a/src/appshell/internal/iappmenumodelhook.h b/src/appshell/internal/iappmenumodelhook.h index ce11d4f697538..bec9e8ba85dcd 100644 --- a/src/appshell/internal/iappmenumodelhook.h +++ b/src/appshell/internal/iappmenumodelhook.h @@ -23,6 +23,7 @@ #define MU_APPSHELL_IAPPMENUMODELHOOK_H #include "modularity/imoduleinterface.h" +#include "uicomponents/qml/Muse/UiComponents/menuitem.h" namespace mu::appshell { class IAppMenuModelHook : MODULE_CONTEXT_INTERFACE @@ -32,13 +33,14 @@ class IAppMenuModelHook : MODULE_CONTEXT_INTERFACE public: virtual ~IAppMenuModelHook() = default; - virtual void onAppMenuInited() = 0; + //! Invoked once the application's top-level menu hierarchy has been loaded. + virtual void onAppMenuInited(const muse::uicomponents::MenuItemList& items) = 0; }; class AppMenuModelHookStub : public IAppMenuModelHook { public: - void onAppMenuInited() override {} + void onAppMenuInited(const muse::uicomponents::MenuItemList& /*items*/) override {} }; } diff --git a/src/appshell/internal/platform/macos/macosappmenumodelhook.h b/src/appshell/internal/platform/macos/macosappmenumodelhook.h index 1e2fb2df3a702..8e4cd1559bbca 100644 --- a/src/appshell/internal/platform/macos/macosappmenumodelhook.h +++ b/src/appshell/internal/platform/macos/macosappmenumodelhook.h @@ -27,6 +27,6 @@ namespace mu::appshell { class MacOSAppMenuModelHook : public IAppMenuModelHook { public: - void onAppMenuInited() override; + void onAppMenuInited(const muse::uicomponents::MenuItemList& items) override; }; } diff --git a/src/appshell/internal/platform/macos/macosappmenumodelhook.mm b/src/appshell/internal/platform/macos/macosappmenumodelhook.mm index 1c39edb73be9d..6091f2f984e31 100644 --- a/src/appshell/internal/platform/macos/macosappmenumodelhook.mm +++ b/src/appshell/internal/platform/macos/macosappmenumodelhook.mm @@ -24,10 +24,59 @@ #include +#include "interactive/internal/platform/macos/macosinteractivehelper.h" +#include "notationscene/notationcommands.h" + using namespace mu::appshell; -void MacOSAppMenuModelHook::onAppMenuInited() +void MacOSAppMenuModelHook::onAppMenuInited(const muse::uicomponents::MenuItemList& items) { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"NSDisabledDictationMenuItem"]; [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"NSDisabledCharacterPaletteMenuItem"]; + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"NSMenuEnableActionImages"]; + + const muse::uicomponents::MenuItem* editMenu = nullptr; + int editTopLevelIndex = -1; + for (int i = 0; i < items.size(); ++i) { + if (items[i] && items[i]->id() == "menu-edit") { + editMenu = items[i]; + editTopLevelIndex = i; + break; + } + } + + if (!editMenu || editTopLevelIndex < 0) { + return; + } + + // AppKit inserts the Application menu at index 0 on macOS, shifting top-level menus by +1 + muse::MacOSInteractiveHelper::setEditMenuIndex(editTopLevelIndex + 1); + + int index = 0; + std::map structure; + + for (const muse::uicomponents::MenuItem* subitem : editMenu->subitems()) { + if (!subitem || subitem->id().isEmpty()) { + index++; + continue; + } + + if (subitem->id() == mu::notation::UNDO_COMMAND.toString()) { + structure[muse::MacOSInteractiveHelper::EditAction::Undo] = index; + } else if (subitem->id() == mu::notation::REDO_COMMAND.toString()) { + structure[muse::MacOSInteractiveHelper::EditAction::Redo] = index; + } else if (subitem->id() == mu::notation::CUT_COMMAND.toString()) { + structure[muse::MacOSInteractiveHelper::EditAction::Cut] = index; + } else if (subitem->id() == mu::notation::COPY_COMMAND.toString()) { + structure[muse::MacOSInteractiveHelper::EditAction::Copy] = index; + } else if (subitem->id() == mu::notation::PASTE_COMMAND.toString()) { + structure[muse::MacOSInteractiveHelper::EditAction::Paste] = index; + } else if (subitem->id() == mu::notation::SELECT_ALL_COMMAND.toString()) { + structure[muse::MacOSInteractiveHelper::EditAction::SelectAll] = index; + } + + index++; + } + + muse::MacOSInteractiveHelper::setEditMenuStructure(structure); } diff --git a/src/appshell/qml/MuseScore/AppShell/appmenumodel.cpp b/src/appshell/qml/MuseScore/AppShell/appmenumodel.cpp index 8eb4657a302bf..92e32cb827638 100644 --- a/src/appshell/qml/MuseScore/AppShell/appmenumodel.cpp +++ b/src/appshell/qml/MuseScore/AppShell/appmenumodel.cpp @@ -111,7 +111,7 @@ void AppMenuModel::load() //! NOTE: removes some undesired platform-specific items //! (such as "Start Dictation" and "Special Characters" on macOS) - appMenuModelHook()->onAppMenuInited(); + appMenuModelHook()->onAppMenuInited(items); } bool AppMenuModel::isGlobalMenuAvailable()