1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-16 16:10:06 +02:00

Pair CommandHandlerFinder with functor everywhere, but not used yet

This commit is contained in:
Paul Licameli 2017-08-19 08:45:35 -04:00
parent d263eaa97b
commit 6dead232f2
5 changed files with 89 additions and 34 deletions

View File

@ -285,6 +285,11 @@ static int SortEffectsByType(const PluginDescriptor **a, const PluginDescriptor
/// changes in configured preferences - for example changes in key-bindings /// changes in configured preferences - for example changes in key-bindings
/// affect the short-cut key legend that appears beside each command, /// affect the short-cut key legend that appears beside each command,
// To supply the "finder" argument in AddItem calls
static CommandHandlerObject &ident(AudacityProject &project) { return project; }
#define FN(X) ident, FNT(AudacityProject, this, & AudacityProject :: X)
void AudacityProject::CreateMenusAndCommands() void AudacityProject::CreateMenusAndCommands()
{ {
CommandManager *c = &mCommandManager; CommandManager *c = &mCommandManager;

View File

@ -14,6 +14,23 @@
#include "../MemoryX.h" #include "../MemoryX.h"
class AudacityProject; class AudacityProject;
class wxEvtHandler;
// Base class for objects, to whose member functions, the CommandManager will
// dispatch.
//
// It, or a subclass of it, must be the first base class of the object, and the
// first base class of that base class, etc., for the same reason that
// wxEvtHandler must be first (that is, the downcast from a pointer to the base
// to a pointer to the object, must be a vacuous operation).
//
// In fact, then, we just make it an alias of wxEvtHandler, in case you really
// need to inherit from wxEvtHandler for other reasons, and otherwise you
// couldn't satisfy the requirement for both base classes at once.
using CommandHandlerObject = wxEvtHandler;
using CommandHandlerFinder = CommandHandlerObject &(*)(AudacityProject&);
class wxEvent; class wxEvent;
using CommandParameter = wxString; using CommandParameter = wxString;
@ -145,6 +162,4 @@ inline CommandFunctorPointer MakeFunctor(OBJ *This,
// Now define the macro abbreviations that call the factory // Now define the macro abbreviations that call the factory
#define FNT(OBJ, This, X) (MakeFunctor<OBJ>(This, X )) #define FNT(OBJ, This, X) (MakeFunctor<OBJ>(This, X ))
#define FN(X) FNT(AudacityProject, this, & AudacityProject :: X)
#endif #endif

View File

@ -694,7 +694,8 @@ void CommandManager::ClearCurrentMenu()
/// given functor will be called /// given functor will be called
void CommandManager::InsertItem(const wxString & name, void CommandManager::InsertItem(const wxString & name,
const wxString & label_in, const wxString & label_in,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
const wxString & after, const wxString & after,
int checkmark) int checkmark)
{ {
@ -744,7 +745,7 @@ void CommandManager::InsertItem(const wxString & name,
} }
} }
CommandListEntry *entry = NewIdentifier(name, label_in, menu, callback, false, 0, 0); CommandListEntry *entry = NewIdentifier(name, label_in, menu, finder, callback, false, 0, 0);
int ID = entry->id; int ID = entry->id;
wxString label = GetLabel(entry); wxString label = GetLabel(entry);
@ -763,42 +764,49 @@ void CommandManager::InsertItem(const wxString & name,
void CommandManager::AddCheck(const wxChar *name, void CommandManager::AddCheck(const wxChar *name,
const wxChar *label, const wxChar *label,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
int checkmark) int checkmark)
{ {
AddItem(name, label, callback, wxT(""), NoFlagsSpecifed, NoFlagsSpecifed, checkmark); AddItem(name, label, finder, callback, wxT(""),
NoFlagsSpecifed, NoFlagsSpecifed, checkmark);
} }
void CommandManager::AddCheck(const wxChar *name, void CommandManager::AddCheck(const wxChar *name,
const wxChar *label, const wxChar *label,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
int checkmark, int checkmark,
CommandFlag flags, CommandFlag flags,
CommandMask mask) CommandMask mask)
{ {
AddItem(name, label, callback, wxT(""), flags, mask, checkmark); AddItem(name, label, finder, callback, wxT(""), flags, mask, checkmark);
} }
void CommandManager::AddItem(const wxChar *name, void CommandManager::AddItem(const wxChar *name,
const wxChar *label, const wxChar *label,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
CommandFlag flags, CommandFlag flags,
CommandMask mask, CommandMask mask,
const CommandParameter &parameter) const CommandParameter &parameter)
{ {
AddItem(name, label, callback, wxT(""), flags, mask, -1, parameter); AddItem(name, label, finder, callback, wxT(""), flags, mask, -1, parameter);
} }
void CommandManager::AddItem(const wxChar *name, void CommandManager::AddItem(const wxChar *name,
const wxChar *label_in, const wxChar *label_in,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
const wxChar *accel, const wxChar *accel,
CommandFlag flags, CommandFlag flags,
CommandMask mask, CommandMask mask,
int checkmark, int checkmark,
const CommandParameter &parameter) const CommandParameter &parameter)
{ {
CommandListEntry *entry = NewIdentifier(name, label_in, accel, CurrentMenu(), callback, false, 0, 0, parameter); CommandListEntry *entry =
NewIdentifier(name, label_in, accel, CurrentMenu(), finder, callback,
false, 0, 0, parameter);
int ID = entry->id; int ID = entry->id;
wxString label = GetLabelWithDisabledAccel(entry); wxString label = GetLabelWithDisabledAccel(entry);
@ -826,12 +834,14 @@ void CommandManager::AddItem(const wxChar *name,
/// all of the items at once. /// all of the items at once.
void CommandManager::AddItemList(const wxString & name, void CommandManager::AddItemList(const wxString & name,
const wxArrayString & labels, const wxArrayString & labels,
const CommandFunctorPointer &callback) CommandHandlerFinder finder,
CommandFunctorPointer callback)
{ {
for (size_t i = 0, cnt = labels.GetCount(); i < cnt; i++) { for (size_t i = 0, cnt = labels.GetCount(); i < cnt; i++) {
CommandListEntry *entry = NewIdentifier(name, CommandListEntry *entry = NewIdentifier(name,
labels[i], labels[i],
CurrentMenu(), CurrentMenu(),
finder,
callback, callback,
true, true,
i, i,
@ -846,21 +856,23 @@ void CommandManager::AddItemList(const wxString & name,
/// given function pointer will be called (via the CommandManagerListener) /// given function pointer will be called (via the CommandManagerListener)
void CommandManager::AddCommand(const wxChar *name, void CommandManager::AddCommand(const wxChar *name,
const wxChar *label, const wxChar *label,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
CommandFlag flags, CommandFlag flags,
CommandMask mask) CommandMask mask)
{ {
AddCommand(name, label, callback, wxT(""), flags, mask); AddCommand(name, label, finder, callback, wxT(""), flags, mask);
} }
void CommandManager::AddCommand(const wxChar *name, void CommandManager::AddCommand(const wxChar *name,
const wxChar *label_in, const wxChar *label_in,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
const wxChar *accel, const wxChar *accel,
CommandFlag flags, CommandFlag flags,
CommandMask mask) CommandMask mask)
{ {
NewIdentifier(name, label_in, accel, NULL, callback, false, 0, 0, {}); NewIdentifier(name, label_in, accel, NULL, finder, callback, false, 0, 0, {});
if (flags != NoFlagsSpecifed || mask != NoFlagsSpecifed) { if (flags != NoFlagsSpecifed || mask != NoFlagsSpecifed) {
SetCommandFlags(name, flags, mask); SetCommandFlags(name, flags, mask);
@ -869,10 +881,13 @@ void CommandManager::AddCommand(const wxChar *name,
void CommandManager::AddGlobalCommand(const wxChar *name, void CommandManager::AddGlobalCommand(const wxChar *name,
const wxChar *label_in, const wxChar *label_in,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
const wxChar *accel) const wxChar *accel)
{ {
CommandListEntry *entry = NewIdentifier(name, label_in, accel, NULL, callback, false, 0, 0, {}); CommandListEntry *entry =
NewIdentifier(name, label_in, accel, NULL, finder, callback,
false, 0, 0, {});
entry->enabled = false; entry->enabled = false;
entry->isGlobal = true; entry->isGlobal = true;
@ -906,7 +921,8 @@ int CommandManager::NextIdentifier(int ID)
CommandListEntry *CommandManager::NewIdentifier(const wxString & name, CommandListEntry *CommandManager::NewIdentifier(const wxString & name,
const wxString & label, const wxString & label,
wxMenu *menu, wxMenu *menu,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
bool multi, bool multi,
int index, int index,
int count) int count)
@ -915,6 +931,7 @@ CommandListEntry *CommandManager::NewIdentifier(const wxString & name,
label.BeforeFirst(wxT('\t')), label.BeforeFirst(wxT('\t')),
label.AfterFirst(wxT('\t')), label.AfterFirst(wxT('\t')),
menu, menu,
finder,
callback, callback,
multi, multi,
index, index,
@ -925,7 +942,8 @@ CommandListEntry *CommandManager::NewIdentifier(const wxString & name,
const wxString & label, const wxString & label,
const wxString & accel, const wxString & accel,
wxMenu *menu, wxMenu *menu,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
bool multi, bool multi,
int index, int index,
int count, int count,
@ -977,6 +995,7 @@ CommandListEntry *CommandManager::NewIdentifier(const wxString & name,
entry->labelPrefix = labelPrefix; entry->labelPrefix = labelPrefix;
entry->labelTop = wxMenuItem::GetLabelText(mCurrentMenuName); entry->labelTop = wxMenuItem::GetLabelText(mCurrentMenuName);
entry->menu = menu; entry->menu = menu;
entry->finder = finder;
entry->callback = callback; entry->callback = callback;
entry->multi = multi; entry->multi = multi;
entry->index = index; entry->index = index;

View File

@ -64,6 +64,7 @@ struct CommandListEntry
wxString labelPrefix; wxString labelPrefix;
wxString labelTop; wxString labelTop;
wxMenu *menu; wxMenu *menu;
CommandHandlerFinder finder;
CommandFunctorPointer callback; CommandFunctorPointer callback;
CommandParameter parameter; CommandParameter parameter;
bool multi; bool multi;
@ -125,36 +126,42 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler
void InsertItem(const wxString & name, void InsertItem(const wxString & name,
const wxString & label, const wxString & label,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
const wxString & after, const wxString & after,
int checkmark = -1); int checkmark = -1);
void AddItemList(const wxString & name, void AddItemList(const wxString & name,
const wxArrayString & labels, const wxArrayString & labels,
const CommandFunctorPointer &callback); CommandHandlerFinder finder,
CommandFunctorPointer callback);
void AddCheck(const wxChar *name, void AddCheck(const wxChar *name,
const wxChar *label, const wxChar *label,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
int checkmark = 0); int checkmark = 0);
void AddCheck(const wxChar *name, void AddCheck(const wxChar *name,
const wxChar *label, const wxChar *label,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
int checkmark, int checkmark,
CommandFlag flags, CommandFlag flags,
CommandMask mask); CommandMask mask);
void AddItem(const wxChar *name, void AddItem(const wxChar *name,
const wxChar *label, const wxChar *label,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
CommandFlag flags = NoFlagsSpecifed, CommandFlag flags = NoFlagsSpecifed,
CommandMask mask = NoFlagsSpecifed, CommandMask mask = NoFlagsSpecifed,
const CommandParameter &parameter = {}); const CommandParameter &parameter = {});
void AddItem(const wxChar *name, void AddItem(const wxChar *name,
const wxChar *label_in, const wxChar *label_in,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
const wxChar *accel, const wxChar *accel,
CommandFlag flags = NoFlagsSpecifed, CommandFlag flags = NoFlagsSpecifed,
CommandMask mask = NoFlagsSpecifed, CommandMask mask = NoFlagsSpecifed,
@ -167,20 +174,23 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler
// keyboard shortcut. // keyboard shortcut.
void AddCommand(const wxChar *name, void AddCommand(const wxChar *name,
const wxChar *label, const wxChar *label,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
CommandFlag flags = NoFlagsSpecifed, CommandFlag flags = NoFlagsSpecifed,
CommandMask mask = NoFlagsSpecifed); CommandMask mask = NoFlagsSpecifed);
void AddCommand(const wxChar *name, void AddCommand(const wxChar *name,
const wxChar *label, const wxChar *label,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
const wxChar *accel, const wxChar *accel,
CommandFlag flags = NoFlagsSpecifed, CommandFlag flags = NoFlagsSpecifed,
CommandMask mask = NoFlagsSpecifed); CommandMask mask = NoFlagsSpecifed);
void AddGlobalCommand(const wxChar *name, void AddGlobalCommand(const wxChar *name,
const wxChar *label, const wxChar *label,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
const wxChar *accel); const wxChar *accel);
// //
// Command masks // Command masks
@ -285,7 +295,8 @@ protected:
CommandListEntry *NewIdentifier(const wxString & name, CommandListEntry *NewIdentifier(const wxString & name,
const wxString & label, const wxString & label,
wxMenu *menu, wxMenu *menu,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
bool multi, bool multi,
int index, int index,
int count); int count);
@ -293,7 +304,8 @@ protected:
const wxString & label, const wxString & label,
const wxString & accel, const wxString & accel,
wxMenu *menu, wxMenu *menu,
const CommandFunctorPointer &callback, CommandHandlerFinder finder,
CommandFunctorPointer callback,
bool multi, bool multi,
int index, int index,
int count, int count,

View File

@ -1002,6 +1002,10 @@ bool Scrubber::CanScrub() const
return cm->GetEnabled(menuItems[ 0 ].name); return cm->GetEnabled(menuItems[ 0 ].name);
} }
// To supply the "finder" argument
static CommandHandlerObject &findme(AudacityProject &project)
{ return project.GetScrubber(); }
void Scrubber::AddMenuItems() void Scrubber::AddMenuItems()
{ {
auto cm = mProject->GetCommandManager(); auto cm = mProject->GetCommandManager();
@ -1010,13 +1014,13 @@ void Scrubber::AddMenuItems()
for (const auto &item : menuItems) { for (const auto &item : menuItems) {
if (item.StatusTest) if (item.StatusTest)
cm->AddCheck(item.name, wxGetTranslation(item.label), cm->AddCheck(item.name, wxGetTranslation(item.label),
FNT(Scrubber, this, item.memFn), findme, FNT(Scrubber, this, item.memFn),
false, false,
item.flags, item.flags); item.flags, item.flags);
else else
// The start item // The start item
cm->AddItem(item.name, wxGetTranslation(item.label), cm->AddItem(item.name, wxGetTranslation(item.label),
FNT(Scrubber, this, item.memFn), findme, FNT(Scrubber, this, item.memFn),
item.flags, item.flags); item.flags, item.flags);
} }
cm->EndSubMenu(); cm->EndSubMenu();