From 12bbafe013965ea9a7f0ca3831612f4152d5ded6 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 1 Jan 2020 21:09:16 -0500 Subject: [PATCH] Separate storing of user data from initialization of popup items --- .../labeltrack/ui/LabelTrackControls.cpp | 2 +- .../notetrack/ui/NoteTrackControls.cpp | 2 +- .../notetrack/ui/NoteTrackVZoomHandle.cpp | 4 +- .../wavetrack/ui/SpectrumVZoomHandle.cpp | 4 +- .../wavetrack/ui/SpectrumVZoomHandle.h | 2 +- .../wavetrack/ui/WaveTrackControls.cpp | 37 ++++++++++++++----- .../wavetrack/ui/WaveTrackVZoomHandle.cpp | 2 +- .../wavetrack/ui/WaveTrackVZoomHandle.h | 2 +- .../wavetrack/ui/WaveformVZoomHandle.cpp | 4 +- .../wavetrack/ui/WaveformVZoomHandle.h | 2 +- src/tracks/timetrack/ui/TimeTrackControls.cpp | 6 ++- src/tracks/ui/CommonTrackControls.cpp | 9 ++++- src/tracks/ui/CommonTrackControls.h | 2 +- src/widgets/PopupMenuTable.cpp | 8 +++- src/widgets/PopupMenuTable.h | 18 +++++++-- 15 files changed, 74 insertions(+), 30 deletions(-) diff --git a/src/tracks/labeltrack/ui/LabelTrackControls.cpp b/src/tracks/labeltrack/ui/LabelTrackControls.cpp index a99c39851..da525e24b 100644 --- a/src/tracks/labeltrack/ui/LabelTrackControls.cpp +++ b/src/tracks/labeltrack/ui/LabelTrackControls.cpp @@ -43,7 +43,7 @@ class LabelTrackMenuTable : public PopupMenuTable public: static LabelTrackMenuTable &Instance(); - void InitMenu(Menu*, void *pUserData) override + void InitUserData(void *pUserData) override { mpData = static_cast(pUserData); } diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp index 9acef78f0..f5c211997 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp @@ -83,7 +83,7 @@ public: static NoteTrackMenuTable &Instance(); private: - void InitMenu(Menu*, void *pUserData) override + void InitUserData(void *pUserData) override { mpData = static_cast(pUserData); } diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp index c8bcf5ddb..c94b1ade6 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp @@ -209,7 +209,7 @@ private: mpData = nullptr; } - virtual void InitMenu(Menu *pMenu, void *pUserData) override; + void InitUserData(void *pUserData) override; }; NoteTrackVRulerMenuTable &NoteTrackVRulerMenuTable::Instance() @@ -218,7 +218,7 @@ NoteTrackVRulerMenuTable &NoteTrackVRulerMenuTable::Instance() return instance; } -void NoteTrackVRulerMenuTable::InitMenu(Menu *WXUNUSED(pMenu), void *pUserData) +void NoteTrackVRulerMenuTable::InitUserData(void *pUserData) { mpData = static_cast(pUserData); } diff --git a/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.cpp b/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.cpp index f417343c4..9b2059eb4 100644 --- a/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.cpp @@ -265,9 +265,9 @@ PopupMenuTable &SpectrumVRulerMenuTable::Instance() return instance; } -void SpectrumVRulerMenuTable::InitMenu(Menu *pMenu, void *pUserData) +void SpectrumVRulerMenuTable::InitMenu(Menu *pMenu) { - WaveTrackVRulerMenuTable::InitMenu(pMenu, pUserData); + WaveTrackVRulerMenuTable::InitMenu(pMenu); WaveTrack *const wt = mpData->pTrack; const int id = diff --git a/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.h b/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.h index 310c7fe7d..1fbf566f8 100644 --- a/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.h +++ b/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.h @@ -83,7 +83,7 @@ public: static PopupMenuTable &Instance(); private: - void InitMenu(Menu *pMenu, void *pUserData) override; + void InitMenu(Menu *pMenu) override; void OnSpectrumScaleType(wxCommandEvent &evt); }; diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp index 1a2fa48dc..4539cac84 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp @@ -155,7 +155,8 @@ public: static WaveColorMenuTable &Instance(); private: - void InitMenu(Menu *pMenu, void *pUserData) override; + void InitUserData(void *pUserData) override; + void InitMenu(Menu *pMenu) override; void DestroyMenu() override { @@ -174,9 +175,13 @@ WaveColorMenuTable &WaveColorMenuTable::Instance() return instance; } -void WaveColorMenuTable::InitMenu(Menu *pMenu, void *pUserData) +void WaveColorMenuTable::InitUserData(void *pUserData) { mpData = static_cast(pUserData); +} + +void WaveColorMenuTable::InitMenu(Menu *pMenu) +{ WaveTrack *const pTrack = static_cast(mpData->pTrack); auto WaveColorId = IdOfWaveColor( pTrack->GetWaveColorIndex()); SetMenuChecks(*pMenu, [=](int id){ return id == WaveColorId; }); @@ -247,7 +252,8 @@ public: static FormatMenuTable &Instance(); private: - void InitMenu(Menu *pMenu, void *pUserData) override; + void InitUserData(void *pUserData) override; + void InitMenu(Menu *pMenu) override; void DestroyMenu() override { @@ -267,9 +273,13 @@ FormatMenuTable &FormatMenuTable::Instance() return instance; } -void FormatMenuTable::InitMenu(Menu *pMenu, void *pUserData) +void FormatMenuTable::InitUserData(void *pUserData) { mpData = static_cast(pUserData); +} + +void FormatMenuTable::InitMenu(Menu *pMenu) +{ WaveTrack *const pTrack = static_cast(mpData->pTrack); auto formatId = IdOfFormat(pTrack->GetSampleFormat()); SetMenuChecks(*pMenu, [=](int id){ return id == formatId; }); @@ -363,7 +373,8 @@ public: static RateMenuTable &Instance(); private: - void InitMenu(Menu *pMenu, void *pUserData) override; + void InitUserData(void *pUserData) override; + void InitMenu(Menu *pMenu) override; void DestroyMenu() override { @@ -385,9 +396,13 @@ RateMenuTable &RateMenuTable::Instance() return instance; } -void RateMenuTable::InitMenu(Menu *pMenu, void *pUserData) +void RateMenuTable::InitUserData(void *pUserData) { mpData = static_cast(pUserData); +} + +void RateMenuTable::InitMenu(Menu *pMenu) +{ WaveTrack *const pTrack = static_cast(mpData->pTrack); const auto rateId = IdOfRate((int)pTrack->GetRate()); SetMenuChecks(*pMenu, [=](int id){ return id == rateId; }); @@ -557,7 +572,8 @@ public: protected: WaveTrackMenuTable() : mpData(NULL) {mpTrack=NULL;} - void InitMenu(Menu *pMenu, void *pUserData) override; + void InitUserData(void *pUserData) override; + void InitMenu(Menu *pMenu) override; void DestroyMenu() override { @@ -597,9 +613,13 @@ WaveTrackMenuTable &WaveTrackMenuTable::Instance( Track * pTrack ) return instance; } -void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData) +void WaveTrackMenuTable::InitUserData(void *pUserData) { mpData = static_cast(pUserData); +} + +void WaveTrackMenuTable::InitMenu(Menu *pMenu) +{ WaveTrack *const pTrack = static_cast(mpData->pTrack); std::vector checkedIds; @@ -637,7 +657,6 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData) if ( isMono ) { - mpData = static_cast(pUserData); WaveTrack *const pTrack2 = static_cast(mpData->pTrack); auto next = * ++ tracks.Find(pTrack2); diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.cpp index 0b7084552..dba89f5b5 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.cpp @@ -34,7 +34,7 @@ bool WaveTrackVZoomHandle::IsDragZooming(int zoomStart, int zoomEnd) /////////////////////////////////////////////////////////////////////////////// // Table class -void WaveTrackVRulerMenuTable::InitMenu(Menu *, void *pUserData) +void WaveTrackVRulerMenuTable::InitUserData(void *pUserData) { mpData = static_cast(pUserData); } diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.h b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.h index 6ad50bd50..9ddcd5f3b 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.h +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.h @@ -69,7 +69,7 @@ public: protected: WaveTrackVRulerMenuTable() {} - void InitMenu(Menu *pMenu, void *pUserData) override; + void InitUserData(void *pUserData) override; private: void DestroyMenu() override diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.cpp index 6be94f7e0..b8080c73f 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.cpp @@ -266,9 +266,9 @@ PopupMenuTable &WaveformVRulerMenuTable::Instance() return instance; } -void WaveformVRulerMenuTable::InitMenu(Menu *pMenu, void *pUserData) +void WaveformVRulerMenuTable::InitMenu(Menu *pMenu) { - WaveTrackVRulerMenuTable::InitMenu(pMenu, pUserData); + WaveTrackVRulerMenuTable::InitMenu(pMenu); // DB setting is already on track drop down. WaveTrack *const wt = mpData->pTrack; diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.h b/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.h index 81900093f..544910c87 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.h +++ b/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.h @@ -83,7 +83,7 @@ public: static PopupMenuTable &Instance(); private: - virtual void InitMenu(Menu *pMenu, void *pUserData) override; + virtual void InitMenu(Menu *pMenu) override; void OnWaveformScaleType(wxCommandEvent &evt); }; diff --git a/src/tracks/timetrack/ui/TimeTrackControls.cpp b/src/tracks/timetrack/ui/TimeTrackControls.cpp index 3293ea2a6..4d70ffc18 100644 --- a/src/tracks/timetrack/ui/TimeTrackControls.cpp +++ b/src/tracks/timetrack/ui/TimeTrackControls.cpp @@ -47,9 +47,13 @@ public: static TimeTrackMenuTable &Instance(); private: - void InitMenu(Menu *pMenu, void *pUserData) override + void InitUserData(void *pUserData) override { mpData = static_cast(pUserData); + } + + void InitMenu(Menu *pMenu) override + { TimeTrack *const pTrack = static_cast(mpData->pTrack); pMenu->Check(OnTimeTrackLogIntID, pTrack->GetInterpolateLog()); diff --git a/src/tracks/ui/CommonTrackControls.cpp b/src/tracks/ui/CommonTrackControls.cpp index 6ed7af9b6..71a48e979 100644 --- a/src/tracks/ui/CommonTrackControls.cpp +++ b/src/tracks/ui/CommonTrackControls.cpp @@ -90,7 +90,8 @@ private: void OnSetName(wxCommandEvent &); void OnMoveTrack(wxCommandEvent &event); - void InitMenu(Menu *pMenu, void *pUserData) override; + void InitUserData(void *pUserData) override; + void InitMenu(Menu *pMenu) override; void DestroyMenu() override { @@ -106,9 +107,13 @@ TrackMenuTable &TrackMenuTable::Instance() return instance; } -void TrackMenuTable::InitMenu(Menu *pMenu, void *pUserData) +void TrackMenuTable::InitUserData(void *pUserData) { mpData = static_cast(pUserData); +} + +void TrackMenuTable::InitMenu(Menu *pMenu) +{ Track *const pTrack = mpData->pTrack; const auto &tracks = TrackList::Get( *GetActiveProject() ); diff --git a/src/tracks/ui/CommonTrackControls.h b/src/tracks/ui/CommonTrackControls.h index ce05975fc..781cf2131 100644 --- a/src/tracks/ui/CommonTrackControls.h +++ b/src/tracks/ui/CommonTrackControls.h @@ -28,7 +28,7 @@ class CommonTrackControls /* not final */ : public TrackControls public: using TrackControls::TrackControls; - // This is passed to the InitMenu() methods of the PopupMenuTable + // This is passed to the InitUserData() methods of the PopupMenuTable // objects returned by GetMenuExtension: struct InitMenuData { diff --git a/src/widgets/PopupMenuTable.cpp b/src/widgets/PopupMenuTable.cpp index ef093b07b..454878b5a 100644 --- a/src/widgets/PopupMenuTable.cpp +++ b/src/widgets/PopupMenuTable.cpp @@ -20,6 +20,8 @@ PopupMenuTable::Menu::~Menu() void PopupMenuTable::Menu::Extend(PopupMenuTable *pTable) { + pTable->InitUserData(pUserData); + auto connect = [&]( const PopupMenuTable::Entry *pEntry ) { this->pParent->Bind (wxEVT_COMMAND_MENU_SELECTED, @@ -61,7 +63,7 @@ void PopupMenuTable::Menu::Extend(PopupMenuTable *pTable) } } - pTable->InitMenu(this, pUserData); + pTable->InitMenu(this); } void PopupMenuTable::Menu::DisconnectTable(PopupMenuTable *pTable) @@ -85,6 +87,10 @@ void PopupMenuTable::Menu::Disconnect() DisconnectTable(pTable); } +void PopupMenuTable::InitMenu(Menu *) +{ +} + // static std::unique_ptr PopupMenuTable::BuildMenu ( wxEvtHandler *pParent, PopupMenuTable *pTable, void *pUserData ) diff --git a/src/widgets/PopupMenuTable.h b/src/widgets/PopupMenuTable.h index 2c25e3520..9e3a98ef8 100644 --- a/src/widgets/PopupMenuTable.h +++ b/src/widgets/PopupMenuTable.h @@ -79,14 +79,19 @@ public: void *pUserData; }; + // Called before the menu items are appended. + // Store user data, if needed. + virtual void InitUserData(void *pUserData) = 0; + // Called when the menu is about to pop up. // Your chance to enable and disable items. - virtual void InitMenu(Menu *pMenu, void *pUserData) = 0; + // Default implementation does nothing. + virtual void InitMenu(Menu *pMenu); // Called when menu is destroyed. virtual void DestroyMenu() = 0; - // Optional pUserData gets passed to the InitMenu routines of tables. + // Optional pUserData gets passed to the InitUserData routines of tables. // No memory management responsibility is assumed by this function. static std::unique_ptr BuildMenu (wxEvtHandler *pParent, PopupMenuTable *pTable, void *pUserData = NULL); @@ -101,14 +106,19 @@ In class MyTable (maybe in the private section), which inherits from PopupMenuTable, DECLARE_POPUP_MENU(MyTable); -virtual void InitMenu(Menu *pMenu, void *pUserData); +virtual void InitUserData(void *pUserData); +virtual void InitMenu(Menu *pMenu); virtual void DestroyMenu(); Then in MyTable.cpp, -void MyTable::InitMenu(Menu *pMenu, void *pUserData) +void MyTable::InitUserData(void *pUserData) { auto pData = static_cast(pUserData); +} + +void MyTable::InitMenu(Menu *pMenu) +{ // Remember pData, enable or disable menu items }