mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-04 17:49:45 +02:00
Simplify menu-building calls...
... Just one CommandManager::AddItem overload, instead of two plus two overloads of AddCheck. Also remove SetLongName. Use an options structure instead for all those distinctions. Also simplify all the repetition of equal flag and mask values. It's only in four cases where we need to make them different.
This commit is contained in:
commit
d46f3a9e63
1162
src/Menus.cpp
1162
src/Menus.cpp
File diff suppressed because it is too large
Load Diff
@ -2360,7 +2360,7 @@ void AudacityProject::OnMenu(wxCommandEvent & event)
|
||||
#endif
|
||||
bool handled = mCommandManager.HandleMenuID(
|
||||
event.GetId(), GetMenuManager(*this).GetUpdateFlags(*this),
|
||||
NoFlagsSpecifed);
|
||||
NoFlagsSpecified);
|
||||
|
||||
if (handled)
|
||||
event.Skip(false);
|
||||
|
@ -58,7 +58,7 @@ enum CommandFlag : unsigned long long
|
||||
AudioTracksSelectedFlag = 0x2000000000ULL,
|
||||
NoAutoSelect = 0x4000000000ULL, // jkc
|
||||
|
||||
NoFlagsSpecifed = ~0ULL
|
||||
NoFlagsSpecified = ~0ULL
|
||||
};
|
||||
|
||||
// Prevent accidental misuse with narrower types
|
||||
|
@ -434,7 +434,6 @@ CommandManager::CommandManager():
|
||||
bMakingOccultCommands( false )
|
||||
{
|
||||
mbSeparatorAllowed = false;
|
||||
mLongNameForItem = "";
|
||||
SetMaxList();
|
||||
}
|
||||
|
||||
@ -796,55 +795,20 @@ void CommandManager::InsertItem(const wxString & name,
|
||||
|
||||
|
||||
|
||||
void CommandManager::AddCheck(const wxChar *name,
|
||||
const wxChar *label,
|
||||
bool hasDialog,
|
||||
CommandHandlerFinder finder,
|
||||
CommandFunctorPointer callback,
|
||||
int checkmark)
|
||||
{
|
||||
AddItem(name, label, hasDialog, finder, callback, wxT(""),
|
||||
NoFlagsSpecifed, NoFlagsSpecifed, checkmark);
|
||||
}
|
||||
|
||||
void CommandManager::AddCheck(const wxChar *name,
|
||||
const wxChar *label,
|
||||
bool hasDialog,
|
||||
CommandHandlerFinder finder,
|
||||
CommandFunctorPointer callback,
|
||||
int checkmark,
|
||||
CommandFlag flags,
|
||||
CommandMask mask)
|
||||
{
|
||||
AddItem(name, label, hasDialog, finder, callback, wxT(""), flags, mask, checkmark);
|
||||
}
|
||||
|
||||
void CommandManager::AddItem(const wxChar *name,
|
||||
const wxChar *label,
|
||||
bool hasDialog,
|
||||
CommandHandlerFinder finder,
|
||||
CommandFunctorPointer callback,
|
||||
CommandFlag flags,
|
||||
CommandMask mask,
|
||||
bool bIsEffect,
|
||||
const CommandParameter ¶meter)
|
||||
{
|
||||
AddItem(name, label, hasDialog, finder, callback, wxT(""), flags, mask, -1, bIsEffect, parameter);
|
||||
}
|
||||
|
||||
void CommandManager::AddItem(const wxChar *name,
|
||||
const wxChar *label_in,
|
||||
bool hasDialog,
|
||||
CommandHandlerFinder finder,
|
||||
CommandFunctorPointer callback,
|
||||
const wxChar *accel,
|
||||
CommandFlag flags,
|
||||
CommandMask mask,
|
||||
int checkmark,
|
||||
bool bIsEffect,
|
||||
const CommandParameter ¶meter)
|
||||
const Options &options)
|
||||
{
|
||||
auto mask = options.mask;
|
||||
if (mask == NoFlagsSpecified)
|
||||
mask = flags;
|
||||
|
||||
wxString cookedParameter;
|
||||
const auto ¶meter = options.parameter;
|
||||
if( parameter == "" )
|
||||
cookedParameter = name;
|
||||
else
|
||||
@ -852,19 +816,19 @@ void CommandManager::AddItem(const wxChar *name,
|
||||
CommandListEntry *entry =
|
||||
NewIdentifier(name,
|
||||
label_in,
|
||||
mLongNameForItem,
|
||||
options.longName,
|
||||
hasDialog,
|
||||
accel, CurrentMenu(), finder, callback,
|
||||
{}, 0, 0, bIsEffect, cookedParameter);
|
||||
mLongNameForItem = "";
|
||||
options.accel, CurrentMenu(), finder, callback,
|
||||
{}, 0, 0, options.bIsEffect, cookedParameter);
|
||||
int ID = entry->id;
|
||||
wxString label = GetLabelWithDisabledAccel(entry);
|
||||
|
||||
if (flags != NoFlagsSpecifed || mask != NoFlagsSpecifed) {
|
||||
if (flags != NoFlagsSpecified || mask != NoFlagsSpecified) {
|
||||
SetCommandFlags(name, flags, mask);
|
||||
}
|
||||
|
||||
|
||||
auto checkmark = options.check;
|
||||
if (checkmark >= 0) {
|
||||
CurrentMenu()->AppendCheckItem(ID, label);
|
||||
CurrentMenu()->Check(ID, checkmark != 0);
|
||||
@ -914,10 +878,9 @@ void CommandManager::AddCommand(const wxChar *name,
|
||||
const wxChar *label,
|
||||
CommandHandlerFinder finder,
|
||||
CommandFunctorPointer callback,
|
||||
CommandFlag flags,
|
||||
CommandMask mask)
|
||||
CommandFlag flags)
|
||||
{
|
||||
AddCommand(name, label, finder, callback, wxT(""), flags, mask);
|
||||
AddCommand(name, label, finder, callback, wxT(""), flags);
|
||||
}
|
||||
|
||||
void CommandManager::AddCommand(const wxChar *name,
|
||||
@ -925,14 +888,12 @@ void CommandManager::AddCommand(const wxChar *name,
|
||||
CommandHandlerFinder finder,
|
||||
CommandFunctorPointer callback,
|
||||
const wxChar *accel,
|
||||
CommandFlag flags,
|
||||
CommandMask mask)
|
||||
CommandFlag flags)
|
||||
{
|
||||
NewIdentifier(name, label_in, label_in, false, accel, NULL, finder, callback, {}, 0, 0, false, {});
|
||||
|
||||
if (flags != NoFlagsSpecifed || mask != NoFlagsSpecifed) {
|
||||
SetCommandFlags(name, flags, mask);
|
||||
}
|
||||
if (flags != NoFlagsSpecified)
|
||||
SetCommandFlags(name, flags, flags);
|
||||
}
|
||||
|
||||
void CommandManager::AddGlobalCommand(const wxChar *name,
|
||||
@ -1465,7 +1426,7 @@ bool CommandManager::FilterKeyEvent(AudacityProject *project, const wxKeyEvent &
|
||||
// LL: Why do they need to be disabled???
|
||||
entry->enabled = false;
|
||||
auto cleanup = valueRestorer( entry->enabled, true );
|
||||
return HandleCommandEntry(entry, NoFlagsSpecifed, NoFlagsSpecifed, &evt);
|
||||
return HandleCommandEntry(entry, NoFlagsSpecified, NoFlagsSpecified, &evt);
|
||||
}
|
||||
|
||||
wxWindow * pFocus = wxWindow::FindFocus();
|
||||
@ -1542,12 +1503,12 @@ bool CommandManager::FilterKeyEvent(AudacityProject *project, const wxKeyEvent &
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return HandleCommandEntry(entry, flags, NoFlagsSpecifed, &temp);
|
||||
return HandleCommandEntry(entry, flags, NoFlagsSpecified, &temp);
|
||||
}
|
||||
|
||||
if (type == wxEVT_KEY_UP && entry->wantKeyup)
|
||||
{
|
||||
return HandleCommandEntry(entry, flags, NoFlagsSpecifed, &temp);
|
||||
return HandleCommandEntry(entry, flags, NoFlagsSpecified, &temp);
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -1912,6 +1873,8 @@ void CommandManager::WriteXML(XMLWriter &xmlFile) const
|
||||
|
||||
void CommandManager::SetDefaultFlags(CommandFlag flags, CommandMask mask)
|
||||
{
|
||||
if (mask == NoFlagsSpecified)
|
||||
mask = flags;
|
||||
mDefaultFlags = flags;
|
||||
mDefaultMask = mask;
|
||||
}
|
||||
@ -1931,29 +1894,6 @@ void CommandManager::SetCommandFlags(const wxString &name,
|
||||
}
|
||||
}
|
||||
|
||||
void CommandManager::SetCommandFlags(const wxChar **names,
|
||||
CommandFlag flags, CommandMask mask)
|
||||
{
|
||||
const wxChar **nptr = names;
|
||||
while(*nptr) {
|
||||
SetCommandFlags(wxString(*nptr), flags, mask);
|
||||
nptr++;
|
||||
}
|
||||
}
|
||||
|
||||
void CommandManager::SetCommandFlags(CommandFlag flags, CommandMask mask, ...)
|
||||
{
|
||||
va_list list;
|
||||
va_start(list, mask);
|
||||
for(;;) {
|
||||
const wxChar *name = va_arg(list, const wxChar *);
|
||||
if (!name)
|
||||
break;
|
||||
SetCommandFlags(wxString(name), flags, mask);
|
||||
}
|
||||
va_end(list);
|
||||
}
|
||||
|
||||
#if defined(__WXDEBUG__)
|
||||
void CommandManager::CheckDups()
|
||||
{
|
||||
|
@ -155,6 +155,38 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler
|
||||
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_ } {}
|
||||
// A two-argument constructor for another common case
|
||||
Options( const wxChar *accel_, const wxString &longName_ )
|
||||
: accel{ accel_ }, longName{ longName_ } {}
|
||||
|
||||
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); }
|
||||
Options &&LongName (const wxString &value) &&
|
||||
{ longName = 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 };
|
||||
wxString longName{}; // translated
|
||||
};
|
||||
|
||||
void AddItemList(const wxString & name,
|
||||
const TranslatedInternalString items[],
|
||||
size_t nItems,
|
||||
@ -162,43 +194,13 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler
|
||||
CommandFunctorPointer callback,
|
||||
bool bIsEffect = false);
|
||||
|
||||
void AddCheck(const wxChar *name,
|
||||
const wxChar *label,
|
||||
bool hasDialog,
|
||||
CommandHandlerFinder finder,
|
||||
CommandFunctorPointer callback,
|
||||
int checkmark = 0);
|
||||
|
||||
void AddCheck(const wxChar *name,
|
||||
const wxChar *label,
|
||||
bool hasDialog,
|
||||
CommandHandlerFinder finder,
|
||||
CommandFunctorPointer callback,
|
||||
int checkmark,
|
||||
CommandFlag flags,
|
||||
CommandMask mask);
|
||||
|
||||
void AddItem(const wxChar *name,
|
||||
const wxChar *label,
|
||||
bool hasDialog,
|
||||
CommandHandlerFinder finder,
|
||||
CommandFunctorPointer callback,
|
||||
CommandFlag flags = NoFlagsSpecifed,
|
||||
CommandMask mask = NoFlagsSpecifed,
|
||||
bool bIsEffect = false,
|
||||
const CommandParameter ¶meter = CommandParameter{});
|
||||
|
||||
void AddItem(const wxChar *name,
|
||||
const wxChar *label_in,
|
||||
bool hasDialog,
|
||||
CommandHandlerFinder finder,
|
||||
CommandFunctorPointer callback,
|
||||
const wxChar *accel,
|
||||
CommandFlag flags = NoFlagsSpecifed,
|
||||
CommandMask mask = NoFlagsSpecifed,
|
||||
int checkmark = -1,
|
||||
bool bIsEffect = false,
|
||||
const CommandParameter ¶meter = CommandParameter{});
|
||||
CommandFlag flags = NoFlagsSpecified,
|
||||
const Options &options = {});
|
||||
|
||||
void AddSeparator();
|
||||
|
||||
@ -208,16 +210,14 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler
|
||||
const wxChar *label,
|
||||
CommandHandlerFinder finder,
|
||||
CommandFunctorPointer callback,
|
||||
CommandFlag flags = NoFlagsSpecifed,
|
||||
CommandMask mask = NoFlagsSpecifed);
|
||||
CommandFlag flags = NoFlagsSpecified);
|
||||
|
||||
void AddCommand(const wxChar *name,
|
||||
const wxChar *label,
|
||||
CommandHandlerFinder finder,
|
||||
CommandFunctorPointer callback,
|
||||
const wxChar *accel,
|
||||
CommandFlag flags = NoFlagsSpecifed,
|
||||
CommandMask mask = NoFlagsSpecifed);
|
||||
CommandFlag flags = NoFlagsSpecified);
|
||||
|
||||
void AddGlobalCommand(const wxChar *name,
|
||||
const wxChar *label,
|
||||
@ -230,23 +230,15 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler
|
||||
//
|
||||
|
||||
// For NEW items/commands
|
||||
void SetDefaultFlags(CommandFlag flags, CommandMask mask);
|
||||
void SetDefaultFlags(CommandFlag flags, CommandMask mask = NoFlagsSpecified);
|
||||
CommandFlag GetDefaultFlags() const { return mDefaultFlags; }
|
||||
CommandMask GetDefaultMask() const { return mDefaultMask; }
|
||||
|
||||
void SwapMenuBars();
|
||||
void SetOccultCommands( bool bOccult);
|
||||
CommandManager * SetLongName( const wxString & name ){
|
||||
mLongNameForItem = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
void SetCommandFlags(const wxString &name, CommandFlag flags, CommandMask mask);
|
||||
void SetCommandFlags(const wxChar **names,
|
||||
CommandFlag flags, CommandMask mask);
|
||||
// Pass multiple command names as const wxChar *, terminated by NULL
|
||||
void SetCommandFlags(CommandFlag flags, CommandMask mask, ...);
|
||||
|
||||
//
|
||||
// Modifying menus
|
||||
@ -413,8 +405,6 @@ private:
|
||||
std::unique_ptr<wxMenu> uCurrentMenu;
|
||||
wxMenu *mCurrentMenu {};
|
||||
|
||||
wxString mLongNameForItem;
|
||||
|
||||
CommandFlag mDefaultFlags;
|
||||
CommandMask mDefaultMask;
|
||||
bool bMakingOccultCommands;
|
||||
|
@ -302,7 +302,7 @@ void EditToolBar::OnButton(wxCommandEvent &event)
|
||||
|
||||
auto flags = GetMenuManager(*p).GetUpdateFlags(*p);
|
||||
const CommandContext context( *GetActiveProject() );
|
||||
cm->HandleTextualCommand(EditToolbarButtonList[id].commandName, context, flags, NoFlagsSpecifed);
|
||||
cm->HandleTextualCommand(EditToolbarButtonList[id].commandName, context, flags, NoFlagsSpecified);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1161,19 +1161,19 @@ void Scrubber::AddMenuItems()
|
||||
cm->BeginSubMenu(_("Scru&bbing"));
|
||||
for (const auto &item : menuItems) {
|
||||
if (item.StatusTest)
|
||||
cm->AddCheck(item.name, wxGetTranslation(item.label),
|
||||
cm->AddItem( item.name, wxGetTranslation(item.label),
|
||||
// No menu items yet have dialogs
|
||||
false,
|
||||
findme, static_cast<CommandFunctorPointer>(item.memFn),
|
||||
false,
|
||||
item.flags, item.flags);
|
||||
item.flags,
|
||||
CommandManager::Options{}.CheckState( false ) );
|
||||
else
|
||||
// The start item
|
||||
cm->AddItem(item.name, wxGetTranslation(item.label),
|
||||
cm->AddItem( item.name, wxGetTranslation(item.label),
|
||||
// No menu items yet have dialogs
|
||||
false,
|
||||
findme, static_cast<CommandFunctorPointer>(item.memFn),
|
||||
item.flags, item.flags);
|
||||
item.flags );
|
||||
}
|
||||
cm->EndSubMenu();
|
||||
CheckMenuItems();
|
||||
|
Loading…
x
Reference in New Issue
Block a user