From 0a711d8b26aa90a5094609d8f505e9a5879dcd9b Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 19 Aug 2017 06:18:05 -0400 Subject: [PATCH 1/8] define CommandContext --- src/commands/CommandFunctors.h | 35 +++++++++++++++++++++++++-------- src/commands/CommandManager.cpp | 7 ++++--- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/commands/CommandFunctors.h b/src/commands/CommandFunctors.h index 797cedb65..2d12c418e 100644 --- a/src/commands/CommandFunctors.h +++ b/src/commands/CommandFunctors.h @@ -13,6 +13,25 @@ #include #include "../MemoryX.h" +class AudacityProject; +class wxEvent; + +struct CommandContext { + CommandContext( + AudacityProject &p + , const wxEvent *e = nullptr + , int ii = 0 + ) + : project{ p } + , pEvt{ e } + , index{ ii } + {} + + AudacityProject &project; + const wxEvent *pEvt; + int index; +}; + class wxEvent; typedef wxString PluginID; @@ -21,7 +40,7 @@ class AUDACITY_DLL_API CommandFunctor /* not final */ public: CommandFunctor(){}; virtual ~CommandFunctor(){}; - virtual void operator()(int index, const wxEvent *e) = 0; + virtual void operator()(const CommandContext &context) = 0; }; using CommandFunctorPointer = std::shared_ptr ; @@ -39,7 +58,7 @@ class VoidFunctor final : public CommandFunctor public: explicit VoidFunctor(OBJ *This, audCommandFunction pfn) : mThis{ This }, mCommandFunction{ pfn } {} - void operator () (int, const wxEvent *) override + void operator () (const CommandContext &context) override { (mThis->*mCommandFunction) (); } private: OBJ *const mThis; @@ -55,8 +74,8 @@ class KeyFunctor final : public CommandFunctor public: explicit KeyFunctor(OBJ *This, audCommandKeyFunction pfn) : mThis{ This }, mCommandKeyFunction{ pfn } {} - void operator () (int, const wxEvent *evt) override - { (mThis->*mCommandKeyFunction) (evt); } + void operator () (const CommandContext &context) override + { (mThis->*mCommandKeyFunction) (context.pEvt); } private: OBJ *const mThis; const audCommandKeyFunction mCommandKeyFunction; @@ -73,7 +92,7 @@ class PopupFunctor final : public CommandFunctor public: explicit PopupFunctor(OBJ *This, audCommandPopupFunction pfn) : mThis{ This }, mCommandPopupFunction{ pfn } {} - void operator () (int, const wxEvent *) override + void operator () (const CommandContext &context) override { wxCommandEvent dummy; (mThis->*mCommandPopupFunction) (dummy); } private: OBJ *const mThis; @@ -89,8 +108,8 @@ class ListFunctor final : public CommandFunctor public: explicit ListFunctor(OBJ *This, audCommandListFunction pfn) : mThis{ This }, mCommandListFunction{ pfn } {} - void operator () (int index, const wxEvent *) override - { (mThis->*mCommandListFunction)(index); } + void operator () (const CommandContext &context) override + { (mThis->*mCommandListFunction)(context.index); } private: OBJ *const mThis; const audCommandListFunction mCommandListFunction; @@ -105,7 +124,7 @@ class PluginFunctor final : public CommandFunctor public: explicit PluginFunctor(OBJ *This, const PluginID &id, audCommandPluginFunction pfn) : mPluginID{ id }, mThis{ This }, mCommandPluginFunction{ pfn } {} - void operator () (int, const wxEvent *) override + void operator () (const CommandContext &context) override { (mThis->*mCommandPluginFunction) (mPluginID, 0 // AudacityProject::OnEffectFlags::kNone diff --git a/src/commands/CommandManager.cpp b/src/commands/CommandManager.cpp index a35a3b6a4..b41dd11fd 100644 --- a/src/commands/CommandManager.cpp +++ b/src/commands/CommandManager.cpp @@ -1447,11 +1447,11 @@ bool CommandManager::HandleCommandEntry(const CommandListEntry * entry, if (!entry || !entry->enabled) return false; + auto proj = GetActiveProject(); + auto combinedMask = (mask & entry->mask); if (combinedMask) { - AudacityProject * proj; - proj = GetActiveProject(); wxASSERT( proj ); if( !proj ) return false; @@ -1469,7 +1469,8 @@ bool CommandManager::HandleCommandEntry(const CommandListEntry * entry, return true; } - (*(entry->callback))(entry->index, evt); + CommandContext context{ *proj, evt, entry->index }; + (*(entry->callback))(context); return true; } From 05984e8bfb0a77f72ab698e848c129749c3aa95a Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 19 Aug 2017 06:40:27 -0400 Subject: [PATCH 2/8] CommandEntry stores a string parameter, passed in CommandContext --- src/commands/CommandFunctors.h | 5 +++++ src/commands/CommandManager.cpp | 17 ++++++++++------- src/commands/CommandManager.h | 7 +++++-- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/commands/CommandFunctors.h b/src/commands/CommandFunctors.h index 2d12c418e..4fdfcf550 100644 --- a/src/commands/CommandFunctors.h +++ b/src/commands/CommandFunctors.h @@ -16,20 +16,25 @@ class AudacityProject; class wxEvent; +using CommandParameter = wxString; + struct CommandContext { CommandContext( AudacityProject &p , const wxEvent *e = nullptr , int ii = 0 + , const CommandParameter ¶m = {} ) : project{ p } , pEvt{ e } , index{ ii } + , parameter{ param } {} AudacityProject &project; const wxEvent *pEvt; int index; + CommandParameter parameter; }; class wxEvent; diff --git a/src/commands/CommandManager.cpp b/src/commands/CommandManager.cpp index b41dd11fd..caa88b7ab 100644 --- a/src/commands/CommandManager.cpp +++ b/src/commands/CommandManager.cpp @@ -794,9 +794,10 @@ void CommandManager::AddItem(const wxChar *name, const wxChar *accel, CommandFlag flags, CommandMask mask, - int checkmark) + int checkmark, + const CommandParameter ¶meter) { - CommandListEntry *entry = NewIdentifier(name, label_in, accel, CurrentMenu(), callback, false, 0, 0); + CommandListEntry *entry = NewIdentifier(name, label_in, accel, CurrentMenu(), callback, false, 0, 0, parameter); int ID = entry->id; wxString label = GetLabelWithDisabledAccel(entry); @@ -858,7 +859,7 @@ void CommandManager::AddCommand(const wxChar *name, CommandFlag flags, CommandMask mask) { - NewIdentifier(name, label_in, accel, NULL, callback, false, 0, 0); + NewIdentifier(name, label_in, accel, NULL, callback, false, 0, 0, {}); if (flags != NoFlagsSpecifed || mask != NoFlagsSpecifed) { SetCommandFlags(name, flags, mask); @@ -870,7 +871,7 @@ void CommandManager::AddGlobalCommand(const wxChar *name, const CommandFunctorPointer &callback, const wxChar *accel) { - CommandListEntry *entry = NewIdentifier(name, label_in, accel, NULL, callback, false, 0, 0); + CommandListEntry *entry = NewIdentifier(name, label_in, accel, NULL, callback, false, 0, 0, {}); entry->enabled = false; entry->isGlobal = true; @@ -916,7 +917,7 @@ CommandListEntry *CommandManager::NewIdentifier(const wxString & name, callback, multi, index, - count); + count, {}); } CommandListEntry *CommandManager::NewIdentifier(const wxString & name, @@ -926,7 +927,8 @@ CommandListEntry *CommandManager::NewIdentifier(const wxString & name, const CommandFunctorPointer &callback, bool multi, int index, - int count) + int count, + const CommandParameter ¶meter) { // If we have the identifier already, reuse it. CommandListEntry *prev = mCommandNameHash[name]; @@ -956,6 +958,7 @@ CommandListEntry *CommandManager::NewIdentifier(const wxString & name, mCurrentID = NextIdentifier(mCurrentID); entry->id = mCurrentID; + entry->parameter = parameter; #if defined(__WXMAC__) if (name == wxT("Preferences")) @@ -1469,7 +1472,7 @@ bool CommandManager::HandleCommandEntry(const CommandListEntry * entry, return true; } - CommandContext context{ *proj, evt, entry->index }; + CommandContext context{ *proj, evt, entry->index, entry->parameter }; (*(entry->callback))(context); return true; diff --git a/src/commands/CommandManager.h b/src/commands/CommandManager.h index 0b3fad11d..44f927154 100644 --- a/src/commands/CommandManager.h +++ b/src/commands/CommandManager.h @@ -65,6 +65,7 @@ struct CommandListEntry wxString labelTop; wxMenu *menu; CommandFunctorPointer callback; + CommandParameter parameter; bool multi; int index; int count; @@ -156,7 +157,8 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler const wxChar *accel, CommandFlag flags = NoFlagsSpecifed, CommandMask mask = NoFlagsSpecifed, - int checkmark = -1); + int checkmark = -1, + const CommandParameter ¶meter = {}); void AddSeparator(); @@ -293,7 +295,8 @@ protected: const CommandFunctorPointer &callback, bool multi, int index, - int count); + int count, + const CommandParameter ¶meter); // // Executing commands From 1e3ab82a011268bc0d93d0496840d950f75cc15b Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 19 Aug 2017 06:45:23 -0400 Subject: [PATCH 3/8] Effect commands store PluginID in CommandEntry parameter, not functor --- src/Menus.cpp | 8 ++++---- src/commands/CommandFunctors.h | 13 +++++-------- src/commands/CommandManager.cpp | 5 +++-- src/commands/CommandManager.h | 3 ++- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/Menus.cpp b/src/Menus.cpp index a231ae3c2..eb1ffa638 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -1875,9 +1875,9 @@ void AudacityProject::AddEffectMenuItemGroup(CommandManager *c, wxString item = PluginManager::Get().GetPlugin(plugs[i])->GetPath(); c->AddItem(item, item, - FNS(OnEffect, plugs[i]), + FN(OnEffect), flags[i], - flags[i]); + flags[i], plugs[i]); i++; } @@ -1888,9 +1888,9 @@ void AudacityProject::AddEffectMenuItemGroup(CommandManager *c, { c->AddItem(names[i], names[i], - FNS(OnEffect, plugs[i]), + FN(OnEffect), flags[i], - flags[i]); + flags[i], plugs[i]); } if (max > 0) diff --git a/src/commands/CommandFunctors.h b/src/commands/CommandFunctors.h index 4fdfcf550..2611485fb 100644 --- a/src/commands/CommandFunctors.h +++ b/src/commands/CommandFunctors.h @@ -127,15 +127,14 @@ template class PluginFunctor final : public CommandFunctor { public: - explicit PluginFunctor(OBJ *This, const PluginID &id, audCommandPluginFunction pfn) - : mPluginID{ id }, mThis{ This }, mCommandPluginFunction{ pfn } {} + explicit PluginFunctor(OBJ *This, audCommandPluginFunction pfn) + : mThis{ This }, mCommandPluginFunction{ pfn } {} void operator () (const CommandContext &context) override { (mThis->*mCommandPluginFunction) - (mPluginID, + (context.parameter, 0 // AudacityProject::OnEffectFlags::kNone ); } private: - const PluginID mPluginID; OBJ *const mThis; const audCommandPluginFunction mCommandPluginFunction; }; @@ -162,15 +161,13 @@ inline CommandFunctorPointer MakeFunctor(OBJ *This, { return CommandFunctorPointer{ safenew ListFunctor{ This, pfn } }; } template -inline CommandFunctorPointer MakeFunctor(OBJ *This, const PluginID &id, +inline CommandFunctorPointer MakeFunctor(OBJ *This, audCommandPluginFunction pfn) -{ return CommandFunctorPointer{ safenew PluginFunctor{ This, id, pfn } }; } +{ return CommandFunctorPointer{ safenew PluginFunctor{ This, pfn } }; } // Now define the macro abbreviations that call the factory #define FNT(OBJ, This, X) (MakeFunctor(This, X )) -#define FNTS(OBJ, This, X, S) (MakeFunctor(This, (S), X )) #define FN(X) FNT(AudacityProject, this, & AudacityProject :: X) -#define FNS(X, S) FNTS(AudacityProject, this, & AudacityProject :: X, S) #endif diff --git a/src/commands/CommandManager.cpp b/src/commands/CommandManager.cpp index caa88b7ab..03302106f 100644 --- a/src/commands/CommandManager.cpp +++ b/src/commands/CommandManager.cpp @@ -783,9 +783,10 @@ void CommandManager::AddItem(const wxChar *name, const wxChar *label, const CommandFunctorPointer &callback, CommandFlag flags, - CommandMask mask) + CommandMask mask, + const CommandParameter ¶meter) { - AddItem(name, label, callback, wxT(""), flags, mask); + AddItem(name, label, callback, wxT(""), flags, mask, -1, parameter); } void CommandManager::AddItem(const wxChar *name, diff --git a/src/commands/CommandManager.h b/src/commands/CommandManager.h index 44f927154..c4561f76a 100644 --- a/src/commands/CommandManager.h +++ b/src/commands/CommandManager.h @@ -149,7 +149,8 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler const wxChar *label, const CommandFunctorPointer &callback, CommandFlag flags = NoFlagsSpecifed, - CommandMask mask = NoFlagsSpecifed); + CommandMask mask = NoFlagsSpecifed, + const CommandParameter ¶meter = {}); void AddItem(const wxChar *name, const wxChar *label_in, From d263eaa97b9a4bad69ace2ccf21e492bcb552f74 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 19 Aug 2017 07:42:43 -0400 Subject: [PATCH 4/8] Remove the special PopupFunctor, redo it by other means... ... it was only used, so far, by the scrubber. --- src/commands/CommandFunctors.h | 23 ----------------------- src/toolbars/ScrubbingToolBar.cpp | 6 +++--- src/tracks/ui/Scrubbing.cpp | 16 +++++++++------- src/tracks/ui/Scrubbing.h | 10 +++++++--- src/widgets/Ruler.cpp | 4 ++-- 5 files changed, 21 insertions(+), 38 deletions(-) diff --git a/src/commands/CommandFunctors.h b/src/commands/CommandFunctors.h index 2611485fb..85882ff6f 100644 --- a/src/commands/CommandFunctors.h +++ b/src/commands/CommandFunctors.h @@ -86,24 +86,6 @@ private: const audCommandKeyFunction mCommandKeyFunction; }; -// This allows functions to be used either by command manager or by a wxMenu popup, -// but the functions MUST ignore the argument! -template -using audCommandPopupFunction = void (OBJ::*)(wxCommandEvent&); - -template -class PopupFunctor final : public CommandFunctor -{ -public: - explicit PopupFunctor(OBJ *This, audCommandPopupFunction pfn) - : mThis{ This }, mCommandPopupFunction{ pfn } {} - void operator () (const CommandContext &context) override - { wxCommandEvent dummy; (mThis->*mCommandPopupFunction) (dummy); } -private: - OBJ *const mThis; - const audCommandPopupFunction mCommandPopupFunction; -}; - template using audCommandListFunction = void (OBJ::*)(int); @@ -150,11 +132,6 @@ inline CommandFunctorPointer MakeFunctor(OBJ *This, audCommandKeyFunction pfn) { return CommandFunctorPointer{ safenew KeyFunctor{ This, pfn } }; } -template -inline CommandFunctorPointer MakeFunctor(OBJ *This, - audCommandPopupFunction pfn) -{ return CommandFunctorPointer{ safenew PopupFunctor{ This, pfn } }; } - template inline CommandFunctorPointer MakeFunctor(OBJ *This, audCommandListFunction pfn) diff --git a/src/toolbars/ScrubbingToolBar.cpp b/src/toolbars/ScrubbingToolBar.cpp index fd11f41e5..ac39df4e8 100644 --- a/src/toolbars/ScrubbingToolBar.cpp +++ b/src/toolbars/ScrubbingToolBar.cpp @@ -193,13 +193,13 @@ void ScrubbingToolBar::OnButton(wxCommandEvent &event) switch (id) { case STBScrubID: - scrubber.OnScrub(event); + scrubber.OnScrub(); break; case STBSeekID: - scrubber.OnSeek(event); + scrubber.OnSeek(); break; case STBRulerID: - scrubber.OnToggleScrubRuler(event); + scrubber.OnToggleScrubRuler(); break; default: wxASSERT(false); diff --git a/src/tracks/ui/Scrubbing.cpp b/src/tracks/ui/Scrubbing.cpp index fd8fea2de..a14b77825 100644 --- a/src/tracks/ui/Scrubbing.cpp +++ b/src/tracks/ui/Scrubbing.cpp @@ -224,7 +224,7 @@ namespace { wxString label; wxString status; CommandFlag flags; - void (Scrubber::*memFn)(wxCommandEvent&); + void (Scrubber::*memFn)(); bool seek; bool (Scrubber::*StatusTest)() const; @@ -921,19 +921,19 @@ void Scrubber::OnScrubOrSeek(bool seek) scrubbingToolBar->RegenerateTooltips(); } -void Scrubber::OnScrub(wxCommandEvent&) +void Scrubber::OnScrub() { OnScrubOrSeek(false); CheckMenuItems(); } -void Scrubber::OnSeek(wxCommandEvent&) +void Scrubber::OnSeek() { OnScrubOrSeek(true); CheckMenuItems(); } -void Scrubber::OnToggleScrubRuler(wxCommandEvent&) +void Scrubber::OnToggleScrubRuler() { mProject->GetRulerPanel()->OnToggleScrubRuler(); const auto toolbar = mProject->GetToolManager()->GetToolBar(ScrubbingBarID); @@ -943,10 +943,12 @@ void Scrubber::OnToggleScrubRuler(wxCommandEvent&) enum { CMD_ID = 8000 }; +#define THUNK(Name) Scrubber::Thunk<&Scrubber::Name> + BEGIN_EVENT_TABLE(Scrubber, wxEvtHandler) - EVT_MENU(CMD_ID, Scrubber::OnScrub) - EVT_MENU(CMD_ID + 1, Scrubber::OnSeek) - EVT_MENU(CMD_ID + 2, Scrubber::OnToggleScrubRuler) + EVT_MENU(CMD_ID, THUNK(OnScrub)) + EVT_MENU(CMD_ID + 1, THUNK(OnSeek)) + EVT_MENU(CMD_ID + 2, THUNK(OnToggleScrubRuler)) END_EVENT_TABLE() BEGIN_EVENT_TABLE(Scrubber::Forwarder, wxEvtHandler) diff --git a/src/tracks/ui/Scrubbing.h b/src/tracks/ui/Scrubbing.h index 66538f5f7..a8e72a663 100644 --- a/src/tracks/ui/Scrubbing.h +++ b/src/tracks/ui/Scrubbing.h @@ -123,9 +123,13 @@ public: void PopulatePopupMenu(wxMenu &menu); void OnScrubOrSeek(bool seek); - void OnScrub(wxCommandEvent&); - void OnSeek(wxCommandEvent&); - void OnToggleScrubRuler(wxCommandEvent&); + void OnScrub(); + void OnSeek(); + void OnToggleScrubRuler(); + + // Convenience wrapper for the above + template void Thunk(wxCommandEvent &dummy) + { (this->*pfn)(); } // A string to put in the leftmost part of the status bar // when scrub or seek is in progress, or else empty. diff --git a/src/widgets/Ruler.cpp b/src/widgets/Ruler.cpp index 2bbcf43ef..51a32d107 100644 --- a/src/widgets/Ruler.cpp +++ b/src/widgets/Ruler.cpp @@ -2845,10 +2845,10 @@ void AdornedRulerPanel::UpdateStatusBarAndTooltips(StatusChoice choice) // This version toggles ruler state indirectly via the scrubber // to ensure that all the places where the state is shown update. // For example buttons and menus must update. -void AdornedRulerPanel::OnToggleScrubRulerFromMenu(wxCommandEvent& Evt) +void AdornedRulerPanel::OnToggleScrubRulerFromMenu(wxCommandEvent&) { auto &scrubber = mProject->GetScrubber(); - scrubber.OnToggleScrubRuler( Evt ); + scrubber.OnToggleScrubRuler( ); } void AdornedRulerPanel::OnToggleScrubRuler(/*wxCommandEvent&*/) From 6dead232f2ad4f449ebb6ec5182b6ffee013e77e Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 19 Aug 2017 08:45:35 -0400 Subject: [PATCH 5/8] Pair CommandHandlerFinder with functor everywhere, but not used yet --- src/Menus.cpp | 5 +++ src/commands/CommandFunctors.h | 19 +++++++++-- src/commands/CommandManager.cpp | 57 ++++++++++++++++++++++----------- src/commands/CommandManager.h | 34 +++++++++++++------- src/tracks/ui/Scrubbing.cpp | 8 +++-- 5 files changed, 89 insertions(+), 34 deletions(-) diff --git a/src/Menus.cpp b/src/Menus.cpp index eb1ffa638..d14c68c39 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -285,6 +285,11 @@ static int SortEffectsByType(const PluginDescriptor **a, const PluginDescriptor /// changes in configured preferences - for example changes in key-bindings /// 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() { CommandManager *c = &mCommandManager; diff --git a/src/commands/CommandFunctors.h b/src/commands/CommandFunctors.h index 85882ff6f..a29f71c3b 100644 --- a/src/commands/CommandFunctors.h +++ b/src/commands/CommandFunctors.h @@ -14,6 +14,23 @@ #include "../MemoryX.h" 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; using CommandParameter = wxString; @@ -145,6 +162,4 @@ inline CommandFunctorPointer MakeFunctor(OBJ *This, // Now define the macro abbreviations that call the factory #define FNT(OBJ, This, X) (MakeFunctor(This, X )) -#define FN(X) FNT(AudacityProject, this, & AudacityProject :: X) - #endif diff --git a/src/commands/CommandManager.cpp b/src/commands/CommandManager.cpp index 03302106f..016d22fef 100644 --- a/src/commands/CommandManager.cpp +++ b/src/commands/CommandManager.cpp @@ -694,7 +694,8 @@ void CommandManager::ClearCurrentMenu() /// given functor will be called void CommandManager::InsertItem(const wxString & name, const wxString & label_in, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, const wxString & after, 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; wxString label = GetLabel(entry); @@ -763,42 +764,49 @@ void CommandManager::InsertItem(const wxString & name, void CommandManager::AddCheck(const wxChar *name, const wxChar *label, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, 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, const wxChar *label, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, int checkmark, CommandFlag flags, 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, const wxChar *label, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, CommandFlag flags, CommandMask mask, const CommandParameter ¶meter) { - 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, const wxChar *label_in, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, const wxChar *accel, CommandFlag flags, CommandMask mask, int checkmark, const CommandParameter ¶meter) { - 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; wxString label = GetLabelWithDisabledAccel(entry); @@ -826,12 +834,14 @@ void CommandManager::AddItem(const wxChar *name, /// all of the items at once. void CommandManager::AddItemList(const wxString & name, const wxArrayString & labels, - const CommandFunctorPointer &callback) + CommandHandlerFinder finder, + CommandFunctorPointer callback) { for (size_t i = 0, cnt = labels.GetCount(); i < cnt; i++) { CommandListEntry *entry = NewIdentifier(name, labels[i], CurrentMenu(), + finder, callback, true, i, @@ -846,21 +856,23 @@ void CommandManager::AddItemList(const wxString & name, /// given function pointer will be called (via the CommandManagerListener) void CommandManager::AddCommand(const wxChar *name, const wxChar *label, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, CommandFlag flags, CommandMask mask) { - AddCommand(name, label, callback, wxT(""), flags, mask); + AddCommand(name, label, finder, callback, wxT(""), flags, mask); } void CommandManager::AddCommand(const wxChar *name, const wxChar *label_in, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, const wxChar *accel, CommandFlag flags, 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) { SetCommandFlags(name, flags, mask); @@ -869,10 +881,13 @@ void CommandManager::AddCommand(const wxChar *name, void CommandManager::AddGlobalCommand(const wxChar *name, const wxChar *label_in, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, 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->isGlobal = true; @@ -906,7 +921,8 @@ int CommandManager::NextIdentifier(int ID) CommandListEntry *CommandManager::NewIdentifier(const wxString & name, const wxString & label, wxMenu *menu, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, bool multi, int index, int count) @@ -915,6 +931,7 @@ CommandListEntry *CommandManager::NewIdentifier(const wxString & name, label.BeforeFirst(wxT('\t')), label.AfterFirst(wxT('\t')), menu, + finder, callback, multi, index, @@ -925,7 +942,8 @@ CommandListEntry *CommandManager::NewIdentifier(const wxString & name, const wxString & label, const wxString & accel, wxMenu *menu, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, bool multi, int index, int count, @@ -977,6 +995,7 @@ CommandListEntry *CommandManager::NewIdentifier(const wxString & name, entry->labelPrefix = labelPrefix; entry->labelTop = wxMenuItem::GetLabelText(mCurrentMenuName); entry->menu = menu; + entry->finder = finder; entry->callback = callback; entry->multi = multi; entry->index = index; diff --git a/src/commands/CommandManager.h b/src/commands/CommandManager.h index c4561f76a..f662ea6f8 100644 --- a/src/commands/CommandManager.h +++ b/src/commands/CommandManager.h @@ -64,6 +64,7 @@ struct CommandListEntry wxString labelPrefix; wxString labelTop; wxMenu *menu; + CommandHandlerFinder finder; CommandFunctorPointer callback; CommandParameter parameter; bool multi; @@ -125,36 +126,42 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler void InsertItem(const wxString & name, const wxString & label, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, const wxString & after, int checkmark = -1); void AddItemList(const wxString & name, const wxArrayString & labels, - const CommandFunctorPointer &callback); + CommandHandlerFinder finder, + CommandFunctorPointer callback); void AddCheck(const wxChar *name, const wxChar *label, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, int checkmark = 0); void AddCheck(const wxChar *name, const wxChar *label, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, int checkmark, CommandFlag flags, CommandMask mask); void AddItem(const wxChar *name, const wxChar *label, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, CommandFlag flags = NoFlagsSpecifed, CommandMask mask = NoFlagsSpecifed, const CommandParameter ¶meter = {}); void AddItem(const wxChar *name, const wxChar *label_in, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, const wxChar *accel, CommandFlag flags = NoFlagsSpecifed, CommandMask mask = NoFlagsSpecifed, @@ -167,20 +174,23 @@ class AUDACITY_DLL_API CommandManager final : public XMLTagHandler // keyboard shortcut. void AddCommand(const wxChar *name, const wxChar *label, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, CommandFlag flags = NoFlagsSpecifed, CommandMask mask = NoFlagsSpecifed); void AddCommand(const wxChar *name, const wxChar *label, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, const wxChar *accel, CommandFlag flags = NoFlagsSpecifed, CommandMask mask = NoFlagsSpecifed); void AddGlobalCommand(const wxChar *name, const wxChar *label, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, const wxChar *accel); // // Command masks @@ -285,7 +295,8 @@ protected: CommandListEntry *NewIdentifier(const wxString & name, const wxString & label, wxMenu *menu, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, bool multi, int index, int count); @@ -293,7 +304,8 @@ protected: const wxString & label, const wxString & accel, wxMenu *menu, - const CommandFunctorPointer &callback, + CommandHandlerFinder finder, + CommandFunctorPointer callback, bool multi, int index, int count, diff --git a/src/tracks/ui/Scrubbing.cpp b/src/tracks/ui/Scrubbing.cpp index a14b77825..9e36d4ff7 100644 --- a/src/tracks/ui/Scrubbing.cpp +++ b/src/tracks/ui/Scrubbing.cpp @@ -1002,6 +1002,10 @@ bool Scrubber::CanScrub() const return cm->GetEnabled(menuItems[ 0 ].name); } +// To supply the "finder" argument +static CommandHandlerObject &findme(AudacityProject &project) +{ return project.GetScrubber(); } + void Scrubber::AddMenuItems() { auto cm = mProject->GetCommandManager(); @@ -1010,13 +1014,13 @@ void Scrubber::AddMenuItems() for (const auto &item : menuItems) { if (item.StatusTest) cm->AddCheck(item.name, wxGetTranslation(item.label), - FNT(Scrubber, this, item.memFn), + findme, FNT(Scrubber, this, item.memFn), false, item.flags, item.flags); else // The start item cm->AddItem(item.name, wxGetTranslation(item.label), - FNT(Scrubber, this, item.memFn), + findme, FNT(Scrubber, this, item.memFn), item.flags, item.flags); } cm->EndSubMenu(); From 77c392d29cb5cba2a3dfbc2bfaedd7731e2fa1a2 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 19 Aug 2017 09:30:37 -0400 Subject: [PATCH 6/8] AudacityProject::OnEffect wraps new function DoEffect --- src/BatchCommands.cpp | 2 +- src/Menus.cpp | 9 +++++++-- src/Menus.h | 3 ++- src/commands/CommandFunctors.h | 2 +- src/commands/CommandManager.cpp | 2 +- src/effects/Effect.cpp | 2 +- 6 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/BatchCommands.cpp b/src/BatchCommands.cpp index 451f81604..b3b3ec156 100644 --- a/src/BatchCommands.cpp +++ b/src/BatchCommands.cpp @@ -611,7 +611,7 @@ bool BatchCommands::ApplyEffectCommand(const PluginID & ID, const wxString & com if (EffectManager::Get().SetEffectParameters(ID, params)) { // and apply the effect... - res = project->OnEffect(ID, AudacityProject::OnEffectFlags::kConfigured | + res = project->DoEffect(ID, AudacityProject::OnEffectFlags::kConfigured | AudacityProject::OnEffectFlags::kSkipState | AudacityProject::OnEffectFlags::kDontRepeatLast); } diff --git a/src/Menus.cpp b/src/Menus.cpp index d14c68c39..80a314669 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -4293,11 +4293,11 @@ void AudacityProject::OnZeroCrossing() // Effect Menus // -/// OnEffect() takes a PluginID and has the EffectManager execute the assocated effect. +/// DoEffect() takes a PluginID and has the EffectManager execute the assocated effect. /// /// At the moment flags are used only to indicate whether to prompt for parameters, /// whether to save the state to history and whether to allow 'Repeat Last Effect'. -bool AudacityProject::OnEffect(const PluginID & ID, int flags) +bool AudacityProject::DoEffect(const PluginID & ID, int flags) { const PluginDescriptor *plug = PluginManager::Get().GetPlugin(ID); if (!plug) @@ -4424,6 +4424,11 @@ bool AudacityProject::OnEffect(const PluginID & ID, int flags) return true; } +void AudacityProject::OnEffect(const PluginID & ID, int flags) +{ + DoEffect(ID, flags); +} + void AudacityProject::OnRepeatLastEffect(int WXUNUSED(index)) { if (!mLastEffect.IsEmpty()) diff --git a/src/Menus.h b/src/Menus.h index a9fd3afc1..1f3c84cec 100644 --- a/src/Menus.h +++ b/src/Menus.h @@ -484,7 +484,8 @@ public: static const int kDontRepeatLast = 0x04; }; -bool OnEffect(const PluginID & ID, int flags = OnEffectFlags::kNone); +bool DoEffect(const PluginID & ID, int flags); +void OnEffect(const PluginID & ID, int); void OnRepeatLastEffect(int index); void OnApplyChain(); void OnEditChains(); diff --git a/src/commands/CommandFunctors.h b/src/commands/CommandFunctors.h index a29f71c3b..fcd070120 100644 --- a/src/commands/CommandFunctors.h +++ b/src/commands/CommandFunctors.h @@ -120,7 +120,7 @@ private: }; template -using audCommandPluginFunction = bool (OBJ::*)(const PluginID &, int); +using audCommandPluginFunction = void (OBJ::*)(const PluginID &, int); template class PluginFunctor final : public CommandFunctor diff --git a/src/commands/CommandManager.cpp b/src/commands/CommandManager.cpp index 016d22fef..abdbe8520 100644 --- a/src/commands/CommandManager.cpp +++ b/src/commands/CommandManager.cpp @@ -1560,7 +1560,7 @@ bool CommandManager::HandleTextualCommand(const wxString & Str, CommandFlag flag { if (em.GetEffectIdentifier(plug->GetID()).IsSameAs(Str)) { - return proj->OnEffect(plug->GetID(), AudacityProject::OnEffectFlags::kConfigured); + return proj->DoEffect(plug->GetID(), AudacityProject::OnEffectFlags::kConfigured); } plug = pm.GetNextPlugin(PluginTypeEffect); } diff --git a/src/effects/Effect.cpp b/src/effects/Effect.cpp index 566f3f42f..03995b451 100644 --- a/src/effects/Effect.cpp +++ b/src/effects/Effect.cpp @@ -765,7 +765,7 @@ bool Effect::Apply() // This is absolute hackage...but easy and I can't think of another way just now. // // It should callback to the EffectManager to kick off the processing - return GetActiveProject()->OnEffect(GetID(), AudacityProject::OnEffectFlags::kConfigured); + return GetActiveProject()->DoEffect(GetID(), AudacityProject::OnEffectFlags::kConfigured); } void Effect::Preview() From ab6de1181d4b69e136e5826fd8b2b3e2b4dfac12 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 19 Aug 2017 10:15:32 -0400 Subject: [PATCH 7/8] No more functor objects; all command handler functions take same args --- src/AudacityApp.cpp | 4 +- src/BatchProcessDialog.cpp | 8 +- src/Menus.cpp | 546 +++++++++++++++--------------- src/Menus.h | 524 ++++++++++++++-------------- src/MenusMac.cpp | 8 +- src/Project.cpp | 10 +- src/TimerRecordDialog.cpp | 4 +- src/commands/CommandFunctors.h | 113 +------ src/commands/CommandManager.cpp | 3 +- src/commands/OpenSaveCommands.cpp | 3 +- src/commands/SelectCommand.cpp | 6 +- src/toolbars/ScrubbingToolBar.cpp | 6 +- src/tracks/ui/Scrubbing.cpp | 12 +- src/tracks/ui/Scrubbing.h | 13 +- src/widgets/MultiDialog.cpp | 3 +- src/widgets/Ruler.cpp | 14 +- 16 files changed, 596 insertions(+), 681 deletions(-) diff --git a/src/AudacityApp.cpp b/src/AudacityApp.cpp index ec0cbd335..677d5111f 100644 --- a/src/AudacityApp.cpp +++ b/src/AudacityApp.cpp @@ -1570,7 +1570,7 @@ bool AudacityApp::OnInit() // Mainly this is to tell users of ALPHAS who don't know that they have an ALPHA. // Disabled for now, after discussion. // project->MayCheckForUpdates(); - project->OnHelpWelcome(); + project->OnHelpWelcome(*project); } // JKC 10-Sep-2007: Enable monitoring from the start. @@ -1663,7 +1663,7 @@ void AudacityApp::OnKeyDown(wxKeyEvent &event) gAudioIO->GetNumCaptureChannels() == 0) || scrubbing) // ESC out of other play (but not record) - project->OnStop(); + project->OnStop(*project); else event.Skip(); } diff --git a/src/BatchProcessDialog.cpp b/src/BatchProcessDialog.cpp index 16160dfb9..8335fcdcf 100644 --- a/src/BatchProcessDialog.cpp +++ b/src/BatchProcessDialog.cpp @@ -362,7 +362,7 @@ void BatchProcessDialog::OnApplyToFiles(wxCommandEvent & WXUNUSED(event)) auto success = GuardedCall< bool >( [&] { project->Import(files[i]); project->ZoomAfterImport(nullptr); - project->OnSelectAll(); + project->OnSelectAll(*project); if (!mBatchCommands.ApplyChain()) return false; @@ -377,10 +377,10 @@ void BatchProcessDialog::OnApplyToFiles(wxCommandEvent & WXUNUSED(event)) UndoManager *um = project->GetUndoManager(); um->ClearStates(); - project->OnSelectAll(); - project->OnRemoveTracks(); + project->OnSelectAll(*project); + project->OnRemoveTracks(*project); } - project->OnRemoveTracks(); + project->OnRemoveTracks(*project); // Under Linux an EndModal() here crashes (Bug #1221). // But sending a close message instead is OK. diff --git a/src/Menus.cpp b/src/Menus.cpp index 80a314669..6370a86de 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -288,7 +288,7 @@ static int SortEffectsByType(const PluginDescriptor **a, const PluginDescriptor // To supply the "finder" argument in AddItem calls static CommandHandlerObject &ident(AudacityProject &project) { return project; } -#define FN(X) ident, FNT(AudacityProject, this, & AudacityProject :: X) +#define FN(X) ident, static_cast(& AudacityProject :: X) void AudacityProject::CreateMenusAndCommands() { @@ -2197,7 +2197,7 @@ void AudacityProject::SelectAllIfNone() auto flags = GetUpdateFlags(); if(!(flags & TracksSelectedFlag) || (mViewInfo.selectedRegion.isPoint())) - OnSelectSomething(); + OnSelectSomething(*this); } // Stop playing or recording, if paused. @@ -2205,7 +2205,7 @@ void AudacityProject::StopIfPaused() { auto flags = GetUpdateFlags(); if( flags & PausedFlag ) - OnStop(); + OnStop(*this); } void AudacityProject::ModifyAllProjectToolbarMenus() @@ -2381,41 +2381,41 @@ void AudacityProject::SetTool(int tool) } /// Handler to set the select tool active -void AudacityProject::OnSelectTool() +void AudacityProject::OnSelectTool(const CommandContext &) { SetTool(selectTool); } /// Handler to set the Zoom tool active -void AudacityProject::OnZoomTool() +void AudacityProject::OnZoomTool(const CommandContext &) { SetTool(zoomTool); } /// Handler to set the Envelope tool active -void AudacityProject::OnEnvelopeTool() +void AudacityProject::OnEnvelopeTool(const CommandContext &) { SetTool(envelopeTool); } /// Handler to set the Time shift tool active -void AudacityProject::OnTimeShiftTool() +void AudacityProject::OnTimeShiftTool(const CommandContext &) { SetTool(slideTool); } -void AudacityProject::OnDrawTool() +void AudacityProject::OnDrawTool(const CommandContext &) { SetTool(drawTool); } -void AudacityProject::OnMultiTool() +void AudacityProject::OnMultiTool(const CommandContext &) { SetTool(multiTool); } -void AudacityProject::OnNextTool() +void AudacityProject::OnNextTool(const CommandContext &) { ToolsToolBar *toolbar = GetToolsToolBar(); if (toolbar) { @@ -2426,7 +2426,7 @@ void AudacityProject::OnNextTool() } } -void AudacityProject::OnPrevTool() +void AudacityProject::OnPrevTool(const CommandContext &) { ToolsToolBar *toolbar = GetToolsToolBar(); if (toolbar) { @@ -2478,7 +2478,7 @@ bool AudacityProject::MakeReadyToPlay(bool loop, bool cutpreview) return true; } -void AudacityProject::OnPlayOneSecond() +void AudacityProject::OnPlayOneSecond(const CommandContext &) { if( !MakeReadyToPlay() ) return; @@ -2497,7 +2497,7 @@ void AudacityProject::OnPlayOneSecond() /// play regions depending on where the current mouse /// position is relative to the left and right boundaries /// of the selection region. -void AudacityProject::OnPlayToSelection() +void AudacityProject::OnPlayToSelection(const CommandContext &) { if( !MakeReadyToPlay() ) return; @@ -2535,7 +2535,7 @@ void AudacityProject::OnPlayToSelection() // The next 4 functions provide a limited version of the // functionality of OnPlayToSelection() for keyboard users -void AudacityProject::OnPlayBeforeSelectionStart() +void AudacityProject::OnPlayBeforeSelectionStart(const CommandContext &) { if( !MakeReadyToPlay() ) return; @@ -2547,7 +2547,7 @@ void AudacityProject::OnPlayBeforeSelectionStart() GetControlToolBar()->PlayPlayRegion(SelectedRegion(t0 - beforeLen, t0), GetDefaultPlayOptions(), PlayMode::oneSecondPlay); } -void AudacityProject::OnPlayAfterSelectionStart() +void AudacityProject::OnPlayAfterSelectionStart(const CommandContext &) { if( !MakeReadyToPlay() ) return; @@ -2564,7 +2564,7 @@ void AudacityProject::OnPlayAfterSelectionStart() GetControlToolBar()->PlayPlayRegion(SelectedRegion(t0, t0 + afterLen), GetDefaultPlayOptions(), PlayMode::oneSecondPlay); } -void AudacityProject::OnPlayBeforeSelectionEnd() +void AudacityProject::OnPlayBeforeSelectionEnd(const CommandContext &) { if( !MakeReadyToPlay() ) return; @@ -2582,7 +2582,7 @@ void AudacityProject::OnPlayBeforeSelectionEnd() } -void AudacityProject::OnPlayAfterSelectionEnd() +void AudacityProject::OnPlayAfterSelectionEnd(const CommandContext &) { if( !MakeReadyToPlay() ) return; @@ -2594,7 +2594,7 @@ void AudacityProject::OnPlayAfterSelectionEnd() GetControlToolBar()->PlayPlayRegion(SelectedRegion(t1, t1 + afterLen), GetDefaultPlayOptions(), PlayMode::oneSecondPlay); } -void AudacityProject::OnPlayBeforeAndAfterSelectionStart() +void AudacityProject::OnPlayBeforeAndAfterSelectionStart(const CommandContext &) { if (!MakeReadyToPlay()) return; @@ -2612,7 +2612,7 @@ void AudacityProject::OnPlayBeforeAndAfterSelectionStart() GetControlToolBar()->PlayPlayRegion(SelectedRegion(t0 - beforeLen, t0 + afterLen), GetDefaultPlayOptions(), PlayMode::oneSecondPlay); } -void AudacityProject::OnPlayBeforeAndAfterSelectionEnd() +void AudacityProject::OnPlayBeforeAndAfterSelectionEnd(const CommandContext &) { if (!MakeReadyToPlay()) return; @@ -2631,7 +2631,7 @@ void AudacityProject::OnPlayBeforeAndAfterSelectionEnd() } -void AudacityProject::OnPlayLooped() +void AudacityProject::OnPlayLooped(const CommandContext &) { if( !MakeReadyToPlay(true) ) return; @@ -2641,7 +2641,7 @@ void AudacityProject::OnPlayLooped() GetControlToolBar()->PlayCurrentRegion(true); } -void AudacityProject::OnPlayCutPreview() +void AudacityProject::OnPlayCutPreview(const CommandContext &) { if ( !MakeReadyToPlay(false, true) ) return; @@ -2650,7 +2650,7 @@ void AudacityProject::OnPlayCutPreview() GetControlToolBar()->PlayCurrentRegion(false, true); } -void AudacityProject::OnPlayStop() +void AudacityProject::OnPlayStop(const CommandContext &) { ControlToolBar *toolbar = GetControlToolBar(); @@ -2702,21 +2702,21 @@ void AudacityProject::OnPlayStop() } } -void AudacityProject::OnStop() +void AudacityProject::OnStop(const CommandContext &) { wxCommandEvent evt; GetControlToolBar()->OnStop(evt); } -void AudacityProject::OnPause() +void AudacityProject::OnPause(const CommandContext &) { wxCommandEvent evt; GetControlToolBar()->OnPause(evt); } -void AudacityProject::OnRecord() +void AudacityProject::OnRecord(const CommandContext &) { wxCommandEvent evt; evt.SetInt(2); // 0 is default, use 1 to set shift on, 2 to clear it @@ -2726,7 +2726,7 @@ void AudacityProject::OnRecord() // If first choice is record same track 2nd choice is record NEW track // and vice versa. -void AudacityProject::OnRecord2ndChoice() +void AudacityProject::OnRecord2ndChoice(const CommandContext &) { wxCommandEvent evt; evt.SetInt(1); // 0 is default, use 1 to set shift on, 2 to clear it @@ -2735,7 +2735,7 @@ void AudacityProject::OnRecord2ndChoice() } // The code for "OnPlayStopSelect" is simply the code of "OnPlayStop" and "OnStopSelect" merged. -void AudacityProject::OnPlayStopSelect() +void AudacityProject::OnPlayStopSelect(const CommandContext &) { ControlToolBar *toolbar = GetControlToolBar(); wxCommandEvent evt; @@ -2798,7 +2798,7 @@ bool AudacityProject::DoPlayStopSelect(bool click, bool shift) return false; } -void AudacityProject::OnStopSelect() +void AudacityProject::OnStopSelect(const CommandContext &) { wxCommandEvent evt; @@ -2809,7 +2809,7 @@ void AudacityProject::OnStopSelect() } } -void AudacityProject::OnToggleSoundActivated() +void AudacityProject::OnToggleSoundActivated(const CommandContext &) { bool pause; gPrefs->Read(wxT("/AudioIO/SoundActivatedRecord"), &pause, false); @@ -2818,7 +2818,7 @@ void AudacityProject::OnToggleSoundActivated() ModifyAllProjectToolbarMenus(); } -void AudacityProject::OnTogglePinnedHead() +void AudacityProject::OnTogglePinnedHead(const CommandContext &) { bool value = !TracksPrefs::GetPinnedHeadPreference(); TracksPrefs::SetPinnedHeadPreference(value, true); @@ -2839,7 +2839,7 @@ void AudacityProject::OnTogglePinnedHead() scrubber.SetScrollScrubbing(value); } -void AudacityProject::OnTogglePlayRecording() +void AudacityProject::OnTogglePlayRecording(const CommandContext &) { bool Duplex; #ifdef EXPERIMENTAL_DA @@ -2852,7 +2852,7 @@ void AudacityProject::OnTogglePlayRecording() ModifyAllProjectToolbarMenus(); } -void AudacityProject::OnToggleSWPlaythrough() +void AudacityProject::OnToggleSWPlaythrough(const CommandContext &) { bool SWPlaythrough; gPrefs->Read(wxT("/AudioIO/SWPlaythrough"), &SWPlaythrough, false); @@ -2983,7 +2983,7 @@ void AudacityProject::SortTracks(int flags) mTracks->Permute(arr); } -void AudacityProject::OnSortTime() +void AudacityProject::OnSortTime(const CommandContext &) { SortTracks(kAudacitySortByTime); @@ -2992,7 +2992,7 @@ void AudacityProject::OnSortTime() mTrackPanel->Refresh(false); } -void AudacityProject::OnSortName() +void AudacityProject::OnSortName(const CommandContext &) { SortTracks(kAudacitySortByName); @@ -3001,7 +3001,7 @@ void AudacityProject::OnSortName() mTrackPanel->Refresh(false); } -void AudacityProject::OnSkipStart() +void AudacityProject::OnSkipStart(const CommandContext &) { wxCommandEvent evt; @@ -3009,7 +3009,7 @@ void AudacityProject::OnSkipStart() ModifyState(false); } -void AudacityProject::OnSkipEnd() +void AudacityProject::OnSkipEnd(const CommandContext &) { wxCommandEvent evt; @@ -3017,44 +3017,44 @@ void AudacityProject::OnSkipEnd() ModifyState(false); } -void AudacityProject::OnSeekLeftShort() +void AudacityProject::OnSeekLeftShort(const CommandContext &) { OnCursorLeft( false, false ); } -void AudacityProject::OnSeekRightShort() +void AudacityProject::OnSeekRightShort(const CommandContext &) { OnCursorRight( false, false ); } -void AudacityProject::OnSeekLeftLong() +void AudacityProject::OnSeekLeftLong(const CommandContext &) { OnCursorLeft( true, false ); } -void AudacityProject::OnSeekRightLong() +void AudacityProject::OnSeekRightLong(const CommandContext &) { OnCursorRight( true, false ); } -void AudacityProject::OnSelToStart() +void AudacityProject::OnSelToStart(const CommandContext &) { Rewind(true); ModifyState(false); } -void AudacityProject::OnSelToEnd() +void AudacityProject::OnSelToEnd(const CommandContext &) { SkipEnd(true); ModifyState(false); } -void AudacityProject::OnMoveToNextLabel() +void AudacityProject::OnMoveToNextLabel(const CommandContext &) { OnMoveToLabel(true); } -void AudacityProject::OnMoveToPrevLabel() +void AudacityProject::OnMoveToPrevLabel(const CommandContext &) { OnMoveToLabel(false); } @@ -3095,10 +3095,10 @@ void AudacityProject::OnMoveToLabel(bool next) if (i >= 0) { const LabelStruct* label = lt->GetLabel(i); if (IsAudioActive()) { - OnPlayStop(); // stop + OnPlayStop(*this); // stop GetViewInfo().selectedRegion = label->selectedRegion; RedrawProject(); - OnPlayStop(); // play + OnPlayStop(*this); // play } else { GetViewInfo().selectedRegion = label->selectedRegion; @@ -3337,17 +3337,17 @@ void AudacityProject::OnNextTrack( bool shift ) } } -void AudacityProject::OnCursorUp() +void AudacityProject::OnCursorUp(const CommandContext &) { OnPrevTrack( false ); } -void AudacityProject::OnCursorDown() +void AudacityProject::OnCursorDown(const CommandContext &) { OnNextTrack( false ); } -void AudacityProject::OnFirstTrack() +void AudacityProject::OnFirstTrack(const CommandContext &) { Track *t = mTrackPanel->GetFocusedTrack(); if (!t) @@ -3363,7 +3363,7 @@ void AudacityProject::OnFirstTrack() mTrackPanel->EnsureVisible(f); } -void AudacityProject::OnLastTrack() +void AudacityProject::OnLastTrack(const CommandContext &) { Track *t = mTrackPanel->GetFocusedTrack(); if (!t) @@ -3379,18 +3379,18 @@ void AudacityProject::OnLastTrack() mTrackPanel->EnsureVisible(l); } -void AudacityProject::OnShiftUp() +void AudacityProject::OnShiftUp(const CommandContext &) { OnPrevTrack( true ); } -void AudacityProject::OnShiftDown() +void AudacityProject::OnShiftDown(const CommandContext &) { OnNextTrack( true ); } #include "TrackPanelAx.h" -void AudacityProject::OnToggle() +void AudacityProject::OnToggle(const CommandContext &) { Track *t; @@ -3423,68 +3423,74 @@ void AudacityProject::HandleListSelection(Track *t, bool shift, bool ctrl, } -void AudacityProject::OnCursorLeft(const wxEvent * evt) +void AudacityProject::OnCursorLeft(const CommandContext &context) { + auto evt = context.pEvt; bool bKeyUp = (evt) && evt->GetEventType() == wxEVT_KEY_UP; OnCursorLeft( false, false, bKeyUp ); } -void AudacityProject::OnCursorRight(const wxEvent * evt) +void AudacityProject::OnCursorRight(const CommandContext &context) { + auto evt = context.pEvt; bool bKeyUp = (evt) && evt->GetEventType() == wxEVT_KEY_UP; OnCursorRight( false, false, bKeyUp ); } -void AudacityProject::OnCursorShortJumpLeft() +void AudacityProject::OnCursorShortJumpLeft(const CommandContext &) { OnCursorMove( false, true, false ); } -void AudacityProject::OnCursorShortJumpRight() +void AudacityProject::OnCursorShortJumpRight(const CommandContext &) { OnCursorMove( true, true, false ); } -void AudacityProject::OnCursorLongJumpLeft() +void AudacityProject::OnCursorLongJumpLeft(const CommandContext &) { OnCursorMove( false, true, true ); } -void AudacityProject::OnCursorLongJumpRight() +void AudacityProject::OnCursorLongJumpRight(const CommandContext &) { OnCursorMove( true, true, true ); } -void AudacityProject::OnSelSetExtendLeft() +void AudacityProject::OnSelSetExtendLeft(const CommandContext &) { OnBoundaryMove( true, false); } -void AudacityProject::OnSelSetExtendRight() +void AudacityProject::OnSelSetExtendRight(const CommandContext &) { OnBoundaryMove( false, false); } -void AudacityProject::OnSelExtendLeft(const wxEvent * evt) +void AudacityProject::OnSelExtendLeft(const CommandContext &context) { + auto evt = context.pEvt; bool bKeyUp = (evt) && evt->GetEventType() == wxEVT_KEY_UP; OnCursorLeft( true, false, bKeyUp ); } -void AudacityProject::OnSelExtendRight(const wxEvent * evt) +void AudacityProject::OnSelExtendRight(const CommandContext &context) { + auto evt = context.pEvt; bool bKeyUp = (evt) && evt->GetEventType() == wxEVT_KEY_UP; OnCursorRight( true, false, bKeyUp ); } -void AudacityProject::OnSelContractLeft(const wxEvent * evt) +void AudacityProject::OnSelContractLeft(const CommandContext &context) { + auto evt = context.pEvt; bool bKeyUp = (evt) && evt->GetEventType() == wxEVT_KEY_UP; OnCursorRight( true, true, bKeyUp ); } -void AudacityProject::OnSelContractRight(const wxEvent * evt) +void AudacityProject::OnSelContractRight(const CommandContext &context) { + auto evt = context.pEvt; bool bKeyUp = (evt) && evt->GetEventType() == wxEVT_KEY_UP; OnCursorLeft( true, true, bKeyUp ); } @@ -3582,8 +3588,9 @@ void AudacityProject::DoClipLeftOrRight(bool right, bool keyUp ) panel.MessageForScreenReader( _("clip not moved")); } -void AudacityProject::OnClipLeft(const wxEvent* evt) +void AudacityProject::OnClipLeft(const CommandContext &context) { + auto evt = context.pEvt; if (evt) DoClipLeftOrRight( false, evt->GetEventType() == wxEVT_KEY_UP ); else { // called from menu, so simulate keydown and keyup @@ -3592,8 +3599,9 @@ void AudacityProject::OnClipLeft(const wxEvent* evt) } } -void AudacityProject::OnClipRight(const wxEvent* evt) +void AudacityProject::OnClipRight(const CommandContext &context) { + auto evt = context.pEvt; if (evt) DoClipLeftOrRight( true, evt->GetEventType() == wxEVT_KEY_UP ); else { // called from menu, so simulate keydown and keyup @@ -3605,7 +3613,7 @@ void AudacityProject::OnClipRight(const wxEvent* evt) //this pops up a dialog which allows the left selection to be set. //If playing/recording is happening, it sets the left selection at //the current play position. -void AudacityProject::OnSetLeftSelection() +void AudacityProject::OnSetLeftSelection(const CommandContext &) { bool bSelChanged = false; if ((GetAudioIOToken() > 0) && gAudioIO->IsStreamActive(GetAudioIOToken())) @@ -3637,7 +3645,7 @@ void AudacityProject::OnSetLeftSelection() } -void AudacityProject::OnSetRightSelection() +void AudacityProject::OnSetRightSelection(const CommandContext &) { bool bSelChanged = false; if ((GetAudioIOToken() > 0) && gAudioIO->IsStreamActive(GetAudioIOToken())) @@ -3728,17 +3736,17 @@ void AudacityProject::NextOrPrevFrame(bool forward) } } -void AudacityProject::NextFrame() +void AudacityProject::NextFrame(const CommandContext &) { NextOrPrevFrame(true); } -void AudacityProject::PrevFrame() +void AudacityProject::PrevFrame(const CommandContext &) { NextOrPrevFrame(false); } -void AudacityProject::NextWindow() +void AudacityProject::NextWindow(const CommandContext &) { wxWindow *w = wxGetTopLevelParent(wxWindow::FindFocus()); const auto & list = GetChildren(); @@ -3795,7 +3803,7 @@ void AudacityProject::NextWindow() #endif } -void AudacityProject::PrevWindow() +void AudacityProject::PrevWindow(const CommandContext &) { wxWindow *w = wxGetTopLevelParent(wxWindow::FindFocus()); const auto & list = GetChildren(); @@ -3849,7 +3857,7 @@ void AudacityProject::PrevWindow() ///The following methods operate controls on specified tracks, ///This will pop up the track panning dialog for specified track -void AudacityProject::OnTrackPan() +void AudacityProject::OnTrackPan(const CommandContext &) { Track *const track = mTrackPanel->GetFocusedTrack(); if (!track || (track->GetKind() != Track::Wave)) { @@ -3863,7 +3871,7 @@ void AudacityProject::OnTrackPan() } } -void AudacityProject::OnTrackPanLeft() +void AudacityProject::OnTrackPanLeft(const CommandContext &) { Track *const track = mTrackPanel->GetFocusedTrack(); if (!track || (track->GetKind() != Track::Wave)) { @@ -3876,7 +3884,7 @@ void AudacityProject::OnTrackPanLeft() SetTrackPan(wt, slider); } -void AudacityProject::OnTrackPanRight() +void AudacityProject::OnTrackPanRight(const CommandContext &) { Track *const track = mTrackPanel->GetFocusedTrack(); if (!track || (track->GetKind() != Track::Wave)) { @@ -3889,7 +3897,7 @@ void AudacityProject::OnTrackPanRight() SetTrackPan(wt, slider); } -void AudacityProject::OnTrackGain() +void AudacityProject::OnTrackGain(const CommandContext &) { /// This will pop up the track gain dialog for specified track Track *const track = mTrackPanel->GetFocusedTrack(); @@ -3904,7 +3912,7 @@ void AudacityProject::OnTrackGain() } } -void AudacityProject::OnTrackGainInc() +void AudacityProject::OnTrackGainInc(const CommandContext &) { Track *const track = mTrackPanel->GetFocusedTrack(); if (!track || (track->GetKind() != Track::Wave)) { @@ -3917,7 +3925,7 @@ void AudacityProject::OnTrackGainInc() SetTrackGain(wt, slider); } -void AudacityProject::OnTrackGainDec() +void AudacityProject::OnTrackGainDec(const CommandContext &) { Track *const track = mTrackPanel->GetFocusedTrack(); if (!track || (track->GetKind() != Track::Wave)) { @@ -3930,12 +3938,12 @@ void AudacityProject::OnTrackGainDec() SetTrackGain(wt, slider); } -void AudacityProject::OnTrackMenu() +void AudacityProject::OnTrackMenu(const CommandContext &) { mTrackPanel->OnTrackMenu(); } -void AudacityProject::OnTrackMute() +void AudacityProject::OnTrackMute(const CommandContext &) { Track *t = NULL; if (!t) { @@ -3946,7 +3954,7 @@ void AudacityProject::OnTrackMute() DoTrackMute(t, false); } -void AudacityProject::OnTrackSolo() +void AudacityProject::OnTrackSolo(const CommandContext &) { Track *t = NULL; if (!t) @@ -3958,7 +3966,7 @@ void AudacityProject::OnTrackSolo() DoTrackSolo(t, false); } -void AudacityProject::OnTrackClose() +void AudacityProject::OnTrackClose(const CommandContext &) { Track *t = mTrackPanel->GetFocusedTrack(); if (!t) @@ -3977,7 +3985,7 @@ void AudacityProject::OnTrackClose() GetTrackPanel()->Refresh(false); } -void AudacityProject::OnTrackMoveUp() +void AudacityProject::OnTrackMoveUp(const CommandContext &) { Track *const focusedTrack = mTrackPanel->GetFocusedTrack(); if (mTracks->CanMoveUp(focusedTrack)) { @@ -3986,7 +3994,7 @@ void AudacityProject::OnTrackMoveUp() } } -void AudacityProject::OnTrackMoveDown() +void AudacityProject::OnTrackMoveDown(const CommandContext &) { Track *const focusedTrack = mTrackPanel->GetFocusedTrack(); if (mTracks->CanMoveDown(focusedTrack)) { @@ -3995,7 +4003,7 @@ void AudacityProject::OnTrackMoveDown() } } -void AudacityProject::OnTrackMoveTop() +void AudacityProject::OnTrackMoveTop(const CommandContext &) { Track *const focusedTrack = mTrackPanel->GetFocusedTrack(); if (mTracks->CanMoveUp(focusedTrack)) { @@ -4004,7 +4012,7 @@ void AudacityProject::OnTrackMoveTop() } } -void AudacityProject::OnTrackMoveBottom() +void AudacityProject::OnTrackMoveBottom(const CommandContext &) { Track *const focusedTrack = mTrackPanel->GetFocusedTrack(); if (mTracks->CanMoveDown(focusedTrack)) { @@ -4073,7 +4081,7 @@ void AudacityProject::MoveTrack(Track* target, MoveChoice choice) GetTrackPanel()->Refresh(false); } -void AudacityProject::OnInputDevice() +void AudacityProject::OnInputDevice(const CommandContext &) { DeviceToolBar *tb = GetDeviceToolBar(); if (tb) { @@ -4081,7 +4089,7 @@ void AudacityProject::OnInputDevice() } } -void AudacityProject::OnOutputDevice() +void AudacityProject::OnOutputDevice(const CommandContext &) { DeviceToolBar *tb = GetDeviceToolBar(); if (tb) { @@ -4089,7 +4097,7 @@ void AudacityProject::OnOutputDevice() } } -void AudacityProject::OnAudioHost() +void AudacityProject::OnAudioHost(const CommandContext &) { DeviceToolBar *tb = GetDeviceToolBar(); if (tb) { @@ -4097,7 +4105,7 @@ void AudacityProject::OnAudioHost() } } -void AudacityProject::OnInputChannels() +void AudacityProject::OnInputChannels(const CommandContext &) { DeviceToolBar *tb = GetDeviceToolBar(); if (tb) { @@ -4105,7 +4113,7 @@ void AudacityProject::OnInputChannels() } } -void AudacityProject::OnOutputGain() +void AudacityProject::OnOutputGain(const CommandContext &) { MixerToolBar *tb = GetMixerToolBar(); if (tb) { @@ -4113,7 +4121,7 @@ void AudacityProject::OnOutputGain() } } -void AudacityProject::OnInputGain() +void AudacityProject::OnInputGain(const CommandContext &) { MixerToolBar *tb = GetMixerToolBar(); if (tb) { @@ -4121,7 +4129,7 @@ void AudacityProject::OnInputGain() } } -void AudacityProject::OnOutputGainInc() +void AudacityProject::OnOutputGainInc(const CommandContext &) { MixerToolBar *tb = GetMixerToolBar(); if (tb) { @@ -4129,7 +4137,7 @@ void AudacityProject::OnOutputGainInc() } } -void AudacityProject::OnOutputGainDec() +void AudacityProject::OnOutputGainDec(const CommandContext &) { MixerToolBar *tb = GetMixerToolBar(); if (tb) { @@ -4137,7 +4145,7 @@ void AudacityProject::OnOutputGainDec() } } -void AudacityProject::OnInputGainInc() +void AudacityProject::OnInputGainInc(const CommandContext &) { MixerToolBar *tb = GetMixerToolBar(); if (tb) { @@ -4145,7 +4153,7 @@ void AudacityProject::OnInputGainInc() } } -void AudacityProject::OnInputGainDec() +void AudacityProject::OnInputGainDec(const CommandContext &) { MixerToolBar *tb = GetMixerToolBar(); if (tb) { @@ -4153,7 +4161,7 @@ void AudacityProject::OnInputGainDec() } } -void AudacityProject::OnPlayAtSpeed() +void AudacityProject::OnPlayAtSpeed(const CommandContext &) { TranscriptionToolBar *tb = GetTranscriptionToolBar(); if (tb) { @@ -4161,7 +4169,7 @@ void AudacityProject::OnPlayAtSpeed() } } -void AudacityProject::OnPlayAtSpeedLooped() +void AudacityProject::OnPlayAtSpeedLooped(const CommandContext &) { TranscriptionToolBar *tb = GetTranscriptionToolBar(); if (tb) { @@ -4169,7 +4177,7 @@ void AudacityProject::OnPlayAtSpeedLooped() } } -void AudacityProject::OnPlayAtSpeedCutPreview() +void AudacityProject::OnPlayAtSpeedCutPreview(const CommandContext &) { TranscriptionToolBar *tb = GetTranscriptionToolBar(); if (tb) { @@ -4177,7 +4185,7 @@ void AudacityProject::OnPlayAtSpeedCutPreview() } } -void AudacityProject::OnSetPlaySpeed() +void AudacityProject::OnSetPlaySpeed(const CommandContext &) { TranscriptionToolBar *tb = GetTranscriptionToolBar(); if (tb) { @@ -4185,7 +4193,7 @@ void AudacityProject::OnSetPlaySpeed() } } -void AudacityProject::OnPlaySpeedInc() +void AudacityProject::OnPlaySpeedInc(const CommandContext &) { TranscriptionToolBar *tb = GetTranscriptionToolBar(); if (tb) { @@ -4193,7 +4201,7 @@ void AudacityProject::OnPlaySpeedInc() } } -void AudacityProject::OnPlaySpeedDec() +void AudacityProject::OnPlaySpeedDec(const CommandContext &) { TranscriptionToolBar *tb = GetTranscriptionToolBar(); if (tb) { @@ -4274,7 +4282,7 @@ double AudacityProject::NearestZeroCrossing(double t0) return t0 + (argmin - (int)windowSize/2)/GetRate(); } -void AudacityProject::OnZeroCrossing() +void AudacityProject::OnZeroCrossing(const CommandContext &) { const double t0 = NearestZeroCrossing(mViewInfo.selectedRegion.t0()); if (mViewInfo.selectedRegion.isPoint()) @@ -4310,7 +4318,7 @@ bool AudacityProject::DoEffect(const PluginID & ID, int flags) // for batch commands if (flags & OnEffectFlags::kConfigured) { - OnStop(); + OnStop(*this); SelectAllIfNone(); } @@ -4401,7 +4409,7 @@ bool AudacityProject::DoEffect(const PluginID & ID, int flags) if (type == EffectTypeGenerate) { if (count == 0 || (clean && mViewInfo.selectedRegion.t0() == 0.0)) - OnZoomFit(); + OnZoomFit(*this); // mTrackPanel->Refresh(false); } RedrawProject(); @@ -4424,16 +4432,16 @@ bool AudacityProject::DoEffect(const PluginID & ID, int flags) return true; } -void AudacityProject::OnEffect(const PluginID & ID, int flags) +void AudacityProject::OnEffect(const CommandContext &context) { - DoEffect(ID, flags); + DoEffect(context.parameter, 0); } -void AudacityProject::OnRepeatLastEffect(int WXUNUSED(index)) +void AudacityProject::OnRepeatLastEffect(const CommandContext &) { if (!mLastEffect.IsEmpty()) { - OnEffect(mLastEffect, OnEffectFlags::kConfigured); + DoEffect(mLastEffect, OnEffectFlags::kConfigured); } } @@ -4462,26 +4470,26 @@ void AudacityProject::OnManagePluginsMenu(EffectType type) RebuildAllMenuBars(); } -void AudacityProject::OnManageGenerators() +void AudacityProject::OnManageGenerators(const CommandContext &) { OnManagePluginsMenu(EffectTypeGenerate); } -void AudacityProject::OnManageEffects() +void AudacityProject::OnManageEffects(const CommandContext &) { OnManagePluginsMenu(EffectTypeProcess); } -void AudacityProject::OnManageAnalyzers() +void AudacityProject::OnManageAnalyzers(const CommandContext &) { OnManagePluginsMenu(EffectTypeAnalyze); } -void AudacityProject::OnStereoToMono(int WXUNUSED(index)) +void AudacityProject::OnStereoToMono(const CommandContext &) { - OnEffect(EffectManager::Get().GetEffectByIdentifier(wxT("StereoToMono")), + DoEffect(EffectManager::Get().GetEffectByIdentifier(wxT("StereoToMono")), OnEffectFlags::kConfigured); } @@ -4489,50 +4497,50 @@ void AudacityProject::OnStereoToMono(int WXUNUSED(index)) // File Menu // -void AudacityProject::OnNew() +void AudacityProject::OnNew(const CommandContext &) { CreateNewAudacityProject(); } -void AudacityProject::OnOpen() +void AudacityProject::OnOpen(const CommandContext &) { OpenFiles(this); } -void AudacityProject::OnClose() +void AudacityProject::OnClose(const CommandContext &) { mMenuClose = true; Close(); } -void AudacityProject::OnSave() +void AudacityProject::OnSave(const CommandContext &) { Save(); } -void AudacityProject::OnSaveAs() +void AudacityProject::OnSaveAs(const CommandContext &) { SaveAs(); } #ifdef USE_LIBVORBIS - void AudacityProject::OnSaveCompressed() + void AudacityProject::OnSaveCompressed(const CommandContext &) { SaveAs(true); } #endif -void AudacityProject::OnCheckDependencies() +void AudacityProject::OnCheckDependencies(const CommandContext &) { ShowDependencyDialogIfNeeded(this, false); } -void AudacityProject::OnExit() +void AudacityProject::OnExit(const CommandContext &) { QuitAudacity(); } -void AudacityProject::OnExportLabels() +void AudacityProject::OnExportLabels(const CommandContext &) { Track *t; int numLabelTracks = 0; @@ -4607,7 +4615,7 @@ void AudacityProject::OnExportLabels() #ifdef USE_MIDI -void AudacityProject::OnExportMIDI(){ +void AudacityProject::OnExportMIDI(const CommandContext &){ TrackListIterator iter(GetTracks()); Track *t = iter.First(); int numNoteTracksSelected = 0; @@ -4705,12 +4713,12 @@ void AudacityProject::OnExport(const wxString & Format ) e.Process(this, false, 0.0, mTracks->GetEndTime()); } -void AudacityProject::OnExportAudio(){ OnExport("");} -void AudacityProject::OnExportMp3(){ OnExport("MP3");} -void AudacityProject::OnExportWav(){ OnExport("WAV");} -void AudacityProject::OnExportOgg(){ OnExport("OGG");} +void AudacityProject::OnExportAudio(const CommandContext &){ OnExport("");} +void AudacityProject::OnExportMp3(const CommandContext &){ OnExport("MP3");} +void AudacityProject::OnExportWav(const CommandContext &){ OnExport("WAV");} +void AudacityProject::OnExportOgg(const CommandContext &){ OnExport("OGG");} -void AudacityProject::OnExportSelection() +void AudacityProject::OnExportSelection(const CommandContext &) { Exporter e; @@ -4720,7 +4728,7 @@ void AudacityProject::OnExportSelection() mViewInfo.selectedRegion.t1()); } -void AudacityProject::OnExportMultiple() +void AudacityProject::OnExportMultiple(const CommandContext &) { ExportMultiple em(this); @@ -4728,7 +4736,7 @@ void AudacityProject::OnExportMultiple() em.ShowModal(); } -void AudacityProject::OnPreferences() +void AudacityProject::OnPreferences(const CommandContext &) { GlobalPrefsDialog dialog(this /* parent */ ); @@ -4762,12 +4770,12 @@ void AudacityProject::OnPreferences() } } -void AudacityProject::OnPageSetup() +void AudacityProject::OnPageSetup(const CommandContext &) { HandlePageSetup(this); } -void AudacityProject::OnPrint() +void AudacityProject::OnPrint(const CommandContext &) { HandlePrint(this, GetName(), GetTracks()); } @@ -4776,7 +4784,7 @@ void AudacityProject::OnPrint() // Edit Menu // -void AudacityProject::OnUndo() +void AudacityProject::OnUndo(const CommandContext &) { if (!GetUndoManager()->UndoAvailable()) { AudacityMessageBox(_("Nothing to undo")); @@ -4806,7 +4814,7 @@ void AudacityProject::OnUndo() ModifyUndoMenuItems(); } -void AudacityProject::OnRedo() +void AudacityProject::OnRedo(const CommandContext &) { if (!GetUndoManager()->RedoAvailable()) { AudacityMessageBox(_("Nothing to redo")); @@ -4853,7 +4861,7 @@ void AudacityProject::FinishCopy list.Add(std::move(dest)); } -void AudacityProject::OnCut() +void AudacityProject::OnCut(const CommandContext &) { TrackListIterator iter(GetTracks()); Track *n = iter.First(); @@ -4953,7 +4961,7 @@ void AudacityProject::OnCut() } -void AudacityProject::OnSplitCut() +void AudacityProject::OnSplitCut(const CommandContext &) { TrackListIterator iter(GetTracks()); Track *n = iter.First(); @@ -5001,7 +5009,7 @@ void AudacityProject::OnSplitCut() } -void AudacityProject::OnCopy() +void AudacityProject::OnCopy(const CommandContext &) { TrackListIterator iter(GetTracks()); @@ -5049,7 +5057,7 @@ void AudacityProject::OnCopy() mHistoryWindow->UpdateDisplay(); } -void AudacityProject::OnPaste() +void AudacityProject::OnPaste(const CommandContext &) { // Handle text paste (into active label) first. if (this->HandlePasteText()) @@ -5408,7 +5416,7 @@ bool AudacityProject::HandlePasteNothingSelected() // Creates a NEW label in each selected label track with text from the system // clipboard -void AudacityProject::OnPasteNewLabel() +void AudacityProject::OnPasteNewLabel(const CommandContext &) { bool bPastedSomething = false; @@ -5477,7 +5485,7 @@ void AudacityProject::OnPasteNewLabel() } } -void AudacityProject::OnPasteOver() // not currently in use it appears +void AudacityProject::OnPasteOver(const CommandContext &context) // not currently in use it appears { if((msClipT1 - msClipT0) > 0.0) { @@ -5485,12 +5493,12 @@ void AudacityProject::OnPasteOver() // not currently in use it appears mViewInfo.selectedRegion.t0() + (msClipT1 - msClipT0)); // MJS: pointless, given what we do in OnPaste? } - OnPaste(); + OnPaste(context); return; } -void AudacityProject::OnTrim() +void AudacityProject::OnTrim(const CommandContext &) { if (mViewInfo.selectedRegion.isPoint()) return; @@ -5529,12 +5537,12 @@ void AudacityProject::OnTrim() RedrawProject(); } -void AudacityProject::OnDelete() +void AudacityProject::OnDelete(const CommandContext &) { Clear(); } -void AudacityProject::OnSplitDelete() +void AudacityProject::OnSplitDelete(const CommandContext &) { TrackListIterator iter(GetTracks()); @@ -5563,7 +5571,7 @@ void AudacityProject::OnSplitDelete() RedrawProject(); } -void AudacityProject::OnDisjoin() +void AudacityProject::OnDisjoin(const CommandContext &) { TrackListIterator iter(GetTracks()); @@ -5588,7 +5596,7 @@ void AudacityProject::OnDisjoin() RedrawProject(); } -void AudacityProject::OnJoin() +void AudacityProject::OnJoin(const CommandContext &) { TrackListIterator iter(GetTracks()); @@ -5613,7 +5621,7 @@ void AudacityProject::OnJoin() RedrawProject(); } -void AudacityProject::OnSilence() +void AudacityProject::OnSilence(const CommandContext &) { TrackListIterator iter(GetTracks()); @@ -5630,7 +5638,7 @@ void AudacityProject::OnSilence() mTrackPanel->Refresh(false); } -void AudacityProject::OnDuplicate() +void AudacityProject::OnDuplicate(const CommandContext &) { TrackListIterator iter(GetTracks()); @@ -5659,7 +5667,7 @@ void AudacityProject::OnDuplicate() RedrawProject(); } -void AudacityProject::OnCutLabels() +void AudacityProject::OnCutLabels(const CommandContext &) { if( mViewInfo.selectedRegion.isPoint() ) return; @@ -5686,7 +5694,7 @@ void AudacityProject::OnCutLabels() RedrawProject(); } -void AudacityProject::OnSplitCutLabels() +void AudacityProject::OnSplitCutLabels(const CommandContext &) { if( mViewInfo.selectedRegion.isPoint() ) return; @@ -5704,7 +5712,7 @@ void AudacityProject::OnSplitCutLabels() RedrawProject(); } -void AudacityProject::OnCopyLabels() +void AudacityProject::OnCopyLabels(const CommandContext &) { if( mViewInfo.selectedRegion.isPoint() ) return; @@ -5720,7 +5728,7 @@ void AudacityProject::OnCopyLabels() mTrackPanel->Refresh( false ); } -void AudacityProject::OnDeleteLabels() +void AudacityProject::OnDeleteLabels(const CommandContext &) { if( mViewInfo.selectedRegion.isPoint() ) return; @@ -5738,7 +5746,7 @@ void AudacityProject::OnDeleteLabels() RedrawProject(); } -void AudacityProject::OnSplitDeleteLabels() +void AudacityProject::OnSplitDeleteLabels(const CommandContext &) { if( mViewInfo.selectedRegion.isPoint() ) return; @@ -5754,7 +5762,7 @@ void AudacityProject::OnSplitDeleteLabels() RedrawProject(); } -void AudacityProject::OnSilenceLabels() +void AudacityProject::OnSilenceLabels(const CommandContext &) { if( mViewInfo.selectedRegion.isPoint() ) return; @@ -5770,7 +5778,7 @@ void AudacityProject::OnSilenceLabels() mTrackPanel->Refresh( false ); } -void AudacityProject::OnSplitLabels() +void AudacityProject::OnSplitLabels(const CommandContext &) { EditByLabel( &WaveTrack::Split, false ); @@ -5783,7 +5791,7 @@ void AudacityProject::OnSplitLabels() RedrawProject(); } -void AudacityProject::OnJoinLabels() +void AudacityProject::OnJoinLabels(const CommandContext &) { if( mViewInfo.selectedRegion.isPoint() ) return; @@ -5799,7 +5807,7 @@ void AudacityProject::OnJoinLabels() RedrawProject(); } -void AudacityProject::OnDisjoinLabels() +void AudacityProject::OnDisjoinLabels(const CommandContext &) { if( mViewInfo.selectedRegion.isPoint() ) return; @@ -5817,7 +5825,7 @@ void AudacityProject::OnDisjoinLabels() RedrawProject(); } -void AudacityProject::OnSplit() +void AudacityProject::OnSplit(const CommandContext &) { TrackListIterator iter(GetTracks()); @@ -5887,7 +5895,7 @@ void AudacityProject::OnSplit() #endif } -void AudacityProject::OnSplitNew() +void AudacityProject::OnSplitNew(const CommandContext &) { TrackListIterator iter(GetTracks()); Track *l = iter.Last(); @@ -5971,17 +5979,17 @@ void AudacityProject::OnSelectTimeAndTracks(bool bAllTime, bool bAllTracks) mMixerBoard->Refresh(false);} } -void AudacityProject::OnSelectAllTime() +void AudacityProject::OnSelectAllTime(const CommandContext &) { OnSelectTimeAndTracks( true, false ); } -void AudacityProject::OnSelectAllTracks() +void AudacityProject::OnSelectAllTracks(const CommandContext &) { OnSelectTimeAndTracks( false, true ); } -void AudacityProject::OnSelectAll() +void AudacityProject::OnSelectAll(const CommandContext &) { OnSelectTimeAndTracks( true, true ); } @@ -5991,7 +5999,7 @@ void AudacityProject::OnSelectAll() // There is an argument for making it just count wave tracks, // However you could then not select a label and cut it, // without this function selecting all tracks. -void AudacityProject::OnSelectSomething() +void AudacityProject::OnSelectSomething(const CommandContext &) { bool bTime = mViewInfo.selectedRegion.isPoint(); bool bTracks = CountSelectedTracks() == 0; @@ -6013,7 +6021,7 @@ void AudacityProject::SelectNone() mMixerBoard->Refresh(false); } -void AudacityProject::OnSelectNone() +void AudacityProject::OnSelectNone(const CommandContext &) { mViewInfo.selectedRegion.collapseToT0(); SelectNone(); @@ -6021,7 +6029,7 @@ void AudacityProject::OnSelectNone() } #ifdef EXPERIMENTAL_SPECTRAL_EDITING -void AudacityProject::OnToggleSpectralSelection() +void AudacityProject::OnToggleSpectralSelection(const CommandContext &) { SelectedRegion ®ion = mViewInfo.selectedRegion; const double f0 = region.f0(); @@ -6065,19 +6073,19 @@ void AudacityProject::DoNextPeakFrequency(bool up) } } -void AudacityProject::OnNextHigherPeakFrequency() +void AudacityProject::OnNextHigherPeakFrequency(const CommandContext &) { DoNextPeakFrequency(true); } -void AudacityProject::OnNextLowerPeakFrequency() +void AudacityProject::OnNextLowerPeakFrequency(const CommandContext &) { DoNextPeakFrequency(false); } #endif -void AudacityProject::OnSelectCursorEnd() +void AudacityProject::OnSelectCursorEnd(const CommandContext &) { double kWayOverToLeft = -1000000.0; double maxEndOffset = kWayOverToLeft; @@ -6104,7 +6112,7 @@ void AudacityProject::OnSelectCursorEnd() mTrackPanel->Refresh(false); } -void AudacityProject::OnSelectStartCursor() +void AudacityProject::OnSelectStartCursor(const CommandContext &) { double kWayOverToRight = 1000000.0; double minOffset = kWayOverToRight; @@ -6131,12 +6139,12 @@ void AudacityProject::OnSelectStartCursor() mTrackPanel->Refresh(false); } -void AudacityProject::OnSelectPrevClipBoundaryToCursor() +void AudacityProject::OnSelectPrevClipBoundaryToCursor(const CommandContext &) { OnSelectClipBoundary(false); } -void AudacityProject::OnSelectCursorToNextClipBoundary() +void AudacityProject::OnSelectCursorToNextClipBoundary(const CommandContext &) { OnSelectClipBoundary(true); } @@ -6331,12 +6339,12 @@ bool AudacityProject::ChannelsHaveSameClipBoundaries(const WaveTrack* wt) return sameClips; } -void AudacityProject::OnSelectPrevClip() +void AudacityProject::OnSelectPrevClip(const CommandContext &) { OnSelectClip(false); } -void AudacityProject::OnSelectNextClip() +void AudacityProject::OnSelectNextClip(const CommandContext &) { OnSelectClip(true); } @@ -6383,7 +6391,7 @@ void AudacityProject::OnSelectClip(bool next) } } -void AudacityProject::OnSelectCursorStoredCursor() +void AudacityProject::OnSelectCursorStoredCursor(const CommandContext &) { if (mCursorPositionHasBeenStored) { double cursorPositionCurrent = IsAudioActive() ? gAudioIO->GetStreamTime() : mViewInfo.selectedRegion.t0(); @@ -6395,7 +6403,7 @@ void AudacityProject::OnSelectCursorStoredCursor() } } -void AudacityProject::OnSelectSyncLockSel() +void AudacityProject::OnSelectSyncLockSel(const CommandContext &) { bool selected = false; TrackListIterator iter(GetTracks()); @@ -6419,7 +6427,7 @@ void AudacityProject::OnSelectSyncLockSel() // View Menu // -void AudacityProject::OnZoomIn() +void AudacityProject::OnZoomIn(const CommandContext &) { ZoomInByFactor( 2.0 ); } @@ -6502,7 +6510,7 @@ void AudacityProject::ZoomInByFactor( double ZoomFactor ) TP_ScrollWindow(newh); } -void AudacityProject::OnZoomOut() +void AudacityProject::OnZoomOut(const CommandContext &) { ZoomOutByFactor( 1 /2.0 ); } @@ -6547,13 +6555,13 @@ void AudacityProject::OnZoomToggle() #endif -void AudacityProject::OnZoomNormal() +void AudacityProject::OnZoomNormal(const CommandContext &) { Zoom(ZoomInfo::GetDefaultZoom()); mTrackPanel->Refresh(false); } -void AudacityProject::OnZoomFit() +void AudacityProject::OnZoomFit(const CommandContext &) { const double end = mTracks->GetEndTime(); const double start = mViewInfo.bScrollBeyondZero @@ -6609,7 +6617,7 @@ void AudacityProject::DoZoomFitV() } } -void AudacityProject::OnZoomFitV() +void AudacityProject::OnZoomFitV(const CommandContext &) { this->DoZoomFitV(); @@ -6618,7 +6626,7 @@ void AudacityProject::OnZoomFitV() ModifyState(true); } -void AudacityProject::OnZoomSel() +void AudacityProject::OnZoomSel(const CommandContext &) { const double lowerBound = std::max(mViewInfo.selectedRegion.t0(), ScrollingLowerBoundTime()); @@ -6643,7 +6651,7 @@ void AudacityProject::OnZoomSel() TP_ScrollWindow(mViewInfo.selectedRegion.t0()); } -void AudacityProject::OnGoSelStart() +void AudacityProject::OnGoSelStart(const CommandContext &) { if (mViewInfo.selectedRegion.isPoint()) return; @@ -6651,7 +6659,7 @@ void AudacityProject::OnGoSelStart() TP_ScrollWindow(mViewInfo.selectedRegion.t0() - ((GetScreenEndTime() - mViewInfo.h) / 2)); } -void AudacityProject::OnGoSelEnd() +void AudacityProject::OnGoSelEnd(const CommandContext &) { if (mViewInfo.selectedRegion.isPoint()) return; @@ -6659,7 +6667,7 @@ void AudacityProject::OnGoSelEnd() TP_ScrollWindow(mViewInfo.selectedRegion.t1() - ((GetScreenEndTime() - mViewInfo.h) / 2)); } -void AudacityProject::OnShowClipping() +void AudacityProject::OnShowClipping(const CommandContext &) { bool checked = !gPrefs->Read(wxT("/GUI/ShowClipping"), 0L); gPrefs->Write(wxT("/GUI/ShowClipping"), checked); @@ -6669,7 +6677,7 @@ void AudacityProject::OnShowClipping() mTrackPanel->Refresh(false); } -void AudacityProject::OnShowExtraMenus() +void AudacityProject::OnShowExtraMenus(const CommandContext &) { bool checked = !gPrefs->Read(wxT("/GUI/ShowExtraMenus"), 0L); gPrefs->Write(wxT("/GUI/ShowExtraMenus"), checked); @@ -6678,7 +6686,7 @@ void AudacityProject::OnShowExtraMenus() RebuildAllMenuBars(); } -void AudacityProject::OnHistory() +void AudacityProject::OnHistory(const CommandContext &) { if (!mHistoryWindow) mHistoryWindow = safenew HistoryWindow(this, GetUndoManager()); @@ -6687,7 +6695,7 @@ void AudacityProject::OnHistory() mHistoryWindow->UpdateDisplay(); } -void AudacityProject::OnKaraoke() +void AudacityProject::OnKaraoke(const CommandContext &) { if (!mLyricsWindow) mLyricsWindow = safenew LyricsWindow(this); @@ -6696,7 +6704,7 @@ void AudacityProject::OnKaraoke() mLyricsWindow->Raise(); } -void AudacityProject::OnMixerBoard() +void AudacityProject::OnMixerBoard(const CommandContext &) { if (!mMixerBoardFrame) { @@ -6708,7 +6716,7 @@ void AudacityProject::OnMixerBoard() mMixerBoardFrame->SetFocus(); } -void AudacityProject::OnPlotSpectrum() +void AudacityProject::OnPlotSpectrum(const CommandContext &) { if (!mFreqWindow) { wxPoint where; @@ -6727,7 +6735,7 @@ void AudacityProject::OnPlotSpectrum() mFreqWindow->SetFocus(); } -void AudacityProject::OnContrast() +void AudacityProject::OnContrast(const CommandContext &) { // All of this goes away when the Contrast Dialog is converted to a module if(!mContrastDialog) @@ -6747,25 +6755,25 @@ void AudacityProject::OnContrast() } -void AudacityProject::OnShowTransportToolBar() +void AudacityProject::OnShowTransportToolBar(const CommandContext &) { mToolManager->ShowHide(TransportBarID); ModifyToolbarMenus(); } -void AudacityProject::OnShowDeviceToolBar() +void AudacityProject::OnShowDeviceToolBar(const CommandContext &) { mToolManager->ShowHide( DeviceBarID ); ModifyToolbarMenus(); } -void AudacityProject::OnShowEditToolBar() +void AudacityProject::OnShowEditToolBar(const CommandContext &) { mToolManager->ShowHide( EditBarID ); ModifyToolbarMenus(); } -void AudacityProject::OnShowMeterToolBar() +void AudacityProject::OnShowMeterToolBar(const CommandContext &) { if( !mToolManager->IsVisible( MeterBarID ) ) { @@ -6776,7 +6784,7 @@ void AudacityProject::OnShowMeterToolBar() ModifyToolbarMenus(); } -void AudacityProject::OnShowRecordMeterToolBar() +void AudacityProject::OnShowRecordMeterToolBar(const CommandContext &) { if( !mToolManager->IsVisible( RecordMeterBarID ) ) { @@ -6786,7 +6794,7 @@ void AudacityProject::OnShowRecordMeterToolBar() ModifyToolbarMenus(); } -void AudacityProject::OnShowPlayMeterToolBar() +void AudacityProject::OnShowPlayMeterToolBar(const CommandContext &) { if( !mToolManager->IsVisible( PlayMeterBarID ) ) { @@ -6796,45 +6804,45 @@ void AudacityProject::OnShowPlayMeterToolBar() ModifyToolbarMenus(); } -void AudacityProject::OnShowMixerToolBar() +void AudacityProject::OnShowMixerToolBar(const CommandContext &) { mToolManager->ShowHide( MixerBarID ); ModifyToolbarMenus(); } -void AudacityProject::OnShowScrubbingToolBar() +void AudacityProject::OnShowScrubbingToolBar(const CommandContext &) { mToolManager->ShowHide( ScrubbingBarID ); ModifyToolbarMenus(); } -void AudacityProject::OnShowSelectionToolBar() +void AudacityProject::OnShowSelectionToolBar(const CommandContext &) { mToolManager->ShowHide( SelectionBarID ); ModifyToolbarMenus(); } #ifdef EXPERIMENTAL_SPECTRAL_EDITING -void AudacityProject::OnShowSpectralSelectionToolBar() +void AudacityProject::OnShowSpectralSelectionToolBar(const CommandContext &) { mToolManager->ShowHide( SpectralSelectionBarID ); ModifyToolbarMenus(); } #endif -void AudacityProject::OnShowToolsToolBar() +void AudacityProject::OnShowToolsToolBar(const CommandContext &) { mToolManager->ShowHide( ToolsBarID ); ModifyToolbarMenus(); } -void AudacityProject::OnShowTranscriptionToolBar() +void AudacityProject::OnShowTranscriptionToolBar(const CommandContext &) { mToolManager->ShowHide( TranscriptionBarID ); ModifyToolbarMenus(); } -void AudacityProject::OnResetToolBars() +void AudacityProject::OnResetToolBars(const CommandContext &) { mToolManager->Reset(); ModifyToolbarMenus(); @@ -6844,7 +6852,7 @@ void AudacityProject::OnResetToolBars() // Project Menu // -void AudacityProject::OnImport() +void AudacityProject::OnImport(const CommandContext &) { // An import trigger for the alias missing dialog might not be intuitive, but // this serves to track the file if the users zooms in and such. @@ -6886,7 +6894,7 @@ void AudacityProject::OnImport() ZoomAfterImport(nullptr); } -void AudacityProject::OnImportLabels() +void AudacityProject::OnImportLabels(const CommandContext &) { wxString fileName = FileNames::SelectFile(FileNames::Operation::Open, @@ -6928,7 +6936,7 @@ void AudacityProject::OnImportLabels() } #ifdef USE_MIDI -void AudacityProject::OnImportMIDI() +void AudacityProject::OnImportMIDI(const CommandContext &) { wxString fileName = FileNames::SelectFile(FileNames::Operation::Open, _("Select a MIDI file"), @@ -6974,7 +6982,7 @@ AudacityProject *AudacityProject::DoImportMIDI( } #endif // USE_MIDI -void AudacityProject::OnImportRaw() +void AudacityProject::OnImportRaw(const CommandContext &) { wxString fileName = FileNames::SelectFile(FileNames::Operation::Open, @@ -7000,7 +7008,7 @@ void AudacityProject::OnImportRaw() HandleResize(); // Adjust scrollers for NEW track sizes. } -void AudacityProject::OnEditMetadata() +void AudacityProject::OnEditMetadata(const CommandContext &) { (void)DoEditMetadata(_("Edit Metadata Tags"), _("Metadata Tags"), true); } @@ -7099,28 +7107,28 @@ void AudacityProject::HandleMixAndRender(bool toNewTrack) } } -void AudacityProject::OnMixAndRender() +void AudacityProject::OnMixAndRender(const CommandContext &) { HandleMixAndRender(false); } -void AudacityProject::OnMixAndRenderToNewTrack() +void AudacityProject::OnMixAndRenderToNewTrack(const CommandContext &) { HandleMixAndRender(true); } -void AudacityProject::OnSelectionSave() +void AudacityProject::OnSelectionSave(const CommandContext &) { mRegionSave = mViewInfo.selectedRegion; } -void AudacityProject::OnCursorPositionStore() +void AudacityProject::OnCursorPositionStore(const CommandContext &) { mCursorPositionStored = IsAudioActive() ? gAudioIO->GetStreamTime() : mViewInfo.selectedRegion.t0(); mCursorPositionHasBeenStored = true; } -void AudacityProject::OnSelectionRestore() +void AudacityProject::OnSelectionRestore(const CommandContext &) { if ((mRegionSave.t0() == 0.0) && (mRegionSave.t1() == 0.0)) @@ -7133,7 +7141,7 @@ void AudacityProject::OnSelectionRestore() mTrackPanel->Refresh(false); } -void AudacityProject::OnCursorTrackStart() +void AudacityProject::OnCursorTrackStart(const CommandContext &) { double kWayOverToRight = 1000000.0; double minOffset = kWayOverToRight; @@ -7160,7 +7168,7 @@ void AudacityProject::OnCursorTrackStart() mTrackPanel->Refresh(false); } -void AudacityProject::OnCursorTrackEnd() +void AudacityProject::OnCursorTrackEnd(const CommandContext &) { double kWayOverToLeft = -1000000.0; double maxEndOffset = kWayOverToLeft; @@ -7188,7 +7196,7 @@ void AudacityProject::OnCursorTrackEnd() mTrackPanel->Refresh(false); } -void AudacityProject::OnCursorSelStart() +void AudacityProject::OnCursorSelStart(const CommandContext &) { mViewInfo.selectedRegion.collapseToT0(); ModifyState(false); @@ -7196,7 +7204,7 @@ void AudacityProject::OnCursorSelStart() mTrackPanel->Refresh(false); } -void AudacityProject::OnCursorSelEnd() +void AudacityProject::OnCursorSelEnd(const CommandContext &) { mViewInfo.selectedRegion.collapseToT1(); ModifyState(false); @@ -7400,12 +7408,12 @@ int AudacityProject::FindClipBoundaries(double time, bool next, std::vectorRead(wxT("/GUI/MoveSelectionWithTracks"), &bMoveWith, false); - HandleAlign(index, bMoveWith); + HandleAlign(context.index, bMoveWith); } /* // Now handled in OnAlign. @@ -8003,7 +8011,7 @@ void AudacityProject::OnScoreAlign() #endif /* EXPERIMENTAL_SCOREALIGN */ -void AudacityProject::OnNewWaveTrack() +void AudacityProject::OnNewWaveTrack(const CommandContext &) { auto t = mTracks->Add(mTrackFactory->NewWaveTrack(mDefaultFormat, mRate)); SelectNone(); @@ -8016,7 +8024,7 @@ void AudacityProject::OnNewWaveTrack() mTrackPanel->EnsureVisible(t); } -void AudacityProject::OnNewStereoTrack() +void AudacityProject::OnNewStereoTrack(const CommandContext &) { auto t = mTracks->Add(mTrackFactory->NewWaveTrack(mDefaultFormat, mRate)); t->SetChannel(Track::LeftChannel); @@ -8036,7 +8044,7 @@ void AudacityProject::OnNewStereoTrack() mTrackPanel->EnsureVisible(t); } -void AudacityProject::OnNewLabelTrack() +void AudacityProject::OnNewLabelTrack(const CommandContext &) { auto t = mTracks->Add(GetTrackFactory()->NewLabelTrack()); @@ -8050,7 +8058,7 @@ void AudacityProject::OnNewLabelTrack() mTrackPanel->EnsureVisible(t); } -void AudacityProject::OnNewTimeTrack() +void AudacityProject::OnNewTimeTrack(const CommandContext &) { if (mTracks->GetTimeTrack()) { AudacityMessageBox(_("This version of Audacity only allows one time track for each project window.")); @@ -8069,7 +8077,7 @@ void AudacityProject::OnNewTimeTrack() mTrackPanel->EnsureVisible(t); } -void AudacityProject::OnTimerRecord() +void AudacityProject::OnTimerRecord(const CommandContext &) { // MY: Due to improvements in how Timer Recording saves and/or exports // it is now safer to disable Timer Recording when there is more than @@ -8143,13 +8151,13 @@ void AudacityProject::OnTimerRecord() } } -void AudacityProject::OnSoundActivated() +void AudacityProject::OnSoundActivated(const CommandContext &) { SoundActivatedRecord dialog(this /* parent */ ); dialog.ShowModal(); } -void AudacityProject::OnRescanDevices() +void AudacityProject::OnRescanDevices(const CommandContext &) { DeviceManager::Instance()->Rescan(); } @@ -8222,7 +8230,7 @@ int AudacityProject::DoAddLabel(const SelectedRegion ®ion, bool preserveFocus return index; } -void AudacityProject::OnMoveSelectionWithTracks() +void AudacityProject::OnMoveSelectionWithTracks(const CommandContext &) { bool bMoveWith; gPrefs->Read(wxT("/GUI/MoveSelectionWithTracks"), &bMoveWith, false); @@ -8231,7 +8239,7 @@ void AudacityProject::OnMoveSelectionWithTracks() } -void AudacityProject::OnSyncLock() +void AudacityProject::OnSyncLock(const CommandContext &) { bool bSyncLockTracks; gPrefs->Read(wxT("/GUI/SyncLockTracks"), &bSyncLockTracks, false); @@ -8246,12 +8254,12 @@ void AudacityProject::OnSyncLock() -void AudacityProject::OnAddLabel() +void AudacityProject::OnAddLabel(const CommandContext &) { DoAddLabel(mViewInfo.selectedRegion); } -void AudacityProject::OnAddLabelPlaying() +void AudacityProject::OnAddLabelPlaying(const CommandContext &) { if (GetAudioIOToken()>0 && gAudioIO->IsStreamActive(GetAudioIOToken())) { @@ -8276,12 +8284,12 @@ void AudacityProject::DoEditLabels(LabelTrack *lt, int index) } } -void AudacityProject::OnEditLabels() +void AudacityProject::OnEditLabels(const CommandContext &) { DoEditLabels(); } -void AudacityProject::OnToggleTypeToCreateLabel() +void AudacityProject::OnToggleTypeToCreateLabel(const CommandContext &) { bool typeToCreateLabel; gPrefs->Read(wxT("/GUI/TypeToCreateLabel"), &typeToCreateLabel, true); @@ -8290,20 +8298,20 @@ void AudacityProject::OnToggleTypeToCreateLabel() ModifyAllProjectToolbarMenus(); } -void AudacityProject::OnApplyChain() +void AudacityProject::OnApplyChain(const CommandContext &) { BatchProcessDialog dlg(this); dlg.ShowModal(); ModifyUndoMenuItems(); } -void AudacityProject::OnEditChains() +void AudacityProject::OnEditChains(const CommandContext &) { EditChainsDialog dlg(this); dlg.ShowModal(); } -void AudacityProject::OnRemoveTracks() +void AudacityProject::OnRemoveTracks(const CommandContext &) { TrackListIterator iter(GetTracks()); Track *t = iter.First(); @@ -8354,7 +8362,7 @@ void AudacityProject::OnRemoveTracks() // Help Menu // -void AudacityProject::OnAbout() +void AudacityProject::OnAbout(const CommandContext &) { #ifdef __WXMAC__ // Modeless dialog, consistent with other Mac applications @@ -8367,26 +8375,26 @@ void AudacityProject::OnAbout() #endif } -void AudacityProject::OnHelpWelcome() +void AudacityProject::OnHelpWelcome(const CommandContext &) { SplashDialog::Show2( this ); } -void AudacityProject::OnQuickHelp() +void AudacityProject::OnQuickHelp(const CommandContext &) { HelpSystem::ShowHelp( this, wxT("Quick_Help")); } -void AudacityProject::OnManual() +void AudacityProject::OnManual(const CommandContext &) { HelpSystem::ShowHelp( this, wxT("Main_Page")); } -void AudacityProject::OnCheckForUpdates() +void AudacityProject::OnCheckForUpdates(const CommandContext &) { ::OpenInDefaultBrowser( VerCheckUrl()); } @@ -8395,11 +8403,11 @@ void AudacityProject::OnCheckForUpdates() void AudacityProject::MayCheckForUpdates() { #ifdef IS_ALPHA - OnCheckForUpdates(); + OnCheckForUpdates(*this); #endif } -void AudacityProject::OnShowLog() +void AudacityProject::OnShowLog(const CommandContext &) { AudacityLogger *logger = wxGetApp().GetLogger(); if (logger) { @@ -8407,13 +8415,13 @@ void AudacityProject::OnShowLog() } } -void AudacityProject::OnBenchmark() +void AudacityProject::OnBenchmark(const CommandContext &) { ::RunBenchmark(this); } #if defined(EXPERIMENTAL_CRASH_REPORT) -void AudacityProject::OnCrashReport() +void AudacityProject::OnCrashReport(const CommandContext &) { // Change to "1" to test a real crash #if 0 @@ -8424,12 +8432,12 @@ void AudacityProject::OnCrashReport() } #endif -void AudacityProject::OnScreenshot() +void AudacityProject::OnScreenshot(const CommandContext &) { ::OpenScreenshotTools(); } -void AudacityProject::OnAudioDeviceInfo() +void AudacityProject::OnAudioDeviceInfo(const CommandContext &) { wxString info = gAudioIO->GetDeviceInfo(); @@ -8470,7 +8478,7 @@ void AudacityProject::OnAudioDeviceInfo() } #ifdef EXPERIMENTAL_MIDI_OUT -void AudacityProject::OnMidiDeviceInfo() +void AudacityProject::OnMidiDeviceInfo(const CommandContext &) { wxString info = gAudioIO->GetMidiDeviceInfo(); @@ -8511,12 +8519,12 @@ void AudacityProject::OnMidiDeviceInfo() } #endif -void AudacityProject::OnSeparator() +void AudacityProject::OnSeparator(const CommandContext &) { } -void AudacityProject::OnCollapseAllTracks() +void AudacityProject::OnCollapseAllTracks(const CommandContext &) { TrackListIterator iter(GetTracks()); Track *t = iter.First(); @@ -8531,7 +8539,7 @@ void AudacityProject::OnCollapseAllTracks() RedrawProject(); } -void AudacityProject::OnExpandAllTracks() +void AudacityProject::OnExpandAllTracks(const CommandContext &) { TrackListIterator iter(GetTracks()); Track *t = iter.First(); @@ -8577,12 +8585,12 @@ void AudacityProject::OnPanTracks(float PanValue) mMixerBoard->UpdatePan(); } -void AudacityProject::OnPanLeft(){ OnPanTracks( -1.0);} -void AudacityProject::OnPanRight(){ OnPanTracks( 1.0);} -void AudacityProject::OnPanCenter(){ OnPanTracks( 0.0);} +void AudacityProject::OnPanLeft(const CommandContext &){ OnPanTracks( -1.0);} +void AudacityProject::OnPanRight(const CommandContext &){ OnPanTracks( 1.0);} +void AudacityProject::OnPanCenter(const CommandContext &){ OnPanTracks( 0.0);} -void AudacityProject::OnMuteAllTracks() +void AudacityProject::OnMuteAllTracks(const CommandContext &) { TrackListIterator iter(GetTracks()); Track *t = iter.First(); @@ -8607,7 +8615,7 @@ void AudacityProject::OnMuteAllTracks() } } -void AudacityProject::OnUnMuteAllTracks() +void AudacityProject::OnUnMuteAllTracks(const CommandContext &) { TrackListIterator iter(GetTracks()); Track *t = iter.First(); @@ -8632,7 +8640,7 @@ void AudacityProject::OnUnMuteAllTracks() } } -void AudacityProject::OnLockPlayRegion() +void AudacityProject::OnLockPlayRegion(const CommandContext &) { double start, end; GetPlayRegion(&start, &end); @@ -8646,13 +8654,13 @@ void AudacityProject::OnLockPlayRegion() } } -void AudacityProject::OnUnlockPlayRegion() +void AudacityProject::OnUnlockPlayRegion(const CommandContext &) { mLockPlayRegion = false; mRuler->Refresh(false); } -void AudacityProject::OnResample() +void AudacityProject::OnResample(const CommandContext &) { TrackListIterator iter(GetTracks()); @@ -8755,22 +8763,22 @@ void AudacityProject::OnResample() FinishAutoScroll(); } -void AudacityProject::OnSnapToOff() +void AudacityProject::OnSnapToOff(const CommandContext &) { SetSnapTo(SNAP_OFF); } -void AudacityProject::OnSnapToNearest() +void AudacityProject::OnSnapToNearest(const CommandContext &) { SetSnapTo(SNAP_NEAREST); } -void AudacityProject::OnSnapToPrior() +void AudacityProject::OnSnapToPrior(const CommandContext &) { SetSnapTo(SNAP_PRIOR); } -void AudacityProject::OnFullScreen() +void AudacityProject::OnFullScreen(const CommandContext &) { bool bChecked = !wxTopLevelWindow::IsFullScreen(); wxTopLevelWindow::ShowFullScreen(bChecked); diff --git a/src/Menus.h b/src/Menus.h index 1f3c84cec..7be7bd8fa 100644 --- a/src/Menus.h +++ b/src/Menus.h @@ -53,115 +53,115 @@ double NearestZeroCrossing(double t0); // Selecting a tool from the keyboard void SetTool(int tool); -void OnSelectTool(); -void OnZoomTool(); -void OnEnvelopeTool(); -void OnTimeShiftTool(); -void OnDrawTool(); -void OnMultiTool(); +void OnSelectTool(const CommandContext &); +void OnZoomTool(const CommandContext &); +void OnEnvelopeTool(const CommandContext &); +void OnTimeShiftTool(const CommandContext &); +void OnDrawTool(const CommandContext &); +void OnMultiTool(const CommandContext &); -void OnNextTool(); -void OnPrevTool(); +void OnNextTool(const CommandContext &); +void OnPrevTool(const CommandContext &); public: // Audio I/O Commands -void OnStop(); -void OnPause(); -void OnRecord(); -void OnRecord2ndChoice(); -void OnStopSelect(); -void OnSkipStart(); -void OnSkipEnd(); -void OnSeekLeftShort(); -void OnSeekRightShort(); -void OnSeekLeftLong(); -void OnSeekRightLong(); +void OnStop(const CommandContext &); +void OnPause(const CommandContext &); +void OnRecord(const CommandContext &); +void OnRecord2ndChoice(const CommandContext &); +void OnStopSelect(const CommandContext &); +void OnSkipStart(const CommandContext &); +void OnSkipEnd(const CommandContext &); +void OnSeekLeftShort(const CommandContext &); +void OnSeekRightShort(const CommandContext &); +void OnSeekLeftLong(const CommandContext &); +void OnSeekRightLong(const CommandContext &); // Different posibilities for playing sound bool MakeReadyToPlay(bool loop = false, bool cutpreview = false); // Helper function that sets button states etc. -void OnPlayStop(); +void OnPlayStop(const CommandContext &); bool DoPlayStopSelect(bool click, bool shift); -void OnPlayStopSelect(); -void OnPlayOneSecond(); -void OnPlayToSelection(); -void OnPlayBeforeSelectionStart(); -void OnPlayAfterSelectionStart(); -void OnPlayBeforeSelectionEnd(); -void OnPlayAfterSelectionEnd(); -void OnPlayBeforeAndAfterSelectionStart(); -void OnPlayBeforeAndAfterSelectionEnd(); -void OnPlayLooped(); -void OnPlayCutPreview(); +void OnPlayStopSelect(const CommandContext &); +void OnPlayOneSecond(const CommandContext &); +void OnPlayToSelection(const CommandContext &); +void OnPlayBeforeSelectionStart(const CommandContext &); +void OnPlayAfterSelectionStart(const CommandContext &); +void OnPlayBeforeSelectionEnd(const CommandContext &); +void OnPlayAfterSelectionEnd(const CommandContext &); +void OnPlayBeforeAndAfterSelectionStart(const CommandContext &); +void OnPlayBeforeAndAfterSelectionEnd(const CommandContext &); +void OnPlayLooped(const CommandContext &); +void OnPlayCutPreview(const CommandContext &); // Wave track control -void OnTrackPan(); -void OnTrackPanLeft(); -void OnTrackPanRight(); -void OnTrackGain(); -void OnTrackGainInc(); -void OnTrackGainDec(); -void OnTrackMenu(); -void OnTrackMute(); -void OnTrackSolo(); -void OnTrackClose(); -void OnTrackMoveUp(); -void OnTrackMoveDown(); -void OnTrackMoveTop(); -void OnTrackMoveBottom(); +void OnTrackPan(const CommandContext &); +void OnTrackPanLeft(const CommandContext &); +void OnTrackPanRight(const CommandContext &); +void OnTrackGain(const CommandContext &); +void OnTrackGainInc(const CommandContext &); +void OnTrackGainDec(const CommandContext &); +void OnTrackMenu(const CommandContext &); +void OnTrackMute(const CommandContext &); +void OnTrackSolo(const CommandContext &); +void OnTrackClose(const CommandContext &); +void OnTrackMoveUp(const CommandContext &); +void OnTrackMoveDown(const CommandContext &); +void OnTrackMoveTop(const CommandContext &); +void OnTrackMoveBottom(const CommandContext &); enum MoveChoice { OnMoveUpID, OnMoveDownID, OnMoveTopID, OnMoveBottomID }; void MoveTrack(Track* target, MoveChoice choice); // Device control -void OnInputDevice(); -void OnOutputDevice(); -void OnAudioHost(); -void OnInputChannels(); +void OnInputDevice(const CommandContext &); +void OnOutputDevice(const CommandContext &); +void OnAudioHost(const CommandContext &); +void OnInputChannels(const CommandContext &); // Mixer control -void OnOutputGain(); -void OnInputGain(); -void OnOutputGainInc(); -void OnOutputGainDec(); -void OnInputGainInc(); -void OnInputGainDec(); +void OnOutputGain(const CommandContext &); +void OnInputGain(const CommandContext &); +void OnOutputGainInc(const CommandContext &); +void OnOutputGainDec(const CommandContext &); +void OnInputGainInc(const CommandContext &); +void OnInputGainDec(const CommandContext &); // Transcription control -void OnPlayAtSpeed(); -void OnPlayAtSpeedLooped(); -void OnPlayAtSpeedCutPreview(); -void OnSetPlaySpeed(); -void OnPlaySpeedInc(); -void OnPlaySpeedDec(); +void OnPlayAtSpeed(const CommandContext &); +void OnPlayAtSpeedLooped(const CommandContext &); +void OnPlayAtSpeedCutPreview(const CommandContext &); +void OnSetPlaySpeed(const CommandContext &); +void OnPlaySpeedInc(const CommandContext &); +void OnPlaySpeedDec(const CommandContext &); // Moving track focus commands void OnPrevTrack( bool shift ); void OnNextTrack( bool shift ); -void OnCursorUp(); -void OnCursorDown(); -void OnFirstTrack(); -void OnLastTrack(); +void OnCursorUp(const CommandContext &); +void OnCursorDown(const CommandContext &); +void OnFirstTrack(const CommandContext &); +void OnLastTrack(const CommandContext &); // Selection-Editing Commands -void OnShiftUp(); -void OnShiftDown(); -void OnToggle(); +void OnShiftUp(const CommandContext &); +void OnShiftDown(const CommandContext &); +void OnToggle(const CommandContext &); void HandleListSelection(Track *t, bool shift, bool ctrl, bool modifyState); -void OnCursorLeft(const wxEvent * evt); -void OnCursorRight(const wxEvent * evt); -void OnSelExtendLeft(const wxEvent * evt); -void OnSelExtendRight(const wxEvent * evt); -void OnSelContractLeft(const wxEvent * evt); -void OnSelContractRight(const wxEvent * evt); +void OnCursorLeft(const CommandContext &); +void OnCursorRight(const CommandContext &); +void OnSelExtendLeft(const CommandContext &); +void OnSelExtendRight(const CommandContext &); +void OnSelContractLeft(const CommandContext &); +void OnSelContractRight(const CommandContext &); public: static double OnClipMove @@ -169,127 +169,127 @@ static double OnClipMove TrackList &trackList, bool syncLocked, bool right); void DoClipLeftOrRight(bool right, bool keyUp ); -void OnClipLeft(const wxEvent* evt); -void OnClipRight(const wxEvent* evt); +void OnClipLeft(const CommandContext &); +void OnClipRight(const CommandContext &); -void OnCursorShortJumpLeft(); -void OnCursorShortJumpRight(); -void OnCursorLongJumpLeft(); -void OnCursorLongJumpRight(); -void OnSelSetExtendLeft(); -void OnSelSetExtendRight(); +void OnCursorShortJumpLeft(const CommandContext &); +void OnCursorShortJumpRight(const CommandContext &); +void OnCursorLongJumpLeft(const CommandContext &); +void OnCursorLongJumpRight(const CommandContext &); +void OnSelSetExtendLeft(const CommandContext &); +void OnSelSetExtendRight(const CommandContext &); -void OnSetLeftSelection(); -void OnSetRightSelection(); +void OnSetLeftSelection(const CommandContext &); +void OnSetRightSelection(const CommandContext &); -void OnSelToStart(); -void OnSelToEnd(); +void OnSelToStart(const CommandContext &); +void OnSelToEnd(const CommandContext &); -void OnMoveToNextLabel(); -void OnMoveToPrevLabel(); +void OnMoveToNextLabel(const CommandContext &); +void OnMoveToPrevLabel(const CommandContext &); void OnMoveToLabel(bool next); -void OnZeroCrossing(); +void OnZeroCrossing(const CommandContext &); -void OnLockPlayRegion(); -void OnUnlockPlayRegion(); +void OnLockPlayRegion(const CommandContext &); +void OnUnlockPlayRegion(const CommandContext &); double GetTime(const Track *t); -void OnSortTime(); -void OnSortName(); +void OnSortTime(const CommandContext &); +void OnSortName(const CommandContext &); -void OnSnapToOff(); -void OnSnapToNearest(); -void OnSnapToPrior(); -void OnFullScreen(); +void OnSnapToOff(const CommandContext &); +void OnSnapToNearest(const CommandContext &); +void OnSnapToPrior(const CommandContext &); +void OnFullScreen(const CommandContext &); static void DoMacMinimize(AudacityProject *project); -void OnMacMinimize(); -void OnMacMinimizeAll(); -void OnMacZoom(); -void OnMacBringAllToFront(); +void OnMacMinimize(const CommandContext &); +void OnMacMinimizeAll(const CommandContext &); +void OnMacZoom(const CommandContext &); +void OnMacBringAllToFront(const CommandContext &); // File Menu -void OnNew(); -void OnOpen(); -void OnClose(); -void OnSave(); -void OnSaveAs(); +void OnNew(const CommandContext &); +void OnOpen(const CommandContext &); +void OnClose(const CommandContext &); +void OnSave(const CommandContext &); +void OnSaveAs(const CommandContext &); #ifdef USE_LIBVORBIS - void OnSaveCompressed(); + void OnSaveCompressed(const CommandContext &); #endif -void OnCheckDependencies(); +void OnCheckDependencies(const CommandContext &); void OnExport(const wxString & Format); -void OnExportAudio(); -void OnExportMp3(); -void OnExportWav(); -void OnExportOgg(); -void OnExportSelection(); -void OnExportMultiple(); -void OnExportLabels(); -void OnExportMIDI(); +void OnExportAudio(const CommandContext &); +void OnExportMp3(const CommandContext &); +void OnExportWav(const CommandContext &); +void OnExportOgg(const CommandContext &); +void OnExportSelection(const CommandContext &); +void OnExportMultiple(const CommandContext &); +void OnExportLabels(const CommandContext &); +void OnExportMIDI(const CommandContext &); -void OnPreferences(); +void OnPreferences(const CommandContext &); -void OnPageSetup(); -void OnPrint(); +void OnPageSetup(const CommandContext &); +void OnPrint(const CommandContext &); -void OnExit(); +void OnExit(const CommandContext &); // Edit Menu public: -void OnUndo(); -void OnRedo(); +void OnUndo(const CommandContext &); +void OnRedo(const CommandContext &); private: static void FinishCopy(const Track *n, Track *dest); static void FinishCopy(const Track *n, Track::Holder &&dest, TrackList &list); public: -void OnCut(); -void OnSplitCut(); -void OnCopy(); +void OnCut(const CommandContext &); +void OnSplitCut(const CommandContext &); +void OnCopy(const CommandContext &); -void OnPaste(); +void OnPaste(const CommandContext &); private: bool HandlePasteText(); // Handle text paste (into active label), if any. Return true if pasted. bool HandlePasteNothingSelected(); // Return true if nothing selected, regardless of paste result. public: -void OnPasteNewLabel(); -void OnPasteOver(); -void OnTrim(); +void OnPasteNewLabel(const CommandContext &); +void OnPasteOver(const CommandContext &); +void OnTrim(const CommandContext &); -void OnDelete(); -void OnSplitDelete(); -void OnSilence(); +void OnDelete(const CommandContext &); +void OnSplitDelete(const CommandContext &); +void OnSilence(const CommandContext &); -void OnSplit(); -void OnSplitNew(); -void OnJoin(); -void OnDisjoin(); -void OnDuplicate(); +void OnSplit(const CommandContext &); +void OnSplitNew(const CommandContext &); +void OnJoin(const CommandContext &); +void OnDisjoin(const CommandContext &); +void OnDuplicate(const CommandContext &); -void OnCutLabels(); -void OnSplitCutLabels(); -void OnCopyLabels(); -void OnDeleteLabels(); -void OnSplitDeleteLabels(); -void OnSilenceLabels(); -void OnSplitLabels(); -void OnJoinLabels(); -void OnDisjoinLabels(); +void OnCutLabels(const CommandContext &); +void OnSplitCutLabels(const CommandContext &); +void OnCopyLabels(const CommandContext &); +void OnDeleteLabels(const CommandContext &); +void OnSplitDeleteLabels(const CommandContext &); +void OnSilenceLabels(const CommandContext &); +void OnSplitLabels(const CommandContext &); +void OnJoinLabels(const CommandContext &); +void OnDisjoinLabels(const CommandContext &); void OnSelectTimeAndTracks(bool bAllTime, bool bAllTracks); -void OnSelectAllTime(); -void OnSelectAllTracks(); -void OnSelectAll(); -void OnSelectSomething(); -void OnSelectNone(); +void OnSelectAllTime(const CommandContext &); +void OnSelectAllTracks(const CommandContext &); +void OnSelectAll(const CommandContext &); +void OnSelectSomething(const CommandContext &); +void OnSelectNone(const CommandContext &); private: int CountSelectedWaveTracks(); int CountSelectedTracks(); @@ -298,15 +298,15 @@ public: // For toggling of spectral seletion double mLastF0; double mLastF1; -void OnToggleSpectralSelection(); +void OnToggleSpectralSelection(const CommandContext &); void DoNextPeakFrequency(bool up); -void OnNextHigherPeakFrequency(); -void OnNextLowerPeakFrequency(); +void OnNextHigherPeakFrequency(const CommandContext &); +void OnNextLowerPeakFrequency(const CommandContext &); #endif -void OnSelectCursorEnd(); -void OnSelectStartCursor(); -void OnSelectPrevClipBoundaryToCursor(); -void OnSelectCursorToNextClipBoundary(); +void OnSelectCursorEnd(const CommandContext &); +void OnSelectStartCursor(const CommandContext &); +void OnSelectPrevClipBoundaryToCursor(const CommandContext &); +void OnSelectCursorToNextClipBoundary(const CommandContext &); void OnSelectClipBoundary(bool next); struct FoundTrack { const WaveTrack* waveTrack; @@ -325,92 +325,92 @@ FoundClip FindNextClip(const WaveTrack* wt, double t0, double t1); FoundClip FindPrevClip(const WaveTrack* wt, double t0, double t1); int FindClips(double t0, double t1, bool next, std::vector& results); bool ChannelsHaveSameClipBoundaries(const WaveTrack* wt); -void OnSelectPrevClip(); -void OnSelectNextClip(); +void OnSelectPrevClip(const CommandContext &); +void OnSelectNextClip(const CommandContext &); void OnSelectClip(bool next); -void OnSelectCursorStoredCursor(); -void OnSelectSyncLockSel(); +void OnSelectCursorStoredCursor(const CommandContext &); +void OnSelectSyncLockSel(const CommandContext &); // View Menu -void OnZoomIn(); -void OnZoomOut(); -// void OnZoomToggle(); -void OnZoomNormal(); -void OnZoomFit(); -void OnZoomFitV(); +void OnZoomIn(const CommandContext &); +void OnZoomOut(const CommandContext &); +// void OnZoomToggle(const CommandContext &); +void OnZoomNormal(const CommandContext &); +void OnZoomFit(const CommandContext &); +void OnZoomFitV(const CommandContext &); void DoZoomFitV(); -void OnZoomSel(); -void OnGoSelStart(); -void OnGoSelEnd(); +void OnZoomSel(const CommandContext &); +void OnGoSelStart(const CommandContext &); +void OnGoSelEnd(const CommandContext &); -void OnExpandAllTracks(); -void OnCollapseAllTracks(); +void OnExpandAllTracks(const CommandContext &); +void OnCollapseAllTracks(const CommandContext &); void OnPanTracks(float PanValue); -void OnPanLeft(); -void OnPanRight(); -void OnPanCenter(); +void OnPanLeft(const CommandContext &); +void OnPanRight(const CommandContext &); +void OnPanCenter(const CommandContext &); -void OnMuteAllTracks(); -void OnUnMuteAllTracks(); +void OnMuteAllTracks(const CommandContext &); +void OnUnMuteAllTracks(const CommandContext &); -void OnShowClipping(); -void OnShowExtraMenus(); +void OnShowClipping(const CommandContext &); +void OnShowExtraMenus(const CommandContext &); -void OnHistory(); +void OnHistory(const CommandContext &); -void OnKaraoke(); -void OnMixerBoard(); +void OnKaraoke(const CommandContext &); +void OnMixerBoard(const CommandContext &); -void OnPlotSpectrum(); -void OnContrast(); +void OnPlotSpectrum(const CommandContext &); +void OnContrast(const CommandContext &); -void OnShowTransportToolBar(); -void OnShowDeviceToolBar(); -void OnShowEditToolBar(); -void OnShowMeterToolBar(); -void OnShowRecordMeterToolBar(); -void OnShowPlayMeterToolBar(); -void OnShowMixerToolBar(); -void OnShowSelectionToolBar(); +void OnShowTransportToolBar(const CommandContext &); +void OnShowDeviceToolBar(const CommandContext &); +void OnShowEditToolBar(const CommandContext &); +void OnShowMeterToolBar(const CommandContext &); +void OnShowRecordMeterToolBar(const CommandContext &); +void OnShowPlayMeterToolBar(const CommandContext &); +void OnShowMixerToolBar(const CommandContext &); +void OnShowSelectionToolBar(const CommandContext &); #ifdef EXPERIMENTAL_SPECTRAL_EDITING -void OnShowSpectralSelectionToolBar(); +void OnShowSpectralSelectionToolBar(const CommandContext &); #endif -void OnShowScrubbingToolBar(); -void OnShowToolsToolBar(); -void OnShowTranscriptionToolBar(); -void OnResetToolBars(); +void OnShowScrubbingToolBar(const CommandContext &); +void OnShowToolsToolBar(const CommandContext &); +void OnShowTranscriptionToolBar(const CommandContext &); +void OnResetToolBars(const CommandContext &); // Transport Menu -void OnSoundActivated(); -void OnToggleSoundActivated(); -void OnTogglePinnedHead(); -void OnTogglePlayRecording(); -void OnToggleSWPlaythrough(); +void OnSoundActivated(const CommandContext &); +void OnToggleSoundActivated(const CommandContext &); +void OnTogglePinnedHead(const CommandContext &); +void OnTogglePlayRecording(const CommandContext &); +void OnToggleSWPlaythrough(const CommandContext &); #ifdef EXPERIMENTAL_AUTOMATED_INPUT_LEVEL_ADJUSTMENT - void OnToggleAutomatedInputLevelAdjustment(); + void OnToggleAutomatedInputLevelAdjustment(const CommandContext &); #endif -void OnRescanDevices(); +void OnRescanDevices(const CommandContext &); // Import Submenu -void OnImport(); -void OnImportLabels(); -void OnImportMIDI(); +void OnImport(const CommandContext &); +void OnImportLabels(const CommandContext &); +void OnImportMIDI(const CommandContext &); // return null on failure; if success, return the given project, or a NEW // one, if the given was null; create no NEW project if failure static AudacityProject *DoImportMIDI( AudacityProject *pProject, const wxString &fileName); -void OnImportRaw(); +void OnImportRaw(const CommandContext &); -void OnEditMetadata(); +void OnEditMetadata(const CommandContext &); bool DoEditMetadata(const wxString &title, const wxString &shortUndoDescription, bool force); -void OnMixAndRender(); -void OnMixAndRenderToNewTrack(); +void OnMixAndRender(const CommandContext &); +void OnMixAndRenderToNewTrack(const CommandContext &); void HandleMixAndRender(bool toNewTrack); private: @@ -418,15 +418,15 @@ private: bool mCursorPositionHasBeenStored{false}; double mCursorPositionStored; public: -void OnSelectionSave(); -void OnSelectionRestore(); -void OnCursorPositionStore(); +void OnSelectionSave(const CommandContext &); +void OnSelectionRestore(const CommandContext &); +void OnCursorPositionStore(const CommandContext &); -void OnCursorTrackStart(); -void OnCursorTrackEnd(); -void OnCursorSelStart(); -void OnCursorSelEnd(); -struct FoundClipBoundary : FoundTrack { +void OnCursorTrackStart(const CommandContext &); +void OnCursorTrackEnd(const CommandContext &); +void OnCursorSelStart(const CommandContext &); +void OnCursorSelEnd(const CommandContext &); + struct FoundClipBoundary : FoundTrack { int nFound; // 0, 1, or 2 double time; int index1; @@ -439,35 +439,35 @@ FoundClipBoundary FindPrevClipBoundary(const WaveTrack* wt, double time); double AdjustForFindingStartTimes(const std::vector& clips, double time); double AdjustForFindingEndTimes(const std::vector& clips, double time); int FindClipBoundaries(double time, bool next, std::vector& results); -void OnCursorNextClipBoundary(); -void OnCursorPrevClipBoundary(); +void OnCursorNextClipBoundary(const CommandContext &); +void OnCursorPrevClipBoundary(const CommandContext &); void OnCursorClipBoundary(bool next); static wxString ClipBoundaryMessage(const std::vector& results); -void OnAlignNoSync(int index); -void OnAlign(int index); +void OnAlignNoSync(const CommandContext &); +void OnAlign(const CommandContext &); //void OnAlignMoveSel(int index); void HandleAlign(int index, bool moveSel); size_t mAlignLabelsCount; #ifdef EXPERIMENTAL_SCOREALIGN -void OnScoreAlign(); +void OnScoreAlign(const CommandContext &); #endif // EXPERIMENTAL_SCOREALIGN // Tracks menu -void OnNewWaveTrack(); -void OnNewStereoTrack(); -void OnNewLabelTrack(); -void OnNewTimeTrack(); -void OnTimerRecord(); -void OnRemoveTracks(); -void OnMoveSelectionWithTracks(); -void OnSyncLock(); -void OnAddLabel(); -void OnAddLabelPlaying(); +void OnNewWaveTrack(const CommandContext &); +void OnNewStereoTrack(const CommandContext &); +void OnNewLabelTrack(const CommandContext &); +void OnNewTimeTrack(const CommandContext &); +void OnTimerRecord(const CommandContext &); +void OnRemoveTracks(const CommandContext &); +void OnMoveSelectionWithTracks(const CommandContext &); +void OnSyncLock(const CommandContext &); +void OnAddLabel(const CommandContext &); +void OnAddLabelPlaying(const CommandContext &); void DoEditLabels(LabelTrack *lt = nullptr, int index = -1); -void OnEditLabels(); -void OnToggleTypeToCreateLabel(); +void OnEditLabels(const CommandContext &); +void OnToggleTypeToCreateLabel(const CommandContext &); // Effect Menu @@ -485,52 +485,52 @@ public: }; bool DoEffect(const PluginID & ID, int flags); -void OnEffect(const PluginID & ID, int); -void OnRepeatLastEffect(int index); -void OnApplyChain(); -void OnEditChains(); -void OnStereoToMono(int index); +void OnEffect(const CommandContext &); +void OnRepeatLastEffect(const CommandContext &); +void OnApplyChain(const CommandContext &); +void OnEditChains(const CommandContext &); +void OnStereoToMono(const CommandContext &); void OnManagePluginsMenu(EffectType Type); static void RebuildAllMenuBars(); -void OnManageGenerators(); -void OnManageEffects(); -void OnManageAnalyzers(); +void OnManageGenerators(const CommandContext &); +void OnManageEffects(const CommandContext &); +void OnManageAnalyzers(const CommandContext &); // Help Menu -void OnAbout(); -void OnQuickHelp(); -void OnManual(); -void OnCheckForUpdates(); +void OnAbout(const CommandContext &); +void OnQuickHelp(const CommandContext &); +void OnManual(const CommandContext &); +void OnCheckForUpdates(const CommandContext &); void MayCheckForUpdates(); -void OnShowLog(); -void OnHelpWelcome(); -void OnBenchmark(); +void OnShowLog(const CommandContext &); +void OnHelpWelcome(const CommandContext &); +void OnBenchmark(const CommandContext &); #if defined(EXPERIMENTAL_CRASH_REPORT) -void OnCrashReport(); +void OnCrashReport(const CommandContext &); #endif -void OnScreenshot(); -void OnAudioDeviceInfo(); +void OnScreenshot(const CommandContext &); +void OnAudioDeviceInfo(const CommandContext &); #ifdef EXPERIMENTAL_MIDI_OUT -void OnMidiDeviceInfo(); +void OnMidiDeviceInfo(const CommandContext &); #endif // -void OnSeparator(); +void OnSeparator(const CommandContext &); // Keyboard navigation void NextOrPrevFrame(bool next); -void PrevFrame(); -void NextFrame(); +void PrevFrame(const CommandContext &); +void NextFrame(const CommandContext &); -void PrevWindow(); -void NextWindow(); +void PrevWindow(const CommandContext &); +void NextWindow(const CommandContext &); -void OnResample(); +void OnResample(const CommandContext &); private: void OnCursorLeft(bool shift, bool ctrl, bool keyup = false); diff --git a/src/MenusMac.cpp b/src/MenusMac.cpp index 3b74e0fe4..07d73b40e 100644 --- a/src/MenusMac.cpp +++ b/src/MenusMac.cpp @@ -45,19 +45,19 @@ void AudacityProject::DoMacMinimize(AudacityProject *project) } } -void AudacityProject::OnMacMinimize() +void AudacityProject::OnMacMinimize(const CommandContext &) { DoMacMinimize(this); } -void AudacityProject::OnMacMinimizeAll() +void AudacityProject::OnMacMinimizeAll(const CommandContext &) { for (const auto project : gAudacityProjects) { DoMacMinimize(project.get()); } } -void AudacityProject::OnMacZoom() +void AudacityProject::OnMacZoom(const CommandContext &) { auto window = this; auto topWindow = static_cast(window); @@ -77,7 +77,7 @@ void AudacityProject::OnMacZoom() } } -void AudacityProject::OnMacBringAllToFront() +void AudacityProject::OnMacBringAllToFront(const CommandContext &) { // Reall this de-miniaturizes all, which is not exactly the standard // behavior. diff --git a/src/Project.cpp b/src/Project.cpp index 17a3795c9..7a7fe65f4 100644 --- a/src/Project.cpp +++ b/src/Project.cpp @@ -2319,7 +2319,7 @@ bool AudacityProject::TryToMakeActionAllowed // This was 'OnSelectAll'. Changing it to OnSelectSomething means if // selecting all tracks is enough, we just do that. - OnSelectSomething(); + OnSelectSomething(*this); flags = GetUpdateFlags(); bAllowed = ((flags & mask) == (flagsRqd & mask)); return bAllowed; @@ -3235,7 +3235,7 @@ void AudacityProject::OpenFile(const wxString &fileNameArg, bool addtohistory) mTrackPanel->Refresh(true); */ closed = true; - this->OnClose(); + this->OnClose(*this); return; } else if (status & FSCKstatus_CHANGED) @@ -4217,7 +4217,7 @@ void AudacityProject::AddImportedTracks(const wxString &fileName, void AudacityProject::ZoomAfterImport(Track *pTrack) { - OnZoomFit(); + OnZoomFit(*this); mTrackPanel->SetFocus(); RedrawProject(); @@ -4289,7 +4289,7 @@ bool AudacityProject::Import(const wxString &fileName, WaveTrackArray* pTrackArr //TODO: All we want is a SelectAll() SelectNone(); SelectAllIfNone(); - OnEffect(EffectManager::Get().GetEffectByIdentifier(wxT("Normalize")), + DoEffect(EffectManager::Get().GetEffectByIdentifier(wxT("Normalize")), OnEffectFlags::kConfigured); } @@ -5373,7 +5373,7 @@ void AudacityProject::OnAudioIOStopRecording() // Reset timer record if (IsTimerRecordCancelled()) { - OnUndo(); + OnUndo(*this); ResetTimerRecordFlag(); } diff --git a/src/TimerRecordDialog.cpp b/src/TimerRecordDialog.cpp index 7fa4a8a9e..ed9e661c7 100644 --- a/src/TimerRecordDialog.cpp +++ b/src/TimerRecordDialog.cpp @@ -517,7 +517,7 @@ int TimerRecordDialog::RunWaitDialog() return POST_TIMER_RECORD_CANCEL_WAIT; } else { // Record for specified time. - pProject->OnRecord(); + pProject->OnRecord(*pProject); bool bIsRecording = true; wxString sPostAction = m_pTimerAfterCompleteChoiceCtrl->GetString(m_pTimerAfterCompleteChoiceCtrl->GetSelection()); @@ -563,7 +563,7 @@ int TimerRecordDialog::RunWaitDialog() // Must do this AFTER the timer project dialog has been deleted to ensure the application // responds to the AUDIOIO events...see not about bug #334 in the ProgressDialog constructor. - pProject->OnStop(); + pProject->OnStop(*pProject); // Let the caller handle cancellation or failure from recording progress. if (updateResult == ProgressResult::Cancelled || updateResult == ProgressResult::Failed) diff --git a/src/commands/CommandFunctors.h b/src/commands/CommandFunctors.h index fcd070120..f7f60d5ce 100644 --- a/src/commands/CommandFunctors.h +++ b/src/commands/CommandFunctors.h @@ -29,6 +29,8 @@ class wxEvtHandler; // couldn't satisfy the requirement for both base classes at once. using CommandHandlerObject = wxEvtHandler; +// First of two function pointers registered with each command: an extractor +// of the handler object from the AudacityProject using CommandHandlerFinder = CommandHandlerObject &(*)(AudacityProject&); class wxEvent; @@ -54,112 +56,9 @@ struct CommandContext { CommandParameter parameter; }; -class wxEvent; -typedef wxString PluginID; - -class AUDACITY_DLL_API CommandFunctor /* not final */ -{ -public: - CommandFunctor(){}; - virtual ~CommandFunctor(){}; - virtual void operator()(const CommandContext &context) = 0; -}; - -using CommandFunctorPointer = std::shared_ptr ; - - -// Define functor subclasses that dispatch to the correct call sequence on -// member functions of AudacityProject (or other class!) - -template -using audCommandFunction = void (OBJ::*)(); - -template -class VoidFunctor final : public CommandFunctor -{ -public: - explicit VoidFunctor(OBJ *This, audCommandFunction pfn) - : mThis{ This }, mCommandFunction{ pfn } {} - void operator () (const CommandContext &context) override - { (mThis->*mCommandFunction) (); } -private: - OBJ *const mThis; - const audCommandFunction mCommandFunction; -}; - -template -using audCommandKeyFunction = void (OBJ::*)(const wxEvent *); - -template -class KeyFunctor final : public CommandFunctor -{ -public: - explicit KeyFunctor(OBJ *This, audCommandKeyFunction pfn) - : mThis{ This }, mCommandKeyFunction{ pfn } {} - void operator () (const CommandContext &context) override - { (mThis->*mCommandKeyFunction) (context.pEvt); } -private: - OBJ *const mThis; - const audCommandKeyFunction mCommandKeyFunction; -}; - -template -using audCommandListFunction = void (OBJ::*)(int); - -template -class ListFunctor final : public CommandFunctor -{ -public: - explicit ListFunctor(OBJ *This, audCommandListFunction pfn) - : mThis{ This }, mCommandListFunction{ pfn } {} - void operator () (const CommandContext &context) override - { (mThis->*mCommandListFunction)(context.index); } -private: - OBJ *const mThis; - const audCommandListFunction mCommandListFunction; -}; - -template -using audCommandPluginFunction = void (OBJ::*)(const PluginID &, int); - -template -class PluginFunctor final : public CommandFunctor -{ -public: - explicit PluginFunctor(OBJ *This, audCommandPluginFunction pfn) - : mThis{ This }, mCommandPluginFunction{ pfn } {} - void operator () (const CommandContext &context) override - { (mThis->*mCommandPluginFunction) - (context.parameter, - 0 // AudacityProject::OnEffectFlags::kNone - ); } -private: - OBJ *const mThis; - const audCommandPluginFunction mCommandPluginFunction; -}; - -// Now define an overloaded factory function -template -inline CommandFunctorPointer MakeFunctor(OBJ *This, - audCommandFunction pfn) -{ return CommandFunctorPointer{ safenew VoidFunctor{ This, pfn } }; } - -template -inline CommandFunctorPointer MakeFunctor(OBJ *This, - audCommandKeyFunction pfn) -{ return CommandFunctorPointer{ safenew KeyFunctor{ This, pfn } }; } - -template -inline CommandFunctorPointer MakeFunctor(OBJ *This, - audCommandListFunction pfn) -{ return CommandFunctorPointer{ safenew ListFunctor{ This, pfn } }; } - -template -inline CommandFunctorPointer MakeFunctor(OBJ *This, - audCommandPluginFunction pfn) -{ return CommandFunctorPointer{ safenew PluginFunctor{ This, pfn } }; } - -// Now define the macro abbreviations that call the factory -#define FNT(OBJ, This, X) (MakeFunctor(This, X )) +// Second of two function pointers registered with each command: a pointer +// to a member function of the handler object +using CommandFunctorPointer = + void (CommandHandlerObject::*)(const CommandContext &); #endif diff --git a/src/commands/CommandManager.cpp b/src/commands/CommandManager.cpp index abdbe8520..1263b0fa5 100644 --- a/src/commands/CommandManager.cpp +++ b/src/commands/CommandManager.cpp @@ -1493,7 +1493,8 @@ bool CommandManager::HandleCommandEntry(const CommandListEntry * entry, } CommandContext context{ *proj, evt, entry->index, entry->parameter }; - (*(entry->callback))(context); + auto &handler = entry->finder(*proj); + (handler.*(entry->callback))(context); return true; } diff --git a/src/commands/OpenSaveCommands.cpp b/src/commands/OpenSaveCommands.cpp index 8b536fe2d..45bbbd961 100644 --- a/src/commands/OpenSaveCommands.cpp +++ b/src/commands/OpenSaveCommands.cpp @@ -44,7 +44,8 @@ bool OpenProjectCommand::Apply(CommandExecutionContext context) wxString oldFileName = context.GetProject()->GetFileName(); if(fileName == wxEmptyString) { - context.GetProject()->OnOpen(); + auto project = context.GetProject(); + project->OnOpen(*project); } else { diff --git a/src/commands/SelectCommand.cpp b/src/commands/SelectCommand.cpp index 6d0c6120d..4d429f124 100644 --- a/src/commands/SelectCommand.cpp +++ b/src/commands/SelectCommand.cpp @@ -61,12 +61,14 @@ bool SelectCommand::Apply(CommandExecutionContext context) if (mode.IsSameAs(wxT("None"))) { // select none - context.GetProject()->OnSelectNone(); + auto project = context.GetProject(); + project->OnSelectNone(*project); } else if (mode.IsSameAs(wxT("All"))) { // select all - context.GetProject()->OnSelectAll(); + auto project = context.GetProject(); + project->OnSelectAll(*project); } else if (mode.IsSameAs(wxT("Range"))) { diff --git a/src/toolbars/ScrubbingToolBar.cpp b/src/toolbars/ScrubbingToolBar.cpp index ac39df4e8..a26a6c1a3 100644 --- a/src/toolbars/ScrubbingToolBar.cpp +++ b/src/toolbars/ScrubbingToolBar.cpp @@ -193,13 +193,13 @@ void ScrubbingToolBar::OnButton(wxCommandEvent &event) switch (id) { case STBScrubID: - scrubber.OnScrub(); + scrubber.OnScrub(*p); break; case STBSeekID: - scrubber.OnSeek(); + scrubber.OnSeek(*p); break; case STBRulerID: - scrubber.OnToggleScrubRuler(); + scrubber.OnToggleScrubRuler(*p); break; default: wxASSERT(false); diff --git a/src/tracks/ui/Scrubbing.cpp b/src/tracks/ui/Scrubbing.cpp index 9e36d4ff7..65165f293 100644 --- a/src/tracks/ui/Scrubbing.cpp +++ b/src/tracks/ui/Scrubbing.cpp @@ -224,7 +224,7 @@ namespace { wxString label; wxString status; CommandFlag flags; - void (Scrubber::*memFn)(); + void (Scrubber::*memFn)(const CommandContext&); bool seek; bool (Scrubber::*StatusTest)() const; @@ -921,19 +921,19 @@ void Scrubber::OnScrubOrSeek(bool seek) scrubbingToolBar->RegenerateTooltips(); } -void Scrubber::OnScrub() +void Scrubber::OnScrub(const CommandContext&) { OnScrubOrSeek(false); CheckMenuItems(); } -void Scrubber::OnSeek() +void Scrubber::OnSeek(const CommandContext&) { OnScrubOrSeek(true); CheckMenuItems(); } -void Scrubber::OnToggleScrubRuler() +void Scrubber::OnToggleScrubRuler(const CommandContext&) { mProject->GetRulerPanel()->OnToggleScrubRuler(); const auto toolbar = mProject->GetToolManager()->GetToolBar(ScrubbingBarID); @@ -1014,13 +1014,13 @@ void Scrubber::AddMenuItems() for (const auto &item : menuItems) { if (item.StatusTest) cm->AddCheck(item.name, wxGetTranslation(item.label), - findme, FNT(Scrubber, this, item.memFn), + findme, static_cast(item.memFn), false, item.flags, item.flags); else // The start item cm->AddItem(item.name, wxGetTranslation(item.label), - findme, FNT(Scrubber, this, item.memFn), + findme, static_cast(item.memFn), item.flags, item.flags); } cm->EndSubMenu(); diff --git a/src/tracks/ui/Scrubbing.h b/src/tracks/ui/Scrubbing.h index a8e72a663..cd13e925d 100644 --- a/src/tracks/ui/Scrubbing.h +++ b/src/tracks/ui/Scrubbing.h @@ -18,9 +18,11 @@ Paul Licameli split from TrackPanel.cpp #include "../../Experimental.h" #include "../../widgets/Overlay.h" +#include "../../commands/CommandFunctors.h" #include "../../../include/audacity/Types.h" class AudacityProject; +extern AudacityProject *GetActiveProject(); // Conditionally compile either a separate thead, or else use a timer in the main // thread, to poll the mouse and update scrubbing speed and direction. The advantage of @@ -123,13 +125,14 @@ public: void PopulatePopupMenu(wxMenu &menu); void OnScrubOrSeek(bool seek); - void OnScrub(); - void OnSeek(); - void OnToggleScrubRuler(); + void OnScrub(const CommandContext&); + void OnSeek(const CommandContext&); + void OnToggleScrubRuler(const CommandContext&); // Convenience wrapper for the above - template void Thunk(wxCommandEvent &dummy) - { (this->*pfn)(); } + template + void Thunk(wxCommandEvent &dummy) + { (this->*pfn)(*GetActiveProject()); } // A string to put in the leftmost part of the status bar // when scrub or seek is in progress, or else empty. diff --git a/src/widgets/MultiDialog.cpp b/src/widgets/MultiDialog.cpp index 6d564f2ad..72300c483 100644 --- a/src/widgets/MultiDialog.cpp +++ b/src/widgets/MultiDialog.cpp @@ -150,7 +150,8 @@ void MultiDialog::OnOK(wxCommandEvent & WXUNUSED(event)) void MultiDialog::OnShowLog(wxCommandEvent & WXUNUSED(event)) { - GetActiveProject()->OnShowLog(); + auto project = GetActiveProject(); + project->OnShowLog(*project); } diff --git a/src/widgets/Ruler.cpp b/src/widgets/Ruler.cpp index 51a32d107..144871eb0 100644 --- a/src/widgets/Ruler.cpp +++ b/src/widgets/Ruler.cpp @@ -2415,7 +2415,7 @@ void AdornedRulerPanel::OnMouseEvents(wxMouseEvent &evt) bool switchToQP = (zone == StatusChoice::EnteringQP && mQuickPlayEnabled); if (switchToQP && evt.LeftDown()) { // We can't stop scrubbing yet (see comments in Bug 1391), but we can pause it. - mProject->OnPause(); + mProject->OnPause(*mProject); // Don't return, fall through } else if (scrubber.IsPaused()) @@ -2554,7 +2554,7 @@ void AdornedRulerPanel::HandleQPClick(wxMouseEvent &evt, wxCoord mousePosX) // Temporarily unlock locked play region if (mPlayRegionLock && evt.LeftDown()) { //mPlayRegionLock = true; - mProject->OnUnlockPlayRegion(); + mProject->OnUnlockPlayRegion(*mProject); } mLeftDownClickUnsnapped = mQuickPlayPosUnsnapped; @@ -2734,7 +2734,7 @@ void AdornedRulerPanel::HandleQPRelease(wxMouseEvent &evt) if (mPlayRegionLock) { // Restore Locked Play region SetPlayRegion(mOldPlayRegionStart, mOldPlayRegionEnd); - mProject->OnLockPlayRegion(); + mProject->OnLockPlayRegion(*mProject); // and release local lock mPlayRegionLock = false; } @@ -2848,7 +2848,7 @@ void AdornedRulerPanel::UpdateStatusBarAndTooltips(StatusChoice choice) void AdornedRulerPanel::OnToggleScrubRulerFromMenu(wxCommandEvent&) { auto &scrubber = mProject->GetScrubber(); - scrubber.OnToggleScrubRuler( ); + scrubber.OnToggleScrubRuler(*mProject); } void AdornedRulerPanel::OnToggleScrubRuler(/*wxCommandEvent&*/) @@ -2903,7 +2903,7 @@ void AdornedRulerPanel::UpdateButtonStates() void AdornedRulerPanel::OnTogglePinnedState(wxCommandEvent & /*event*/) { - mProject->OnTogglePinnedHead(); + mProject->OnTogglePinnedHead(*mProject); UpdateButtonStates(); } @@ -3042,9 +3042,9 @@ void AdornedRulerPanel::OnAutoScroll(wxCommandEvent&) void AdornedRulerPanel::OnLockPlayRegion(wxCommandEvent&) { if (mProject->IsPlayRegionLocked()) - mProject->OnUnlockPlayRegion(); + mProject->OnUnlockPlayRegion(*mProject); else - mProject->OnLockPlayRegion(); + mProject->OnLockPlayRegion(*mProject); } From 78aca8c1332901dd89ad0afcea7e0ec244cabee3 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Sat, 19 Aug 2017 11:48:23 -0400 Subject: [PATCH 8/8] Remove inclusions of Menus.h --- src/prefs/BatchPrefs.cpp | 1 - src/widgets/Ruler.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/src/prefs/BatchPrefs.cpp b/src/prefs/BatchPrefs.cpp index 59408fed4..9d05f2e4d 100644 --- a/src/prefs/BatchPrefs.cpp +++ b/src/prefs/BatchPrefs.cpp @@ -26,7 +26,6 @@ #include "../Project.h" #include "../BatchCommandDialog.h" #include "../ShuttleGui.h" -#include "../Menus.h" #include "../toolbars/ToolManager.h" BEGIN_EVENT_TABLE(BatchPrefs, PrefsPanel) diff --git a/src/widgets/Ruler.cpp b/src/widgets/Ruler.cpp index 144871eb0..6b6195b4b 100644 --- a/src/widgets/Ruler.cpp +++ b/src/widgets/Ruler.cpp @@ -89,7 +89,6 @@ array of Ruler::Label. #include "../TimeTrack.h" #include "../TrackPanel.h" #include "../TrackPanelCellIterator.h" -#include "../Menus.h" #include "../NumberScale.h" #include "../Prefs.h" #include "../Snap.h"