1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-07 23:51:14 +02:00

struct CommandManager::Options lets us fold AddCheck into AddItem

This commit is contained in:
Paul Licameli 2018-10-17 12:45:30 -04:00
parent de4132d66c
commit cfe7ddcf55
4 changed files with 106 additions and 92 deletions

View File

@ -360,6 +360,10 @@ static CommandHandlerObject &findMenuCommandHandler(AudacityProject &project)
void MenuCreator::CreateMenusAndCommands(AudacityProject &project) void MenuCreator::CreateMenusAndCommands(AudacityProject &project)
{ {
using Options = CommandManager::Options;
const Options checkOff = Options{}.CheckState( false );
const Options checkOn = Options{}.CheckState( true );
CommandManager *c = project.GetCommandManager(); CommandManager *c = project.GetCommandManager();
// The list of defaults to exclude depends on // The list of defaults to exclude depends on
@ -489,7 +493,7 @@ void MenuCreator::CreateMenusAndCommands(AudacityProject &project)
AudioIONotBusyFlag | UndoAvailableFlag, wxT("Ctrl+Z")); AudioIONotBusyFlag | UndoAvailableFlag, wxT("Ctrl+Z"));
// The default shortcut key for Redo is different on different platforms. // The default shortcut key for Redo is different on different platforms.
wxString key = auto key =
#ifdef __WXMSW__ #ifdef __WXMSW__
wxT("Ctrl+Y"); wxT("Ctrl+Y");
#else #else
@ -506,13 +510,13 @@ void MenuCreator::CreateMenusAndCommands(AudacityProject &project)
// Basic Edit coomands // Basic Edit coomands
/* i18n-hint: (verb)*/ /* i18n-hint: (verb)*/
c->AddItem(wxT("Cut"), XXO("Cu&t"), FN(OnCut), c->AddItem(wxT("Cut"), XXO("Cu&t"), FN(OnCut),
AudioIONotBusyFlag | CutCopyAvailableFlag | NoAutoSelect, wxT("Ctrl+X"), AudioIONotBusyFlag | CutCopyAvailableFlag | NoAutoSelect,
-1, false, {}, Options{ wxT("Ctrl+X") }
AudioIONotBusyFlag | CutCopyAvailableFlag); .Mask( AudioIONotBusyFlag | CutCopyAvailableFlag ) );
c->AddItem(wxT("Delete"), XXO("&Delete"), FN(OnDelete), c->AddItem(wxT("Delete"), XXO("&Delete"), FN(OnDelete),
AudioIONotBusyFlag | NoAutoSelect, wxT("Ctrl+K"), AudioIONotBusyFlag | NoAutoSelect,
-1, false, {}, Options{ wxT("Ctrl+K") }
AudioIONotBusyFlag ); .Mask( AudioIONotBusyFlag ) );
/* i18n-hint: (verb)*/ /* i18n-hint: (verb)*/
c->AddItem(wxT("Copy"), XXO("&Copy"), FN(OnCopy), c->AddItem(wxT("Copy"), XXO("&Copy"), FN(OnCopy),
AudioIONotBusyFlag | CutCopyAvailableFlag, wxT("Ctrl+C")); AudioIONotBusyFlag | CutCopyAvailableFlag, wxT("Ctrl+C"));
@ -582,8 +586,8 @@ void MenuCreator::CreateMenusAndCommands(AudacityProject &project)
c->AddSeparator(); c->AddSeparator();
c->AddCheck(wxT("TypeToCreateLabel"), XXO("&Type to Create a Label (on/off)"), c->AddItem(wxT("TypeToCreateLabel"), XXO("&Type to Create a Label (on/off)"),
FN(OnToggleTypeToCreateLabel), 0, AlwaysEnabledFlag); FN(OnToggleTypeToCreateLabel), AlwaysEnabledFlag, checkOff);
c->EndSubMenu(); c->EndSubMenu();
@ -820,44 +824,46 @@ void MenuCreator::CreateMenusAndCommands(AudacityProject &project)
c->AddSeparator(); c->AddSeparator();
/* i18n-hint: Clicking this menu item shows the toolbar with the big buttons on it (play record etc)*/ /* i18n-hint: Clicking this menu item shows the toolbar with the big buttons on it (play record etc)*/
c->AddCheck(wxT("ShowTransportTB"), XXO("&Transport Toolbar"), FN(OnShowTransportToolBar), 0, AlwaysEnabledFlag); c->AddItem(wxT("ShowTransportTB"), XXO("&Transport Toolbar"), FN(OnShowTransportToolBar), AlwaysEnabledFlag, checkOff);
/* i18n-hint: Clicking this menu item shows a toolbar that has some tools in it*/ /* i18n-hint: Clicking this menu item shows a toolbar that has some tools in it*/
c->AddCheck(wxT("ShowToolsTB"), XXO("T&ools Toolbar"), FN(OnShowToolsToolBar), 0, AlwaysEnabledFlag); c->AddItem(wxT("ShowToolsTB"), XXO("T&ools Toolbar"), FN(OnShowToolsToolBar), AlwaysEnabledFlag, checkOff);
/* i18n-hint: Clicking this menu item shows the toolbar with the recording level meters*/ /* i18n-hint: Clicking this menu item shows the toolbar with the recording level meters*/
c->AddCheck(wxT("ShowRecordMeterTB"), XXO("&Recording Meter Toolbar"), FN(OnShowRecordMeterToolBar), 0, AlwaysEnabledFlag); c->AddItem(wxT("ShowRecordMeterTB"), XXO("&Recording Meter Toolbar"), FN(OnShowRecordMeterToolBar), AlwaysEnabledFlag, checkOff);
/* i18n-hint: Clicking this menu item shows the toolbar with the playback level meter*/ /* i18n-hint: Clicking this menu item shows the toolbar with the playback level meter*/
c->AddCheck(wxT("ShowPlayMeterTB"), XXO("&Playback Meter Toolbar"), FN(OnShowPlayMeterToolBar), 0, AlwaysEnabledFlag); c->AddItem(wxT("ShowPlayMeterTB"), XXO("&Playback Meter Toolbar"), FN(OnShowPlayMeterToolBar), AlwaysEnabledFlag, checkOff);
/* --i18nhint: Clicking this menu item shows the toolbar which has sound level meters*/ /* --i18nhint: Clicking this menu item shows the toolbar which has sound level meters*/
//c->AddCheck(wxT("ShowMeterTB"), XXO("Co&mbined Meter Toolbar"), FN(OnShowMeterToolBar), 0, AlwaysEnabledFlag); //c->AddItem(wxT("ShowMeterTB"), XXO("Co&mbined Meter Toolbar"), FN(OnShowMeterToolBar), AlwaysEnabledFlag, checkOff);
/* i18n-hint: Clicking this menu item shows the toolbar with the mixer*/ /* i18n-hint: Clicking this menu item shows the toolbar with the mixer*/
c->AddCheck(wxT("ShowMixerTB"), XXO("Mi&xer Toolbar"), FN(OnShowMixerToolBar), 0, AlwaysEnabledFlag); c->AddItem(wxT("ShowMixerTB"), XXO("Mi&xer Toolbar"), FN(OnShowMixerToolBar), AlwaysEnabledFlag, checkOff);
/* i18n-hint: Clicking this menu item shows the toolbar for editing*/ /* i18n-hint: Clicking this menu item shows the toolbar for editing*/
c->AddCheck(wxT("ShowEditTB"), XXO("&Edit Toolbar"), FN(OnShowEditToolBar), 0, AlwaysEnabledFlag); c->AddItem(wxT("ShowEditTB"), XXO("&Edit Toolbar"), FN(OnShowEditToolBar), AlwaysEnabledFlag, checkOff);
/* i18n-hint: Clicking this menu item shows the toolbar for transcription (currently just vary play speed)*/ /* i18n-hint: Clicking this menu item shows the toolbar for transcription (currently just vary play speed)*/
c->AddCheck(wxT("ShowTranscriptionTB"), XXO("Pla&y-at-Speed Toolbar"), FN(OnShowTranscriptionToolBar), 0, AlwaysEnabledFlag); c->AddItem(wxT("ShowTranscriptionTB"), XXO("Pla&y-at-Speed Toolbar"), FN(OnShowTranscriptionToolBar), AlwaysEnabledFlag, checkOff);
/* i18n-hint: Clicking this menu item shows the toolbar that enables Scrub or Seek playback and Scrub Ruler*/ /* i18n-hint: Clicking this menu item shows the toolbar that enables Scrub or Seek playback and Scrub Ruler*/
c->AddCheck(wxT("ShowScrubbingTB"), XXO("Scru&b Toolbar"), FN(OnShowScrubbingToolBar), 0, AlwaysEnabledFlag); c->AddItem(wxT("ShowScrubbingTB"), XXO("Scru&b Toolbar"), FN(OnShowScrubbingToolBar), AlwaysEnabledFlag, checkOff);
/* i18n-hint: Clicking this menu item shows the toolbar that manages devices*/ /* i18n-hint: Clicking this menu item shows the toolbar that manages devices*/
c->AddCheck(wxT("ShowDeviceTB"), XXO("&Device Toolbar"), FN(OnShowDeviceToolBar), 0, AlwaysEnabledFlag); c->AddItem(wxT("ShowDeviceTB"), XXO("&Device Toolbar"), FN(OnShowDeviceToolBar), AlwaysEnabledFlag, checkOff);
/* i18n-hint: Clicking this menu item shows the toolbar for selecting a time range of audio*/ /* i18n-hint: Clicking this menu item shows the toolbar for selecting a time range of audio*/
c->AddCheck(wxT("ShowSelectionTB"), XXO("&Selection Toolbar"), FN(OnShowSelectionToolBar), 0, AlwaysEnabledFlag); c->AddItem(wxT("ShowSelectionTB"), XXO("&Selection Toolbar"), FN(OnShowSelectionToolBar), AlwaysEnabledFlag, checkOff);
#ifdef EXPERIMENTAL_SPECTRAL_EDITING #ifdef EXPERIMENTAL_SPECTRAL_EDITING
/* i18n-hint: Clicking this menu item shows the toolbar for selecting a frequency range of audio*/ /* i18n-hint: Clicking this menu item shows the toolbar for selecting a frequency range of audio*/
c->AddCheck(wxT("ShowSpectralSelectionTB"), XXO("Spe&ctral Selection Toolbar"), FN(OnShowSpectralSelectionToolBar), 0, AlwaysEnabledFlag); c->AddItem(wxT("ShowSpectralSelectionTB"), XXO("Spe&ctral Selection Toolbar"), FN(OnShowSpectralSelectionToolBar), AlwaysEnabledFlag, checkOff);
#endif #endif
c->EndSubMenu(); c->EndSubMenu();
c->AddSeparator(); c->AddSeparator();
c->AddCheck(wxT("ShowExtraMenus"), XXO("&Extra Menus (on/off)"), FN(OnShowExtraMenus), c->AddItem(wxT("ShowExtraMenus"), XXO("&Extra Menus (on/off)"), FN(OnShowExtraMenus),
gPrefs->Read(wxT("/GUI/ShowExtraMenus"), 0L), AlwaysEnabledFlag); AlwaysEnabledFlag,
c->AddCheck(wxT("ShowClipping"), XXO("&Show Clipping (on/off)"), FN(OnShowClipping), Options{}.CheckState( gPrefs->Read(wxT("/GUI/ShowExtraMenus"), 0L) ) );
gPrefs->Read(wxT("/GUI/ShowClipping"), 0L), AlwaysEnabledFlag); c->AddItem(wxT("ShowClipping"), XXO("&Show Clipping (on/off)"), FN(OnShowClipping),
AlwaysEnabledFlag,
Options{}.CheckState( gPrefs->Read(wxT("/GUI/ShowClipping"), 0L) ) );
#if defined(EXPERIMENTAL_EFFECTS_RACK) #if defined(EXPERIMENTAL_EFFECTS_RACK)
c->AddCheck(wxT("ShowEffectsRack"), XXO("Show Effects Rack"), FN(OnShowEffectsRack), 0, AlwaysEnabledFlag); c->AddItem(wxT("ShowEffectsRack"), XXO("Show Effects Rack"), FN(OnShowEffectsRack), AlwaysEnabledFlag, checkOff);
#endif #endif
@ -961,24 +967,24 @@ void MenuCreator::CreateMenusAndCommands(AudacityProject &project)
// Sound Activated recording options // Sound Activated recording options
c->AddItem(wxT("SoundActivationLevel"), XXO("Sound Activation Le&vel..."), FN(OnSoundActivated), c->AddItem(wxT("SoundActivationLevel"), XXO("Sound Activation Le&vel..."), FN(OnSoundActivated),
AudioIONotBusyFlag | CanStopAudioStreamFlag); AudioIONotBusyFlag | CanStopAudioStreamFlag);
c->AddCheck(wxT("SoundActivation"), XXO("Sound A&ctivated Recording (on/off)"), FN(OnToggleSoundActivated), 0, c->AddItem(wxT("SoundActivation"), XXO("Sound A&ctivated Recording (on/off)"), FN(OnToggleSoundActivated),
AudioIONotBusyFlag | CanStopAudioStreamFlag); AudioIONotBusyFlag | CanStopAudioStreamFlag, checkOff);
c->AddSeparator(); c->AddSeparator();
c->AddCheck(wxT("PinnedHead"), XXO("Pinned Play/Record &Head (on/off)"), c->AddItem(wxT("PinnedHead"), XXO("Pinned Play/Record &Head (on/off)"),
FN(OnTogglePinnedHead), 0, FN(OnTogglePinnedHead),
// Switching of scrolling on and off is permitted even during transport // Switching of scrolling on and off is permitted even during transport
AlwaysEnabledFlag); AlwaysEnabledFlag, checkOff);
c->AddCheck(wxT("Overdub"), XXO("&Overdub (on/off)"), FN(OnTogglePlayRecording), 1, c->AddItem(wxT("Overdub"), XXO("&Overdub (on/off)"), FN(OnTogglePlayRecording),
AudioIONotBusyFlag | CanStopAudioStreamFlag); AudioIONotBusyFlag | CanStopAudioStreamFlag, checkOn);
c->AddCheck(wxT("SWPlaythrough"), XXO("So&ftware Playthrough (on/off)"), FN(OnToggleSWPlaythrough), 0, c->AddItem(wxT("SWPlaythrough"), XXO("So&ftware Playthrough (on/off)"), FN(OnToggleSWPlaythrough),
AudioIONotBusyFlag | CanStopAudioStreamFlag); AudioIONotBusyFlag | CanStopAudioStreamFlag, checkOff);
#ifdef EXPERIMENTAL_AUTOMATED_INPUT_LEVEL_ADJUSTMENT #ifdef EXPERIMENTAL_AUTOMATED_INPUT_LEVEL_ADJUSTMENT
c->AddCheck(wxT("AutomatedInputLevelAdjustmentOnOff"), XXO("A&utomated Recording Level Adjustment (on/off)"), FN(OnToggleAutomatedInputLevelAdjustment), 0, c->AddItem(wxT("AutomatedInputLevelAdjustmentOnOff"), XXO("A&utomated Recording Level Adjustment (on/off)"), FN(OnToggleAutomatedInputLevelAdjustment),
AudioIONotBusyFlag | CanStopAudioStreamFlag); AudioIONotBusyFlag | CanStopAudioStreamFlag, checkOff);
#endif #endif
c->EndSubMenu(); c->EndSubMenu();
@ -1076,10 +1082,10 @@ void MenuCreator::CreateMenusAndCommands(AudacityProject &project)
c->AddSeparator(); c->AddSeparator();
c->AddItemList(wxT("Align"), alignLabels, mAlignLabelsCount, FN(OnAlign)); c->AddItemList(wxT("Align"), alignLabels, mAlignLabelsCount, FN(OnAlign));
c->AddSeparator(); c->AddSeparator();
c->AddCheck(wxT("MoveSelectionWithTracks"), XXO("&Move Selection with Tracks (on/off)"), c->AddItem(wxT("MoveSelectionWithTracks"), XXO("&Move Selection with Tracks (on/off)"),
FN(OnMoveSelectionWithTracks), FN(OnMoveSelectionWithTracks),
gPrefs->Read(wxT("/GUI/MoveSelectionWithTracks"), 0L), AlwaysEnabledFlag,
AlwaysEnabledFlag); Options{}.CheckState( gPrefs->Read(wxT("/GUI/MoveSelectionWithTracks"), 0L ) ) );
c->EndSubMenu(); c->EndSubMenu();
#if 0 #if 0
@ -1119,9 +1125,9 @@ void MenuCreator::CreateMenusAndCommands(AudacityProject &project)
#ifdef EXPERIMENTAL_SYNC_LOCK #ifdef EXPERIMENTAL_SYNC_LOCK
c->AddSeparator(); c->AddSeparator();
c->AddCheck(wxT("SyncLock"), XXO("Sync-&Lock Tracks (on/off)"), FN(OnSyncLock), c->AddItem(wxT("SyncLock"), XXO("Sync-&Lock Tracks (on/off)"), FN(OnSyncLock),
gPrefs->Read(wxT("/GUI/SyncLockTracks"), 0L), AlwaysEnabledFlag,
AlwaysEnabledFlag); Options{}.CheckState( gPrefs->Read(wxT("/GUI/SyncLockTracks"), 0L) ) );
#endif #endif
@ -1246,14 +1252,16 @@ void MenuCreator::CreateMenusAndCommands(AudacityProject &project)
#ifdef IS_ALPHA #ifdef IS_ALPHA
c->AddSeparator(); c->AddSeparator();
c->AddCheck(wxT("SimulateRecordingErrors"), c->AddItem(wxT("SimulateRecordingErrors"),
XXO("Simulate Recording Errors"), XXO("Simulate Recording Errors"),
FN(OnSimulateRecordingErrors), FN(OnSimulateRecordingErrors),
gAudioIO->mSimulateRecordingErrors); NoFlagsSpecified,
c->AddCheck(wxT("DetectUpstreamDropouts"), Options{}.CheckState( gAudioIO->mSimulateRecordingErrors ) );
c->AddItem(wxT("DetectUpstreamDropouts"),
XXO("Detect Upstream Dropouts"), XXO("Detect Upstream Dropouts"),
FN(OnDetectUpstreamDropouts), FN(OnDetectUpstreamDropouts),
gAudioIO->mDetectUpstreamDropouts); NoFlagsSpecified,
Options{}.CheckState( gAudioIO->mDetectUpstreamDropouts ) );
#endif #endif
c->EndMenu(); c->EndMenu();
@ -1369,15 +1377,13 @@ void MenuCreator::CreateMenusAndCommands(AudacityProject &project)
c->AddItem(wxT("DeleteKey"), XXO("&Delete Key"), FN(OnDelete), c->AddItem(wxT("DeleteKey"), XXO("&Delete Key"), FN(OnDelete),
AudioIONotBusyFlag | TracksSelectedFlag | TimeSelectedFlag | NoAutoSelect, AudioIONotBusyFlag | TracksSelectedFlag | TimeSelectedFlag | NoAutoSelect,
wxT("Backspace"), Options{ wxT("Backspace") }
-1, false, {}, .Mask( AudioIONotBusyFlag | TracksSelectedFlag | TimeSelectedFlag ) );
AudioIONotBusyFlag | TracksSelectedFlag | TimeSelectedFlag);
c->AddItem(wxT("DeleteKey2"), XXO("Delete Key&2"), FN(OnDelete), c->AddItem(wxT("DeleteKey2"), XXO("Delete Key&2"), FN(OnDelete),
AudioIONotBusyFlag | TracksSelectedFlag | TimeSelectedFlag | NoAutoSelect, AudioIONotBusyFlag | TracksSelectedFlag | TimeSelectedFlag | NoAutoSelect,
wxT("Delete"), Options{ wxT("Delete") }
-1, false, {}, .Mask( AudioIONotBusyFlag | TracksSelectedFlag | TimeSelectedFlag ) );
AudioIONotBusyFlag | TracksSelectedFlag | TimeSelectedFlag);
c->EndSubMenu(); c->EndSubMenu();
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@ -1618,12 +1624,14 @@ void MenuCreator::CreateMenusAndCommands(AudacityProject &project)
// Accel key is not bindable. // Accel key is not bindable.
c->AddItem(wxT("FullScreenOnOff"), XXO("&Full Screen (on/off)"), FN(OnFullScreen), c->AddItem(wxT("FullScreenOnOff"), XXO("&Full Screen (on/off)"), FN(OnFullScreen),
AlwaysEnabledFlag, AlwaysEnabledFlag,
Options{
#ifdef __WXMAC__ #ifdef __WXMAC__
wxT("Ctrl+/"), wxT("Ctrl+/"),
#else #else
wxT("F11"), wxT("F11"),
#endif #endif
project.wxTopLevelWindow::IsFullScreen() ? 1:0); // Check Mark. }
.CheckState( project.wxTopLevelWindow::IsFullScreen() ) );
#ifdef __WXMAC__ #ifdef __WXMAC__
/* i18n-hint: Shrink all project windows to icons on the Macintosh tooldock */ /* i18n-hint: Shrink all project windows to icons on the Macintosh tooldock */
@ -2016,7 +2024,9 @@ void MenuCreator::AddEffectMenuItemGroup(CommandManager *c,
item, item,
item.Contains("..."), item.Contains("..."),
FN(OnEffect), FN(OnEffect),
flags[i], wxT(""), -1, true, plugs[i]); flags[i],
CommandManager::Options{}
.IsEffect().Parameter( plugs[i] ) );
i++; i++;
} }
@ -2031,7 +2041,9 @@ void MenuCreator::AddEffectMenuItemGroup(CommandManager *c,
names[i], names[i],
vHasDialog[i], vHasDialog[i],
FN(OnEffect), FN(OnEffect),
flags[i], wxT(""), -1, true, plugs[i]); flags[i],
CommandManager::Options{}
.IsEffect().Parameter( plugs[i] ) );
} }
if (max > 0) if (max > 0)

View File

@ -796,33 +796,20 @@ void CommandManager::InsertItem(const wxString & name,
void CommandManager::AddCheck(const wxChar *name,
const wxChar *label,
bool hasDialog,
CommandHandlerFinder finder,
CommandFunctorPointer callback,
int checkmark,
CommandFlag flags)
{
AddItem(name, label, hasDialog, finder, callback, flags, wxT(""), checkmark);
}
void CommandManager::AddItem(const wxChar *name, void CommandManager::AddItem(const wxChar *name,
const wxChar *label_in, const wxChar *label_in,
bool hasDialog, bool hasDialog,
CommandHandlerFinder finder, CommandHandlerFinder finder,
CommandFunctorPointer callback, CommandFunctorPointer callback,
CommandFlag flags, CommandFlag flags,
const wxChar *accel, const Options &options)
int checkmark,
bool bIsEffect,
const CommandParameter &parameter,
CommandMask mask)
{ {
auto mask = options.mask;
if (mask == NoFlagsSpecified) if (mask == NoFlagsSpecified)
mask = flags; mask = flags;
wxString cookedParameter; wxString cookedParameter;
const auto &parameter = options.parameter;
if( parameter == "" ) if( parameter == "" )
cookedParameter = name; cookedParameter = name;
else else
@ -832,8 +819,8 @@ void CommandManager::AddItem(const wxChar *name,
label_in, label_in,
mLongNameForItem, mLongNameForItem,
hasDialog, hasDialog,
accel, CurrentMenu(), finder, callback, options.accel, CurrentMenu(), finder, callback,
{}, 0, 0, bIsEffect, cookedParameter); {}, 0, 0, options.bIsEffect, cookedParameter);
mLongNameForItem = ""; mLongNameForItem = "";
int ID = entry->id; int ID = entry->id;
wxString label = GetLabelWithDisabledAccel(entry); wxString label = GetLabelWithDisabledAccel(entry);
@ -843,6 +830,7 @@ void CommandManager::AddItem(const wxChar *name,
} }
auto checkmark = options.check;
if (checkmark >= 0) { if (checkmark >= 0) {
CurrentMenu()->AppendCheckItem(ID, label); CurrentMenu()->AppendCheckItem(ID, label);
CurrentMenu()->Check(ID, checkmark != 0); CurrentMenu()->Check(ID, checkmark != 0);

View File

@ -155,6 +155,32 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler
int checkmark = -1); int checkmark = -1);
*/ */
// For specifying unusual arguments in AddItem
struct Options
{
Options() {}
// Allow implicit construction from an accelerator string, which is
// a very common case
Options( const wxChar *accel_ ) : accel{ accel_ } {}
Options &&Accel (const wxChar *value) &&
{ accel = value; return std::move(*this); }
Options &&CheckState (bool value) &&
{ check = value ? 1 : 0; return std::move(*this); }
Options &&IsEffect () &&
{ bIsEffect = true; return std::move(*this); }
Options &&Parameter (const CommandParameter &value) &&
{ parameter = value; return std::move(*this); }
Options &&Mask (CommandMask value) &&
{ mask = value; return std::move(*this); }
const wxChar *accel{ wxT("") };
int check{ -1 }; // default value means it's not a check item
bool bIsEffect{ false };
CommandParameter parameter{};
CommandMask mask{ NoFlagsSpecified };
};
void AddItemList(const wxString & name, void AddItemList(const wxString & name,
const TranslatedInternalString items[], const TranslatedInternalString items[],
size_t nItems, size_t nItems,
@ -162,25 +188,13 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler
CommandFunctorPointer callback, CommandFunctorPointer callback,
bool bIsEffect = false); bool bIsEffect = false);
void AddCheck(const wxChar *name,
const wxChar *label,
bool hasDialog,
CommandHandlerFinder finder,
CommandFunctorPointer callback,
int checkmark = 0,
CommandFlag flags = NoFlagsSpecified);
void AddItem(const wxChar *name, void AddItem(const wxChar *name,
const wxChar *label_in, const wxChar *label_in,
bool hasDialog, bool hasDialog,
CommandHandlerFinder finder, CommandHandlerFinder finder,
CommandFunctorPointer callback, CommandFunctorPointer callback,
CommandFlag flags = NoFlagsSpecified, CommandFlag flags = NoFlagsSpecified,
const wxChar *accel = wxT(""), const Options &options = {});
int checkmark = -1,
bool bIsEffect = false,
const CommandParameter &parameter = CommandParameter{},
CommandMask mask = NoFlagsSpecified);
void AddSeparator(); void AddSeparator();

View File

@ -1161,12 +1161,12 @@ void Scrubber::AddMenuItems()
cm->BeginSubMenu(_("Scru&bbing")); cm->BeginSubMenu(_("Scru&bbing"));
for (const auto &item : menuItems) { for (const auto &item : menuItems) {
if (item.StatusTest) if (item.StatusTest)
cm->AddCheck(item.name, wxGetTranslation(item.label), cm->AddItem( item.name, wxGetTranslation(item.label),
// No menu items yet have dialogs // No menu items yet have dialogs
false, false,
findme, static_cast<CommandFunctorPointer>(item.memFn), findme, static_cast<CommandFunctorPointer>(item.memFn),
false, item.flags,
item.flags); CommandManager::Options{}.CheckState( false ) );
else else
// The start item // The start item
cm->AddItem( item.name, wxGetTranslation(item.label), cm->AddItem( item.name, wxGetTranslation(item.label),