diff --git a/src/Menus.cpp b/src/Menus.cpp index 082b160f3..9627193e9 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -863,42 +863,14 @@ void MenuManager::UpdateMenus( bool checkActive ) auto &commandManager = CommandManager::Get( project ); - commandManager.EnableUsingFlags(flags2 , NoFlagsSpecified); - // With select-all-on-none, some items that we don't want enabled may have // been enabled, since we changed the flags. Here we manually disable them. // 0 is grey out, 1 is Autoselect, 2 is Give warnings. - if (mWhatIfNoSelection != 0) - { - if ( (flags & TimeSelectedFlag).none() || - (flags & TracksSelectedFlag).none ()) - { - commandManager.Enable(wxT("SplitCut"), false); - commandManager.Enable(wxT("SplitDelete"), false); - } - if ( (flags & WaveTracksSelectedFlag).none() ) - { - commandManager.Enable(wxT("Split"), false); - } - if ( (flags & TimeSelectedFlag).none() || - (flags & WaveTracksSelectedFlag).none() ) - { - commandManager.Enable(wxT("ExportSel"), false); - commandManager.Enable(wxT("SplitNew"), false); - } - if ( (flags & TimeSelectedFlag).none() || - (flags & AudioTracksSelectedFlag).none() ) - { - commandManager.Enable(wxT("Trim"), false); - } - } - -#if 0 - if ( (flags & CutCopyAvailableFlag).any() ) { - GetCommandManager()->Enable(wxT("Copy"), true); - GetCommandManager()->Enable(wxT("Cut"), true); - } -#endif + commandManager.EnableUsingFlags( + flags2, // the "lax" flags + (mWhatIfNoSelection == 0 ? flags2 : flags), // the "strict" flags + NoFlagsSpecified + ); MenuManager::ModifyToolbarMenus(project); } diff --git a/src/commands/CommandManager.cpp b/src/commands/CommandManager.cpp index 7d1caeacc..13fe82ca7 100644 --- a/src/commands/CommandManager.cpp +++ b/src/commands/CommandManager.cpp @@ -542,6 +542,7 @@ void CommandManager::AddItem(const CommandID &name, hasDialog, options.accel, CurrentMenu(), finder, callback, {}, 0, 0, options.bIsEffect, cookedParameter); + entry->useStrictFlags = options.useStrictFlags; int ID = entry->id; wxString label = GetLabelWithDisabledAccel(entry); @@ -955,17 +956,26 @@ void CommandManager::Enable(const wxString &name, bool enabled) Enable(entry, enabled); } -void CommandManager::EnableUsingFlags(CommandFlag flags, CommandMask mask) +void CommandManager::EnableUsingFlags( + CommandFlag flags, CommandFlag strictFlags, CommandMask mask) { + // strictFlags are a subset of flags. strictFlags represent the real + // conditions now, but flags are the conditions that could be made true. + // Some commands use strict flags only, refusing the chance to fix + // conditions + wxASSERT( (strictFlags & ~flags).none() ); + for(const auto &entry : mCommandList) { if (entry->multi && entry->index != 0) continue; if( entry->isOccult ) continue; + auto useFlags = entry->useStrictFlags ? strictFlags : flags; + auto combinedMask = (mask & entry->mask); if (combinedMask.any()) { - bool enable = ((flags & combinedMask) == + bool enable = ((useFlags & combinedMask) == (entry->flags & combinedMask)); Enable(entry.get(), enable); } diff --git a/src/commands/CommandManager.h b/src/commands/CommandManager.h index 792d0b020..a122d1c28 100644 --- a/src/commands/CommandManager.h +++ b/src/commands/CommandManager.h @@ -82,6 +82,7 @@ struct CommandListEntry bool hasDialog; CommandFlag flags; CommandMask mask; + bool useStrictFlags{ false }; }; using MenuBarList = std::vector < MenuBarListEntry >; @@ -164,6 +165,8 @@ class AUDACITY_DLL_API CommandManager final { longName = value; return std::move(*this); } Options &&IsGlobal () && { global = true; return std::move(*this); } + Options &&UseStrictFlags () && + { useStrictFlags = true; return std::move(*this); } const wxChar *accel{ wxT("") }; int check{ -1 }; // default value means it's not a check item @@ -172,6 +175,7 @@ class AUDACITY_DLL_API CommandManager final CommandMask mask{ NoFlagsSpecified }; wxString longName{}; // translated bool global{ false }; + bool useStrictFlags{ false }; }; void AddItemList(const CommandID & name, @@ -218,7 +222,8 @@ class AUDACITY_DLL_API CommandManager final // Modifying menus // - void EnableUsingFlags(CommandFlag flags, CommandMask mask); + void EnableUsingFlags( + CommandFlag flags, CommandFlag strictFlags, CommandMask mask); void Enable(const wxString &name, bool enabled); void Check(const CommandID &name, bool checked); void Modify(const wxString &name, const wxString &newLabel); diff --git a/src/menus/EditMenus.cpp b/src/menus/EditMenus.cpp index 0ce0641e3..3194c6c3a 100644 --- a/src/menus/EditMenus.cpp +++ b/src/menus/EditMenus.cpp @@ -1156,10 +1156,12 @@ MenuTable::BaseItemPtr EditMenu( AudacityProject & ) Menu( _("R&emove Special"), /* i18n-hint: (verb) Do a special kind of cut*/ Command( wxT("SplitCut"), XXO("Spl&it Cut"), FN(OnSplitCut), - NotBusyTimeAndTracksFlags, wxT("Ctrl+Alt+X") ), + NotBusyTimeAndTracksFlags, + Options{ wxT("Ctrl+Alt+X") }.UseStrictFlags() ), /* i18n-hint: (verb) Do a special kind of DELETE*/ Command( wxT("SplitDelete"), XXO("Split D&elete"), FN(OnSplitDelete), - NotBusyTimeAndTracksFlags, wxT("Ctrl+Alt+K") ), + NotBusyTimeAndTracksFlags, + Options{ wxT("Ctrl+Alt+K") }.UseStrictFlags() ), Separator(), @@ -1170,7 +1172,7 @@ MenuTable::BaseItemPtr EditMenu( AudacityProject & ) /* i18n-hint: (verb)*/ Command( wxT("Trim"), XXO("Tri&m Audio"), FN(OnTrim), AudioIONotBusyFlag | TimeSelectedFlag | AudioTracksSelectedFlag, - wxT("Ctrl+T") ) + Options{ wxT("Ctrl+T") }.UseStrictFlags() ) ), Separator(), @@ -1180,10 +1182,11 @@ MenuTable::BaseItemPtr EditMenu( AudacityProject & ) Menu( _("Clip B&oundaries"), /* i18n-hint: (verb) It's an item on a menu. */ Command( wxT("Split"), XXO("Sp&lit"), FN(OnSplit), - AudioIONotBusyFlag | WaveTracksSelectedFlag, wxT("Ctrl+I") ), + AudioIONotBusyFlag | WaveTracksSelectedFlag, + Options{ wxT("Ctrl+I") }.UseStrictFlags() ), Command( wxT("SplitNew"), XXO("Split Ne&w"), FN(OnSplitNew), AudioIONotBusyFlag | TimeSelectedFlag | WaveTracksSelectedFlag, - wxT("Ctrl+Alt+I") ), + Options{ wxT("Ctrl+Alt+I") }.UseStrictFlags() ), Separator(), diff --git a/src/menus/FileMenus.cpp b/src/menus/FileMenus.cpp index 87a21699c..20b03e8cc 100644 --- a/src/menus/FileMenus.cpp +++ b/src/menus/FileMenus.cpp @@ -589,6 +589,7 @@ static CommandHandlerObject &findCommandHandler(AudacityProject &) { MenuTable::BaseItemPtr FileMenu( AudacityProject& ) { using namespace MenuTable; + using Options = CommandManager::Options; return Menu( _("&File"), /*i18n-hint: "New" is an action (verb) to create a NEW project*/ @@ -683,7 +684,8 @@ MenuTable::BaseItemPtr FileMenu( AudacityProject& ) // Enable Export Selection commands only when there's a selection. Command( wxT("ExportSel"), XXO("Expo&rt Selected Audio..."), FN(OnExportSelection), - AudioIONotBusyFlag | TimeSelectedFlag | WaveTracksSelectedFlag ), + AudioIONotBusyFlag | TimeSelectedFlag | WaveTracksSelectedFlag, + Options{}.UseStrictFlags() ), Command( wxT("ExportLabels"), XXO("Export &Labels..."), FN(OnExportLabels),