1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-10 17:11:17 +02:00

Store popup sub-menu caption with its item table

This commit is contained in:
Paul Licameli 2020-02-05 15:20:08 -05:00
parent 1e37172e6d
commit 9435e97fb8
3 changed files with 29 additions and 14 deletions

View File

@ -152,7 +152,9 @@ enum {
// Table class for a sub-menu // Table class for a sub-menu
class WaveColorMenuTable : public PopupMenuTable class WaveColorMenuTable : public PopupMenuTable
{ {
WaveColorMenuTable() : mpData(NULL) {} WaveColorMenuTable()
: PopupMenuTable( XO("&Wave Color") )
{}
DECLARE_POPUP_MENU(WaveColorMenuTable); DECLARE_POPUP_MENU(WaveColorMenuTable);
public: public:
@ -167,7 +169,7 @@ private:
mpData = NULL; mpData = NULL;
} }
PlayableTrackControls::InitMenuData *mpData; PlayableTrackControls::InitMenuData *mpData{};
int IdOfWaveColor(int WaveColor); int IdOfWaveColor(int WaveColor);
void OnWaveColorChange(wxCommandEvent & event); void OnWaveColorChange(wxCommandEvent & event);
@ -249,7 +251,9 @@ void WaveColorMenuTable::OnWaveColorChange(wxCommandEvent & event)
// Table class for a sub-menu // Table class for a sub-menu
class FormatMenuTable : public PopupMenuTable class FormatMenuTable : public PopupMenuTable
{ {
FormatMenuTable() : mpData(NULL) {} FormatMenuTable()
: PopupMenuTable{ XO("&Format") }
{}
DECLARE_POPUP_MENU(FormatMenuTable); DECLARE_POPUP_MENU(FormatMenuTable);
public: public:
@ -264,7 +268,7 @@ private:
mpData = NULL; mpData = NULL;
} }
PlayableTrackControls::InitMenuData *mpData; PlayableTrackControls::InitMenuData *mpData{};
int IdOfFormat(int format); int IdOfFormat(int format);
@ -370,7 +374,9 @@ void FormatMenuTable::OnFormatChange(wxCommandEvent & event)
// Table class for a sub-menu // Table class for a sub-menu
class RateMenuTable : public PopupMenuTable class RateMenuTable : public PopupMenuTable
{ {
RateMenuTable() : mpData(NULL) {} RateMenuTable()
: PopupMenuTable{ XO("Rat&e") }
{}
DECLARE_POPUP_MENU(RateMenuTable); DECLARE_POPUP_MENU(RateMenuTable);
public: public:
@ -385,7 +391,7 @@ private:
mpData = NULL; mpData = NULL;
} }
PlayableTrackControls::InitMenuData *mpData; PlayableTrackControls::InitMenuData *mpData{};
int IdOfRate(int rate); int IdOfRate(int rate);
void SetRate(WaveTrack * pTrack, double rate); void SetRate(WaveTrack * pTrack, double rate);
@ -800,14 +806,14 @@ BEGIN_POPUP_MENU(WaveTrackMenuTable)
) ); ) );
if( hasWaveform ){ if( hasWaveform ){
POPUP_MENU_SEPARATOR() POPUP_MENU_SEPARATOR()
POPUP_MENU_SUB_MENU(XO("&Wave Color"), WaveColorMenuTable) POPUP_MENU_SUB_MENU(WaveColorMenuTable)
} }
} }
POPUP_MENU_SEPARATOR() POPUP_MENU_SEPARATOR()
POPUP_MENU_SUB_MENU(XO("&Format"), FormatMenuTable) POPUP_MENU_SUB_MENU(FormatMenuTable)
POPUP_MENU_SEPARATOR() POPUP_MENU_SEPARATOR()
POPUP_MENU_SUB_MENU(XO("Rat&e"), RateMenuTable) POPUP_MENU_SUB_MENU(RateMenuTable)
END_POPUP_MENU() END_POPUP_MENU()

View File

@ -56,7 +56,8 @@ void PopupMenuTable::Menu::Extend(PopupMenuTable *pTable)
{ {
const auto subTable = pEntry->subTable; const auto subTable = pEntry->subTable;
auto subMenu = BuildMenu( this->pParent, subTable, pUserData ); auto subMenu = BuildMenu( this->pParent, subTable, pUserData );
this->AppendSubMenu( subMenu.release(), pEntry->caption.Translation()); this->AppendSubMenu(
subMenu.release(), subTable->Caption().Translation());
} }
default: default:
break; break;

View File

@ -55,7 +55,12 @@ struct PopupMenuTableEntry
class PopupMenuTable : public wxEvtHandler class PopupMenuTable : public wxEvtHandler
{ {
public: public:
typedef PopupMenuTableEntry Entry; using Entry = PopupMenuTableEntry;
// Supply a nonempty caption for sub-menu tables
PopupMenuTable( const TranslatableString &caption = {} )
: mCaption{ caption }
{}
class Menu class Menu
: public wxMenu : public wxMenu
@ -95,6 +100,8 @@ public:
static std::unique_ptr<Menu> BuildMenu static std::unique_ptr<Menu> BuildMenu
(wxEvtHandler *pParent, PopupMenuTable *pTable, void *pUserData = NULL); (wxEvtHandler *pParent, PopupMenuTable *pTable, void *pUserData = NULL);
const TranslatableString &Caption() const { return mCaption; }
protected: protected:
virtual void Populate() = 0; virtual void Populate() = 0;
void Clear() { mContents.clear(); } void Clear() { mContents.clear(); }
@ -108,6 +115,7 @@ protected:
} }
Entries mContents; Entries mContents;
TranslatableString mCaption;
}; };
/* /*
@ -173,7 +181,7 @@ That's all!
// begins function // begins function
#define BEGIN_POPUP_MENU(HandlerClass) \ #define BEGIN_POPUP_MENU(HandlerClass) \
void HandlerClass::Populate() { \ void HandlerClass::Populate() { \
typedef HandlerClass My; using My = HandlerClass;
#define POPUP_MENU_APPEND(type, id, string, memFn, subTable) \ #define POPUP_MENU_APPEND(type, id, string, memFn, subTable) \
mContents.push_back( Entry { \ mContents.push_back( Entry { \
@ -202,9 +210,9 @@ void HandlerClass::Populate() { \
POPUP_MENU_APPEND_ITEM(Entry::CheckItem, id, string, memFn); POPUP_MENU_APPEND_ITEM(Entry::CheckItem, id, string, memFn);
// classname names a class that derives from MenuTable and defines Instance() // 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( \ POPUP_MENU_APPEND( \
Entry::SubMenu, -1, string, nullptr, &classname::Instance() ); Entry::SubMenu, -1, classname::Instance().Caption(), nullptr, &classname::Instance() );
#define POPUP_MENU_SEPARATOR() \ #define POPUP_MENU_SEPARATOR() \
POPUP_MENU_APPEND( \ POPUP_MENU_APPEND( \