1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-02 16:49:41 +02:00

Reimplement the rejection of select-all-on-none for certain commands...

... Specify it in the menu descriptions.  Don't put special ad hoc logic
in Menus.cpp.
This commit is contained in:
Paul Licameli 2019-06-08 23:48:42 -04:00
parent 3847b66638
commit a34f1cbba5
5 changed files with 34 additions and 42 deletions

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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(),

View File

@ -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),