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

Separate storing of user data from initialization of popup items

This commit is contained in:
Paul Licameli 2020-01-01 21:09:16 -05:00
parent 0256156dec
commit 12bbafe013
15 changed files with 74 additions and 30 deletions

View File

@ -43,7 +43,7 @@ class LabelTrackMenuTable : public PopupMenuTable
public: public:
static LabelTrackMenuTable &Instance(); static LabelTrackMenuTable &Instance();
void InitMenu(Menu*, void *pUserData) override void InitUserData(void *pUserData) override
{ {
mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData); mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData);
} }

View File

@ -83,7 +83,7 @@ public:
static NoteTrackMenuTable &Instance(); static NoteTrackMenuTable &Instance();
private: private:
void InitMenu(Menu*, void *pUserData) override void InitUserData(void *pUserData) override
{ {
mpData = static_cast<NoteTrackControlsBase::InitMenuData*>(pUserData); mpData = static_cast<NoteTrackControlsBase::InitMenuData*>(pUserData);
} }

View File

@ -209,7 +209,7 @@ private:
mpData = nullptr; mpData = nullptr;
} }
virtual void InitMenu(Menu *pMenu, void *pUserData) override; void InitUserData(void *pUserData) override;
}; };
NoteTrackVRulerMenuTable &NoteTrackVRulerMenuTable::Instance() NoteTrackVRulerMenuTable &NoteTrackVRulerMenuTable::Instance()
@ -218,7 +218,7 @@ NoteTrackVRulerMenuTable &NoteTrackVRulerMenuTable::Instance()
return instance; return instance;
} }
void NoteTrackVRulerMenuTable::InitMenu(Menu *WXUNUSED(pMenu), void *pUserData) void NoteTrackVRulerMenuTable::InitUserData(void *pUserData)
{ {
mpData = static_cast<InitMenuData*>(pUserData); mpData = static_cast<InitMenuData*>(pUserData);
} }

View File

@ -265,9 +265,9 @@ PopupMenuTable &SpectrumVRulerMenuTable::Instance()
return 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; WaveTrack *const wt = mpData->pTrack;
const int id = const int id =

View File

@ -83,7 +83,7 @@ public:
static PopupMenuTable &Instance(); static PopupMenuTable &Instance();
private: private:
void InitMenu(Menu *pMenu, void *pUserData) override; void InitMenu(Menu *pMenu) override;
void OnSpectrumScaleType(wxCommandEvent &evt); void OnSpectrumScaleType(wxCommandEvent &evt);
}; };

View File

@ -155,7 +155,8 @@ public:
static WaveColorMenuTable &Instance(); static WaveColorMenuTable &Instance();
private: private:
void InitMenu(Menu *pMenu, void *pUserData) override; void InitUserData(void *pUserData) override;
void InitMenu(Menu *pMenu) override;
void DestroyMenu() override void DestroyMenu() override
{ {
@ -174,9 +175,13 @@ WaveColorMenuTable &WaveColorMenuTable::Instance()
return instance; return instance;
} }
void WaveColorMenuTable::InitMenu(Menu *pMenu, void *pUserData) void WaveColorMenuTable::InitUserData(void *pUserData)
{ {
mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData); mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData);
}
void WaveColorMenuTable::InitMenu(Menu *pMenu)
{
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
auto WaveColorId = IdOfWaveColor( pTrack->GetWaveColorIndex()); auto WaveColorId = IdOfWaveColor( pTrack->GetWaveColorIndex());
SetMenuChecks(*pMenu, [=](int id){ return id == WaveColorId; }); SetMenuChecks(*pMenu, [=](int id){ return id == WaveColorId; });
@ -247,7 +252,8 @@ public:
static FormatMenuTable &Instance(); static FormatMenuTable &Instance();
private: private:
void InitMenu(Menu *pMenu, void *pUserData) override; void InitUserData(void *pUserData) override;
void InitMenu(Menu *pMenu) override;
void DestroyMenu() override void DestroyMenu() override
{ {
@ -267,9 +273,13 @@ FormatMenuTable &FormatMenuTable::Instance()
return instance; return instance;
} }
void FormatMenuTable::InitMenu(Menu *pMenu, void *pUserData) void FormatMenuTable::InitUserData(void *pUserData)
{ {
mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData); mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData);
}
void FormatMenuTable::InitMenu(Menu *pMenu)
{
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
auto formatId = IdOfFormat(pTrack->GetSampleFormat()); auto formatId = IdOfFormat(pTrack->GetSampleFormat());
SetMenuChecks(*pMenu, [=](int id){ return id == formatId; }); SetMenuChecks(*pMenu, [=](int id){ return id == formatId; });
@ -363,7 +373,8 @@ public:
static RateMenuTable &Instance(); static RateMenuTable &Instance();
private: private:
void InitMenu(Menu *pMenu, void *pUserData) override; void InitUserData(void *pUserData) override;
void InitMenu(Menu *pMenu) override;
void DestroyMenu() override void DestroyMenu() override
{ {
@ -385,9 +396,13 @@ RateMenuTable &RateMenuTable::Instance()
return instance; return instance;
} }
void RateMenuTable::InitMenu(Menu *pMenu, void *pUserData) void RateMenuTable::InitUserData(void *pUserData)
{ {
mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData); mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData);
}
void RateMenuTable::InitMenu(Menu *pMenu)
{
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
const auto rateId = IdOfRate((int)pTrack->GetRate()); const auto rateId = IdOfRate((int)pTrack->GetRate());
SetMenuChecks(*pMenu, [=](int id){ return id == rateId; }); SetMenuChecks(*pMenu, [=](int id){ return id == rateId; });
@ -557,7 +572,8 @@ public:
protected: protected:
WaveTrackMenuTable() : mpData(NULL) {mpTrack=NULL;} 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 void DestroyMenu() override
{ {
@ -597,9 +613,13 @@ WaveTrackMenuTable &WaveTrackMenuTable::Instance( Track * pTrack )
return instance; return instance;
} }
void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData) void WaveTrackMenuTable::InitUserData(void *pUserData)
{ {
mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData); mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData);
}
void WaveTrackMenuTable::InitMenu(Menu *pMenu)
{
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
std::vector<int> checkedIds; std::vector<int> checkedIds;
@ -637,7 +657,6 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData)
if ( isMono ) if ( isMono )
{ {
mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData);
WaveTrack *const pTrack2 = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack2 = static_cast<WaveTrack*>(mpData->pTrack);
auto next = * ++ tracks.Find(pTrack2); auto next = * ++ tracks.Find(pTrack2);

View File

@ -34,7 +34,7 @@ bool WaveTrackVZoomHandle::IsDragZooming(int zoomStart, int zoomEnd)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Table class // Table class
void WaveTrackVRulerMenuTable::InitMenu(Menu *, void *pUserData) void WaveTrackVRulerMenuTable::InitUserData(void *pUserData)
{ {
mpData = static_cast<InitMenuData*>(pUserData); mpData = static_cast<InitMenuData*>(pUserData);
} }

View File

@ -69,7 +69,7 @@ public:
protected: protected:
WaveTrackVRulerMenuTable() {} WaveTrackVRulerMenuTable() {}
void InitMenu(Menu *pMenu, void *pUserData) override; void InitUserData(void *pUserData) override;
private: private:
void DestroyMenu() override void DestroyMenu() override

View File

@ -266,9 +266,9 @@ PopupMenuTable &WaveformVRulerMenuTable::Instance()
return 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. // DB setting is already on track drop down.
WaveTrack *const wt = mpData->pTrack; WaveTrack *const wt = mpData->pTrack;

View File

@ -83,7 +83,7 @@ public:
static PopupMenuTable &Instance(); static PopupMenuTable &Instance();
private: private:
virtual void InitMenu(Menu *pMenu, void *pUserData) override; virtual void InitMenu(Menu *pMenu) override;
void OnWaveformScaleType(wxCommandEvent &evt); void OnWaveformScaleType(wxCommandEvent &evt);
}; };

View File

@ -47,9 +47,13 @@ public:
static TimeTrackMenuTable &Instance(); static TimeTrackMenuTable &Instance();
private: private:
void InitMenu(Menu *pMenu, void *pUserData) override void InitUserData(void *pUserData) override
{ {
mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData); mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData);
}
void InitMenu(Menu *pMenu) override
{
TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack); TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack);
pMenu->Check(OnTimeTrackLogIntID, pTrack->GetInterpolateLog()); pMenu->Check(OnTimeTrackLogIntID, pTrack->GetInterpolateLog());

View File

@ -90,7 +90,8 @@ private:
void OnSetName(wxCommandEvent &); void OnSetName(wxCommandEvent &);
void OnMoveTrack(wxCommandEvent &event); void OnMoveTrack(wxCommandEvent &event);
void InitMenu(Menu *pMenu, void *pUserData) override; void InitUserData(void *pUserData) override;
void InitMenu(Menu *pMenu) override;
void DestroyMenu() override void DestroyMenu() override
{ {
@ -106,9 +107,13 @@ TrackMenuTable &TrackMenuTable::Instance()
return instance; return instance;
} }
void TrackMenuTable::InitMenu(Menu *pMenu, void *pUserData) void TrackMenuTable::InitUserData(void *pUserData)
{ {
mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData); mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData);
}
void TrackMenuTable::InitMenu(Menu *pMenu)
{
Track *const pTrack = mpData->pTrack; Track *const pTrack = mpData->pTrack;
const auto &tracks = TrackList::Get( *GetActiveProject() ); const auto &tracks = TrackList::Get( *GetActiveProject() );

View File

@ -28,7 +28,7 @@ class CommonTrackControls /* not final */ : public TrackControls
public: public:
using TrackControls::TrackControls; 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: // objects returned by GetMenuExtension:
struct InitMenuData struct InitMenuData
{ {

View File

@ -20,6 +20,8 @@ PopupMenuTable::Menu::~Menu()
void PopupMenuTable::Menu::Extend(PopupMenuTable *pTable) void PopupMenuTable::Menu::Extend(PopupMenuTable *pTable)
{ {
pTable->InitUserData(pUserData);
auto connect = [&]( const PopupMenuTable::Entry *pEntry ) { auto connect = [&]( const PopupMenuTable::Entry *pEntry ) {
this->pParent->Bind this->pParent->Bind
(wxEVT_COMMAND_MENU_SELECTED, (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) void PopupMenuTable::Menu::DisconnectTable(PopupMenuTable *pTable)
@ -85,6 +87,10 @@ void PopupMenuTable::Menu::Disconnect()
DisconnectTable(pTable); DisconnectTable(pTable);
} }
void PopupMenuTable::InitMenu(Menu *)
{
}
// static // static
std::unique_ptr<PopupMenuTable::Menu> PopupMenuTable::BuildMenu std::unique_ptr<PopupMenuTable::Menu> PopupMenuTable::BuildMenu
( wxEvtHandler *pParent, PopupMenuTable *pTable, void *pUserData ) ( wxEvtHandler *pParent, PopupMenuTable *pTable, void *pUserData )

View File

@ -79,14 +79,19 @@ public:
void *pUserData; 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. // Called when the menu is about to pop up.
// Your chance to enable and disable items. // 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. // Called when menu is destroyed.
virtual void DestroyMenu() = 0; 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. // No memory management responsibility is assumed by this function.
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);
@ -101,14 +106,19 @@ In class MyTable (maybe in the private section),
which inherits from PopupMenuTable, which inherits from PopupMenuTable,
DECLARE_POPUP_MENU(MyTable); DECLARE_POPUP_MENU(MyTable);
virtual void InitMenu(Menu *pMenu, void *pUserData); virtual void InitUserData(void *pUserData);
virtual void InitMenu(Menu *pMenu);
virtual void DestroyMenu(); virtual void DestroyMenu();
Then in MyTable.cpp, Then in MyTable.cpp,
void MyTable::InitMenu(Menu *pMenu, void *pUserData) void MyTable::InitUserData(void *pUserData)
{ {
auto pData = static_cast<MyData*>(pUserData); auto pData = static_cast<MyData*>(pUserData);
}
void MyTable::InitMenu(Menu *pMenu)
{
// Remember pData, enable or disable menu items // Remember pData, enable or disable menu items
} }