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:
parent
3847b66638
commit
a34f1cbba5
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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(),
|
||||
|
||||
|
@ -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),
|
||||
|
Loading…
x
Reference in New Issue
Block a user