mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-29 14:48:39 +02:00
PopupMenuTable need not publicize its wxMenu subclass
This commit is contained in:
parent
9435e97fb8
commit
3517b900b1
@ -297,8 +297,7 @@ UIHandle::Result NoteTrackVZoomHandle::Release
|
||||
|
||||
PopupMenuTable *const pTable =
|
||||
(PopupMenuTable *) &NoteTrackVRulerMenuTable::Instance();
|
||||
std::unique_ptr<PopupMenuTable::Menu>
|
||||
pMenu(PopupMenuTable::BuildMenu(pParent, pTable, &data));
|
||||
auto pMenu = PopupMenuTable::BuildMenu(pParent, pTable, &data);
|
||||
|
||||
// Accelerators only if zooming enabled.
|
||||
if( !bVZoom )
|
||||
|
@ -265,7 +265,7 @@ PopupMenuTable &SpectrumVRulerMenuTable::Instance()
|
||||
return instance;
|
||||
}
|
||||
|
||||
void SpectrumVRulerMenuTable::InitMenu(Menu *pMenu)
|
||||
void SpectrumVRulerMenuTable::InitMenu(wxMenu *pMenu)
|
||||
{
|
||||
WaveTrackVRulerMenuTable::InitMenu(pMenu);
|
||||
|
||||
|
@ -83,7 +83,7 @@ public:
|
||||
static PopupMenuTable &Instance();
|
||||
|
||||
private:
|
||||
void InitMenu(Menu *pMenu) override;
|
||||
void InitMenu(wxMenu *pMenu) override;
|
||||
|
||||
void OnSpectrumScaleType(wxCommandEvent &evt);
|
||||
};
|
||||
|
@ -162,7 +162,7 @@ public:
|
||||
|
||||
private:
|
||||
void InitUserData(void *pUserData) override;
|
||||
void InitMenu(Menu *pMenu) override;
|
||||
void InitMenu(wxMenu *pMenu) override;
|
||||
|
||||
void DestroyMenu() override
|
||||
{
|
||||
@ -186,7 +186,7 @@ void WaveColorMenuTable::InitUserData(void *pUserData)
|
||||
mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData);
|
||||
}
|
||||
|
||||
void WaveColorMenuTable::InitMenu(Menu *pMenu)
|
||||
void WaveColorMenuTable::InitMenu(wxMenu *pMenu)
|
||||
{
|
||||
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
|
||||
auto WaveColorId = IdOfWaveColor( pTrack->GetWaveColorIndex());
|
||||
@ -261,7 +261,7 @@ public:
|
||||
|
||||
private:
|
||||
void InitUserData(void *pUserData) override;
|
||||
void InitMenu(Menu *pMenu) override;
|
||||
void InitMenu(wxMenu *pMenu) override;
|
||||
|
||||
void DestroyMenu() override
|
||||
{
|
||||
@ -286,7 +286,7 @@ void FormatMenuTable::InitUserData(void *pUserData)
|
||||
mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData);
|
||||
}
|
||||
|
||||
void FormatMenuTable::InitMenu(Menu *pMenu)
|
||||
void FormatMenuTable::InitMenu(wxMenu *pMenu)
|
||||
{
|
||||
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
|
||||
auto formatId = IdOfFormat(pTrack->GetSampleFormat());
|
||||
@ -384,7 +384,7 @@ public:
|
||||
|
||||
private:
|
||||
void InitUserData(void *pUserData) override;
|
||||
void InitMenu(Menu *pMenu) override;
|
||||
void InitMenu(wxMenu *pMenu) override;
|
||||
|
||||
void DestroyMenu() override
|
||||
{
|
||||
@ -411,7 +411,7 @@ void RateMenuTable::InitUserData(void *pUserData)
|
||||
mpData = static_cast<PlayableTrackControls::InitMenuData*>(pUserData);
|
||||
}
|
||||
|
||||
void RateMenuTable::InitMenu(Menu *pMenu)
|
||||
void RateMenuTable::InitMenu(wxMenu *pMenu)
|
||||
{
|
||||
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
|
||||
const auto rateId = IdOfRate((int)pTrack->GetRate());
|
||||
@ -583,7 +583,7 @@ protected:
|
||||
WaveTrackMenuTable() : mpData(NULL) {mpTrack=NULL;}
|
||||
|
||||
void InitUserData(void *pUserData) override;
|
||||
void InitMenu(Menu *pMenu) override;
|
||||
void InitMenu(wxMenu *pMenu) override;
|
||||
|
||||
void DestroyMenu() override
|
||||
{
|
||||
@ -637,7 +637,7 @@ static std::vector<WaveTrackSubViewType> AllTypes()
|
||||
return result;
|
||||
}
|
||||
|
||||
void WaveTrackMenuTable::InitMenu(Menu *pMenu)
|
||||
void WaveTrackMenuTable::InitMenu(wxMenu *pMenu)
|
||||
{
|
||||
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
|
||||
|
||||
|
@ -118,8 +118,7 @@ UIHandle::Result WaveTrackVZoomHandle::DoRelease(
|
||||
*pProject,
|
||||
pTrack, rect, RefreshCode::RefreshNone, event.m_y, doZoom };
|
||||
|
||||
std::unique_ptr<PopupMenuTable::Menu>
|
||||
pMenu(PopupMenuTable::BuildMenu(pParent, &table, &data));
|
||||
auto pMenu = PopupMenuTable::BuildMenu(pParent, &table, &data);
|
||||
|
||||
// Accelerators only if zooming enabled.
|
||||
if( !bVZoom )
|
||||
|
@ -266,7 +266,7 @@ PopupMenuTable &WaveformVRulerMenuTable::Instance()
|
||||
return instance;
|
||||
}
|
||||
|
||||
void WaveformVRulerMenuTable::InitMenu(Menu *pMenu)
|
||||
void WaveformVRulerMenuTable::InitMenu(wxMenu *pMenu)
|
||||
{
|
||||
WaveTrackVRulerMenuTable::InitMenu(pMenu);
|
||||
|
||||
|
@ -83,7 +83,7 @@ public:
|
||||
static PopupMenuTable &Instance();
|
||||
|
||||
private:
|
||||
virtual void InitMenu(Menu *pMenu) override;
|
||||
virtual void InitMenu(wxMenu *pMenu) override;
|
||||
|
||||
void OnWaveformScaleType(wxCommandEvent &evt);
|
||||
};
|
||||
|
@ -52,7 +52,7 @@ private:
|
||||
mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData);
|
||||
}
|
||||
|
||||
void InitMenu(Menu *pMenu) override
|
||||
void InitMenu(wxMenu *pMenu) override
|
||||
{
|
||||
TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack);
|
||||
|
||||
|
@ -91,7 +91,7 @@ private:
|
||||
void OnMoveTrack(wxCommandEvent &event);
|
||||
|
||||
void InitUserData(void *pUserData) override;
|
||||
void InitMenu(Menu *pMenu) override;
|
||||
void InitMenu(wxMenu *pMenu) override;
|
||||
|
||||
void DestroyMenu() override
|
||||
{
|
||||
@ -112,7 +112,7 @@ void TrackMenuTable::InitUserData(void *pUserData)
|
||||
mpData = static_cast<CommonTrackControls::InitMenuData*>(pUserData);
|
||||
}
|
||||
|
||||
void TrackMenuTable::InitMenu(Menu *pMenu)
|
||||
void TrackMenuTable::InitMenu(wxMenu *pMenu)
|
||||
{
|
||||
Track *const pTrack = mpData->pTrack;
|
||||
|
||||
@ -282,7 +282,7 @@ unsigned CommonTrackControls::DoContextMenu(
|
||||
|
||||
PopupMenuTable *const pExtension = GetMenuExtension(track.get());
|
||||
if (pExtension)
|
||||
pMenu->Extend(pExtension);
|
||||
PopupMenuTable::ExtendMenu( *pMenu, *pExtension );
|
||||
|
||||
pParent->PopupMenu
|
||||
(pMenu.get(), buttonRect.x + 1, buttonRect.y + buttonRect.height + 1);
|
||||
|
@ -11,14 +11,31 @@ Paul Licameli split from TrackPanel.cpp
|
||||
#include "../Audacity.h"
|
||||
#include "PopupMenuTable.h"
|
||||
|
||||
PopupMenuTable::Menu::~Menu()
|
||||
namespace {
|
||||
struct PopupMenu : public wxMenu
|
||||
{
|
||||
PopupMenu(wxEvtHandler *pParent_, void *pUserData_)
|
||||
: pParent{ pParent_ }, tables{}, pUserData{ pUserData_ } {}
|
||||
|
||||
~PopupMenu() override;
|
||||
|
||||
void Extend(PopupMenuTable *pTable);
|
||||
void DisconnectTable(PopupMenuTable *pTable);
|
||||
void Disconnect();
|
||||
|
||||
wxEvtHandler *pParent;
|
||||
std::vector<PopupMenuTable*> tables;
|
||||
void *pUserData;
|
||||
};
|
||||
|
||||
PopupMenu::~PopupMenu()
|
||||
{
|
||||
// Event connections between the parent window and the singleton table
|
||||
// object must be broken when this menu is destroyed.
|
||||
Disconnect();
|
||||
}
|
||||
|
||||
void PopupMenuTable::Menu::Extend(PopupMenuTable *pTable)
|
||||
void PopupMenu::Extend(PopupMenuTable *pTable)
|
||||
{
|
||||
pTable->InitUserData(pUserData);
|
||||
|
||||
@ -55,7 +72,8 @@ void PopupMenuTable::Menu::Extend(PopupMenuTable *pTable)
|
||||
case PopupMenuTable::Entry::SubMenu:
|
||||
{
|
||||
const auto subTable = pEntry->subTable;
|
||||
auto subMenu = BuildMenu( this->pParent, subTable, pUserData );
|
||||
auto subMenu =
|
||||
PopupMenuTable::BuildMenu( this->pParent, subTable, pUserData );
|
||||
this->AppendSubMenu(
|
||||
subMenu.release(), subTable->Caption().Translation());
|
||||
}
|
||||
@ -68,7 +86,7 @@ void PopupMenuTable::Menu::Extend(PopupMenuTable *pTable)
|
||||
tables.push_back( pTable );
|
||||
}
|
||||
|
||||
void PopupMenuTable::Menu::DisconnectTable(PopupMenuTable *pTable)
|
||||
void PopupMenu::DisconnectTable(PopupMenuTable *pTable)
|
||||
{
|
||||
for (const PopupMenuTable::Entry *pEntry = &*pTable->Get().begin();
|
||||
pEntry->IsValid(); ++pEntry) {
|
||||
@ -83,22 +101,28 @@ void PopupMenuTable::Menu::DisconnectTable(PopupMenuTable *pTable)
|
||||
pTable->DestroyMenu();
|
||||
}
|
||||
|
||||
void PopupMenuTable::Menu::Disconnect()
|
||||
void PopupMenu::Disconnect()
|
||||
{
|
||||
for ( auto pTable : tables )
|
||||
DisconnectTable(pTable);
|
||||
}
|
||||
}
|
||||
|
||||
void PopupMenuTable::InitMenu(Menu *)
|
||||
void PopupMenuTable::InitMenu(wxMenu *)
|
||||
{
|
||||
}
|
||||
|
||||
// static
|
||||
std::unique_ptr<PopupMenuTable::Menu> PopupMenuTable::BuildMenu
|
||||
std::unique_ptr<wxMenu> PopupMenuTable::BuildMenu
|
||||
( wxEvtHandler *pParent, PopupMenuTable *pTable, void *pUserData )
|
||||
{
|
||||
// Rebuild as needed each time. That makes it safe in case of language change.
|
||||
std::unique_ptr<Menu> theMenu{ safenew Menu( pParent, pUserData ) };
|
||||
auto theMenu = std::make_unique<PopupMenu>( pParent, pUserData );
|
||||
theMenu->Extend(pTable);
|
||||
return theMenu;
|
||||
}
|
||||
|
||||
void PopupMenuTable::ExtendMenu( wxMenu &menu, PopupMenuTable &otherTable )
|
||||
{
|
||||
dynamic_cast<PopupMenu&>(menu).Extend(&otherTable);
|
||||
}
|
||||
|
@ -62,27 +62,6 @@ public:
|
||||
: mCaption{ caption }
|
||||
{}
|
||||
|
||||
class Menu
|
||||
: public wxMenu
|
||||
{
|
||||
friend class PopupMenuTable;
|
||||
|
||||
Menu(wxEvtHandler *pParent_, void *pUserData_)
|
||||
: pParent{ pParent_ }, tables{}, pUserData{ pUserData_ } {}
|
||||
|
||||
public:
|
||||
virtual ~Menu();
|
||||
|
||||
void Extend(PopupMenuTable *pTable);
|
||||
void DisconnectTable(PopupMenuTable *pTable);
|
||||
void Disconnect();
|
||||
|
||||
private:
|
||||
wxEvtHandler *pParent;
|
||||
std::vector<PopupMenuTable*> tables;
|
||||
void *pUserData;
|
||||
};
|
||||
|
||||
// Called before the menu items are appended.
|
||||
// Store user data, if needed.
|
||||
virtual void InitUserData(void *pUserData) = 0;
|
||||
@ -90,21 +69,21 @@ public:
|
||||
// Called when the menu is about to pop up.
|
||||
// Your chance to enable and disable items.
|
||||
// Default implementation does nothing.
|
||||
virtual void InitMenu(Menu *pMenu);
|
||||
virtual void InitMenu(wxMenu *pMenu);
|
||||
|
||||
// Called when menu is destroyed.
|
||||
virtual void DestroyMenu() = 0;
|
||||
|
||||
// Optional pUserData gets passed to the InitUserData routines of tables.
|
||||
// No memory management responsibility is assumed by this function.
|
||||
static std::unique_ptr<Menu> BuildMenu
|
||||
static std::unique_ptr<wxMenu> BuildMenu
|
||||
(wxEvtHandler *pParent, PopupMenuTable *pTable, void *pUserData = NULL);
|
||||
|
||||
const TranslatableString &Caption() const { return mCaption; }
|
||||
|
||||
protected:
|
||||
virtual void Populate() = 0;
|
||||
void Clear() { mContents.clear(); }
|
||||
// menu must have been built by BuildMenu
|
||||
// More items get added to the end of it
|
||||
static void ExtendMenu( wxMenu &menu, PopupMenuTable &otherTable );
|
||||
|
||||
using Entries = std::vector<PopupMenuTableEntry>;
|
||||
const Entries& Get()
|
||||
@ -114,6 +93,10 @@ protected:
|
||||
return mContents;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void Populate() = 0;
|
||||
void Clear() { mContents.clear(); }
|
||||
|
||||
Entries mContents;
|
||||
TranslatableString mCaption;
|
||||
};
|
||||
@ -128,7 +111,7 @@ which inherits from PopupMenuTable,
|
||||
|
||||
DECLARE_POPUP_MENU(MyTable);
|
||||
virtual void InitUserData(void *pUserData);
|
||||
virtual void InitMenu(Menu *pMenu);
|
||||
virtual void InitMenu(wxMenu *pMenu);
|
||||
virtual void DestroyMenu();
|
||||
|
||||
Then in MyTable.cpp,
|
||||
@ -139,7 +122,7 @@ void MyTable::InitUserData(void *pUserData)
|
||||
auto pData = static_cast<MyData*>(pUserData);
|
||||
}
|
||||
|
||||
void MyTable::InitMenu(Menu *pMenu)
|
||||
void MyTable::InitMenu(wxMenu *pMenu)
|
||||
{
|
||||
// enable or disable menu items
|
||||
}
|
||||
@ -168,7 +151,7 @@ auto pMenu = PopupMenuTable::BuildMenu(pParent, &myTable, &data);
|
||||
|
||||
// Optionally:
|
||||
OtherTable otherTable;
|
||||
pMenu->Extend(&otherTable);
|
||||
PopupMenuTable::ExtendMenu( *pMenu, otherTable );
|
||||
|
||||
pParent->PopupMenu(pMenu.get(), event.m_x, event.m_y);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user