From 9435e97fb872dd856d5b53a0a4f07e81c9b9b7d5 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 5 Feb 2020 15:20:08 -0500 Subject: [PATCH] Store popup sub-menu caption with its item table --- .../wavetrack/ui/WaveTrackControls.cpp | 24 ++++++++++++------- src/widgets/PopupMenuTable.cpp | 3 ++- src/widgets/PopupMenuTable.h | 16 +++++++++---- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp index d49453615..fda5ca333 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp @@ -152,7 +152,9 @@ enum { // Table class for a sub-menu class WaveColorMenuTable : public PopupMenuTable { - WaveColorMenuTable() : mpData(NULL) {} + WaveColorMenuTable() + : PopupMenuTable( XO("&Wave Color") ) + {} DECLARE_POPUP_MENU(WaveColorMenuTable); public: @@ -167,7 +169,7 @@ private: mpData = NULL; } - PlayableTrackControls::InitMenuData *mpData; + PlayableTrackControls::InitMenuData *mpData{}; int IdOfWaveColor(int WaveColor); void OnWaveColorChange(wxCommandEvent & event); @@ -249,7 +251,9 @@ void WaveColorMenuTable::OnWaveColorChange(wxCommandEvent & event) // Table class for a sub-menu class FormatMenuTable : public PopupMenuTable { - FormatMenuTable() : mpData(NULL) {} + FormatMenuTable() + : PopupMenuTable{ XO("&Format") } + {} DECLARE_POPUP_MENU(FormatMenuTable); public: @@ -264,7 +268,7 @@ private: mpData = NULL; } - PlayableTrackControls::InitMenuData *mpData; + PlayableTrackControls::InitMenuData *mpData{}; int IdOfFormat(int format); @@ -370,7 +374,9 @@ void FormatMenuTable::OnFormatChange(wxCommandEvent & event) // Table class for a sub-menu class RateMenuTable : public PopupMenuTable { - RateMenuTable() : mpData(NULL) {} + RateMenuTable() + : PopupMenuTable{ XO("Rat&e") } + {} DECLARE_POPUP_MENU(RateMenuTable); public: @@ -385,7 +391,7 @@ private: mpData = NULL; } - PlayableTrackControls::InitMenuData *mpData; + PlayableTrackControls::InitMenuData *mpData{}; int IdOfRate(int rate); void SetRate(WaveTrack * pTrack, double rate); @@ -800,14 +806,14 @@ BEGIN_POPUP_MENU(WaveTrackMenuTable) ) ); if( hasWaveform ){ POPUP_MENU_SEPARATOR() - POPUP_MENU_SUB_MENU(XO("&Wave Color"), WaveColorMenuTable) + POPUP_MENU_SUB_MENU(WaveColorMenuTable) } } POPUP_MENU_SEPARATOR() - POPUP_MENU_SUB_MENU(XO("&Format"), FormatMenuTable) + POPUP_MENU_SUB_MENU(FormatMenuTable) POPUP_MENU_SEPARATOR() - POPUP_MENU_SUB_MENU(XO("Rat&e"), RateMenuTable) + POPUP_MENU_SUB_MENU(RateMenuTable) END_POPUP_MENU() diff --git a/src/widgets/PopupMenuTable.cpp b/src/widgets/PopupMenuTable.cpp index e9591fc6a..018a0a0db 100644 --- a/src/widgets/PopupMenuTable.cpp +++ b/src/widgets/PopupMenuTable.cpp @@ -56,7 +56,8 @@ void PopupMenuTable::Menu::Extend(PopupMenuTable *pTable) { const auto subTable = pEntry->subTable; auto subMenu = BuildMenu( this->pParent, subTable, pUserData ); - this->AppendSubMenu( subMenu.release(), pEntry->caption.Translation()); + this->AppendSubMenu( + subMenu.release(), subTable->Caption().Translation()); } default: break; diff --git a/src/widgets/PopupMenuTable.h b/src/widgets/PopupMenuTable.h index 9b1c6e06c..a02a6acc9 100644 --- a/src/widgets/PopupMenuTable.h +++ b/src/widgets/PopupMenuTable.h @@ -55,7 +55,12 @@ struct PopupMenuTableEntry class PopupMenuTable : public wxEvtHandler { public: - typedef PopupMenuTableEntry Entry; + using Entry = PopupMenuTableEntry; + + // Supply a nonempty caption for sub-menu tables + PopupMenuTable( const TranslatableString &caption = {} ) + : mCaption{ caption } + {} class Menu : public wxMenu @@ -95,6 +100,8 @@ public: static std::unique_ptr BuildMenu (wxEvtHandler *pParent, PopupMenuTable *pTable, void *pUserData = NULL); + const TranslatableString &Caption() const { return mCaption; } + protected: virtual void Populate() = 0; void Clear() { mContents.clear(); } @@ -108,6 +115,7 @@ protected: } Entries mContents; + TranslatableString mCaption; }; /* @@ -173,7 +181,7 @@ That's all! // begins function #define BEGIN_POPUP_MENU(HandlerClass) \ void HandlerClass::Populate() { \ - typedef HandlerClass My; + using My = HandlerClass; #define POPUP_MENU_APPEND(type, id, string, memFn, subTable) \ mContents.push_back( Entry { \ @@ -202,9 +210,9 @@ void HandlerClass::Populate() { \ POPUP_MENU_APPEND_ITEM(Entry::CheckItem, id, string, memFn); // classname names a class that derives from MenuTable and defines Instance() -#define POPUP_MENU_SUB_MENU(string, classname) \ +#define POPUP_MENU_SUB_MENU(classname) \ POPUP_MENU_APPEND( \ - Entry::SubMenu, -1, string, nullptr, &classname::Instance() ); + Entry::SubMenu, -1, classname::Instance().Caption(), nullptr, &classname::Instance() ); #define POPUP_MENU_SEPARATOR() \ POPUP_MENU_APPEND( \