1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-27 06:07:59 +02:00

Remove uses of GetActiveProject in popup menu handlers

This commit is contained in:
Paul Licameli 2020-01-01 22:10:25 -05:00
commit 1e3779c2f3
19 changed files with 123 additions and 75 deletions

View File

@ -430,7 +430,7 @@ public:
unsigned DoContextMenu unsigned DoContextMenu
(const wxRect &rect, (const wxRect &rect,
wxWindow *pParent, wxPoint *pPosition) final override wxWindow *pParent, wxPoint *pPosition, AudacityProject*) final override
{ {
(void)pParent;// Compiler food (void)pParent;// Compiler food
(void)rect;// Compiler food (void)rect;// Compiler food

View File

@ -877,7 +877,7 @@ void CellularPanel::DoContextMenu( TrackPanelCell *pCell )
auto rect = FindRect( *delegate ); auto rect = FindRect( *delegate );
const UIHandle::Result refreshResult = const UIHandle::Result refreshResult =
delegate->DoContextMenu(rect, this, NULL); delegate->DoContextMenu(rect, this, nullptr, GetProject());
// To do: use safer shared_ptr to pCell // To do: use safer shared_ptr to pCell
ProcessUIHandleResult(pCell, pCell, refreshResult); ProcessUIHandleResult(pCell, pCell, refreshResult);

View File

@ -1597,7 +1597,7 @@ unsigned TrackPanelCell::HandleWheelRotation
} }
unsigned TrackPanelCell::DoContextMenu unsigned TrackPanelCell::DoContextMenu
(const wxRect &, wxWindow*, wxPoint *) (const wxRect &, wxWindow*, wxPoint *, AudacityProject*)
{ {
return RefreshCode::RefreshNone; return RefreshCode::RefreshNone;
} }

View File

@ -109,7 +109,7 @@ public:
// Default implementation does nothing // Default implementation does nothing
virtual unsigned DoContextMenu virtual unsigned DoContextMenu
(const wxRect &rect, (const wxRect &rect,
wxWindow *pParent, wxPoint *pPosition); wxWindow *pParent, wxPoint *pPosition, AudacityProject *pProject);
// Return value is a bitwise OR of RefreshCode values // Return value is a bitwise OR of RefreshCode values
// Default skips the event and does nothing // Default skips the event and does nothing

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);
} }
@ -120,7 +120,7 @@ void NoteTrackMenuTable::OnChangeOctave(wxCommandEvent &event)
const bool bDown = (OnDownOctaveID == event.GetId()); const bool bDown = (OnDownOctaveID == event.GetId());
pTrack->ShiftNoteRange((bDown) ? -12 : 12); pTrack->ShiftNoteRange((bDown) ? -12 : 12);
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
ProjectHistory::Get( *project ) ProjectHistory::Get( *project )
.ModifyState(false); .ModifyState(false);
mpData->result = RefreshCode::RefreshAll; mpData->result = RefreshCode::RefreshAll;

View File

@ -35,6 +35,7 @@ namespace
struct InitMenuData struct InitMenuData
{ {
public: public:
AudacityProject &project;
NoteTrack *pTrack; NoteTrack *pTrack;
wxRect rect; wxRect rect;
unsigned result; unsigned result;
@ -209,7 +210,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 +219,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);
} }
@ -244,7 +245,8 @@ void NoteTrackVRulerMenuTable::OnZoom( int iZoomCode ){
mpData->pTrack->ShiftNoteRange(-12); mpData->pTrack->ShiftNoteRange(-12);
break; break;
} }
ProjectHistory::Get( *GetActiveProject() ).ModifyState(false); AudacityProject *const project = &mpData->project;
ProjectHistory::Get( *project ).ModifyState(false);
using namespace RefreshCode; using namespace RefreshCode;
mpData->result = UpdateVRuler | RefreshAll; mpData->result = UpdateVRuler | RefreshAll;
} }
@ -290,7 +292,7 @@ UIHandle::Result NoteTrackVZoomHandle::Release
!(event.ShiftDown() || event.CmdDown())) !(event.ShiftDown() || event.CmdDown()))
{ {
InitMenuData data { InitMenuData data {
pTrack.get(), mRect, RefreshCode::RefreshNone, event.m_y *pProject, pTrack.get(), mRect, RefreshNone, event.m_y
}; };
PopupMenuTable *const pTable = PopupMenuTable *const pTable =

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 =
@ -292,8 +292,6 @@ POPUP_MENU_SEPARATOR()
POPUP_MENU_ITEM(OnZoomOutVerticalID, XO("Zoom Out\tShift-Left-Click"), OnZoomOutVertical) POPUP_MENU_ITEM(OnZoomOutVerticalID, XO("Zoom Out\tShift-Left-Click"), OnZoomOutVertical)
END_POPUP_MENU() END_POPUP_MENU()
#include "../../../../Project.h" // for GetActiveProject
void SpectrumVRulerMenuTable::OnSpectrumScaleType(wxCommandEvent &evt) void SpectrumVRulerMenuTable::OnSpectrumScaleType(wxCommandEvent &evt)
{ {
WaveTrack *const wt = mpData->pTrack; WaveTrack *const wt = mpData->pTrack;
@ -308,7 +306,7 @@ void SpectrumVRulerMenuTable::OnSpectrumScaleType(wxCommandEvent &evt)
for (auto channel : TrackList::Channels(wt)) for (auto channel : TrackList::Channels(wt))
channel->GetIndependentSpectrogramSettings().scaleType = newScaleType; channel->GetIndependentSpectrogramSettings().scaleType = newScaleType;
ProjectHistory::Get( *::GetActiveProject() ).ModifyState(true); ProjectHistory::Get( mpData->project ).ModifyState(true);
using namespace RefreshCode; using namespace RefreshCode;
mpData->result = UpdateVRuler | RefreshAll; mpData->result = UpdateVRuler | RefreshAll;

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,14 +175,18 @@ 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; });
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
bool unsafe = ProjectAudioIO::Get( *project ).IsAudioActive(); bool unsafe = ProjectAudioIO::Get( *project ).IsAudioActive();
for (int i = OnInstrument1ID; i <= OnInstrument4ID; i++) { for (int i = OnInstrument1ID; i <= OnInstrument4ID; i++) {
pMenu->Enable(i, !unsafe); pMenu->Enable(i, !unsafe);
@ -219,7 +224,7 @@ void WaveColorMenuTable::OnWaveColorChange(wxCommandEvent & event)
int newWaveColor = id - OnInstrument1ID; int newWaveColor = id - OnInstrument1ID;
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
for (auto channel : TrackList::Channels(pTrack)) for (auto channel : TrackList::Channels(pTrack))
channel->SetWaveColorIndex(newWaveColor); channel->SetWaveColorIndex(newWaveColor);
@ -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,14 +273,18 @@ 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; });
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
bool unsafe = ProjectAudioIO::Get( *project ).IsAudioActive(); bool unsafe = ProjectAudioIO::Get( *project ).IsAudioActive();
for (int i = On16BitID; i <= OnFloatID; i++) { for (int i = On16BitID; i <= OnFloatID; i++) {
pMenu->Enable(i, !unsafe); pMenu->Enable(i, !unsafe);
@ -336,7 +346,7 @@ void FormatMenuTable::OnFormatChange(wxCommandEvent & event)
if (newFormat == pTrack->GetSampleFormat()) if (newFormat == pTrack->GetSampleFormat())
return; // Nothing to do. return; // Nothing to do.
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
for (auto channel : TrackList::Channels(pTrack)) for (auto channel : TrackList::Channels(pTrack))
channel->ConvertToSampleFormat(newFormat); channel->ConvertToSampleFormat(newFormat);
@ -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,14 +396,18 @@ 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; });
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
bool unsafe = ProjectAudioIO::Get( *project ).IsAudioActive(); bool unsafe = ProjectAudioIO::Get( *project ).IsAudioActive();
for (int i = OnRate8ID; i <= OnRateOtherID; i++) { for (int i = OnRate8ID; i <= OnRateOtherID; i++) {
pMenu->Enable(i, !unsafe); pMenu->Enable(i, !unsafe);
@ -439,7 +454,7 @@ int RateMenuTable::IdOfRate(int rate)
/// another track, that one as well. /// another track, that one as well.
void RateMenuTable::SetRate(WaveTrack * pTrack, double rate) void RateMenuTable::SetRate(WaveTrack * pTrack, double rate)
{ {
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
for (auto channel : TrackList::Channels(pTrack)) for (auto channel : TrackList::Channels(pTrack))
channel->SetRate(rate); channel->SetRate(rate);
@ -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;
@ -625,7 +645,7 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData)
.contains( WaveTrackViewConstants::Spectrum ); .contains( WaveTrackViewConstants::Spectrum );
pMenu->Enable(OnSpectrogramSettingsID, hasSpectrum && !bAudioBusy); pMenu->Enable(OnSpectrogramSettingsID, hasSpectrum && !bAudioBusy);
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
auto &tracks = TrackList::Get( *project ); auto &tracks = TrackList::Get( *project );
bool unsafe = RealtimeEffectManager::Get().RealtimeIsActive() && bool unsafe = RealtimeEffectManager::Get().RealtimeIsActive() &&
ProjectAudioIO::Get( *project ).IsAudioActive(); ProjectAudioIO::Get( *project ).IsAudioActive();
@ -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);
@ -795,7 +814,7 @@ void WaveTrackMenuTable::OnSetDisplay(wxCommandEvent & event)
.SetDisplay(WaveTrackView::WaveTrackDisplay(id)); .SetDisplay(WaveTrackView::WaveTrackDisplay(id));
} }
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
ProjectHistory::Get( *project ).ModifyState(true); ProjectHistory::Get( *project ).ModifyState(true);
using namespace RefreshCode; using namespace RefreshCode;
@ -854,7 +873,7 @@ void WaveTrackMenuTable::OnSpectrogramSettings(wxCommandEvent &)
if (0 != dialog.ShowModal()) { if (0 != dialog.ShowModal()) {
// Redraw // Redraw
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
ProjectHistory::Get( *project ).ModifyState(true); ProjectHistory::Get( *project ).ModifyState(true);
//Bug 1725 Toolbar was left greyed out. //Bug 1725 Toolbar was left greyed out.
//This solution is overkill, but does fix the problem and is what the //This solution is overkill, but does fix the problem and is what the
@ -889,7 +908,7 @@ void WaveTrackMenuTable::OnChannelChange(wxCommandEvent & event)
break; break;
} }
pTrack->SetChannel(channel); pTrack->SetChannel(channel);
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
/* i18n-hint: The strings name a track and a channel choice (mono, left, or right) */ /* i18n-hint: The strings name a track and a channel choice (mono, left, or right) */
ProjectHistory::Get( *project ) ProjectHistory::Get( *project )
.PushState( .PushState(
@ -902,7 +921,7 @@ void WaveTrackMenuTable::OnChannelChange(wxCommandEvent & event)
/// Merge two tracks into one stereo track ?? /// Merge two tracks into one stereo track ??
void WaveTrackMenuTable::OnMergeStereo(wxCommandEvent &) void WaveTrackMenuTable::OnMergeStereo(wxCommandEvent &)
{ {
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
auto &tracks = TrackList::Get( *project ); auto &tracks = TrackList::Get( *project );
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
@ -964,7 +983,7 @@ void WaveTrackMenuTable::SplitStereo(bool stereo)
{ {
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
wxASSERT(pTrack); wxASSERT(pTrack);
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
auto channels = TrackList::Channels( pTrack ); auto channels = TrackList::Channels( pTrack );
int totalHeight = 0; int totalHeight = 0;
@ -998,7 +1017,7 @@ void WaveTrackMenuTable::SplitStereo(bool stereo)
/// Swap the left and right channels of a stero track... /// Swap the left and right channels of a stero track...
void WaveTrackMenuTable::OnSwapChannels(wxCommandEvent &) void WaveTrackMenuTable::OnSwapChannels(wxCommandEvent &)
{ {
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
auto channels = TrackList::Channels( pTrack ); auto channels = TrackList::Channels( pTrack );
@ -1033,7 +1052,7 @@ void WaveTrackMenuTable::OnSplitStereo(wxCommandEvent &)
{ {
SplitStereo(true); SplitStereo(true);
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
/* i18n-hint: The string names a track */ /* i18n-hint: The string names a track */
ProjectHistory::Get( *project ).PushState( ProjectHistory::Get( *project ).PushState(
XO("Split stereo track '%s'").Format( pTrack->GetName() ), XO("Split stereo track '%s'").Format( pTrack->GetName() ),
@ -1048,7 +1067,7 @@ void WaveTrackMenuTable::OnSplitStereoMono(wxCommandEvent &)
{ {
SplitStereo(false); SplitStereo(false);
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack); WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
/* i18n-hint: The string names a track */ /* i18n-hint: The string names a track */
ProjectHistory::Get( *project ).PushState( ProjectHistory::Get( *project ).PushState(
XO("Split Stereo to Mono '%s'").Format( pTrack->GetName() ), XO("Split Stereo to Mono '%s'").Format( pTrack->GetName() ),

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);
} }
@ -44,7 +44,7 @@ void WaveTrackVRulerMenuTable::OnZoom(
WaveTrackViewConstants::ZoomActions iZoomCode ) WaveTrackViewConstants::ZoomActions iZoomCode )
{ {
mpData->doZoom( mpData->doZoom(
::GetActiveProject(), mpData->pTrack, &mpData->project, mpData->pTrack,
iZoomCode, mpData->rect, mpData->yy, mpData->yy, false iZoomCode, mpData->rect, mpData->yy, mpData->yy, false
); );
@ -115,6 +115,7 @@ UIHandle::Result WaveTrackVZoomHandle::DoRelease(
!(event.ShiftDown() || event.CmdDown())) !(event.ShiftDown() || event.CmdDown()))
{ {
WaveTrackVRulerMenuTable::InitMenuData data { WaveTrackVRulerMenuTable::InitMenuData data {
*pProject,
pTrack, rect, RefreshCode::RefreshNone, event.m_y, doZoom }; pTrack, rect, RefreshCode::RefreshNone, event.m_y, doZoom };
std::unique_ptr<PopupMenuTable::Menu> std::unique_ptr<PopupMenuTable::Menu>

View File

@ -59,6 +59,7 @@ public:
struct InitMenuData struct InitMenuData
{ {
public: public:
AudacityProject &project;
WaveTrack *pTrack; WaveTrack *pTrack;
wxRect rect; wxRect rect;
unsigned result; unsigned result;
@ -69,7 +70,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;
@ -304,8 +304,6 @@ BEGIN_POPUP_MENU(WaveformVRulerMenuTable)
END_POPUP_MENU() END_POPUP_MENU()
#include "../../../../Project.h" // for GetActiveProject
void WaveformVRulerMenuTable::OnWaveformScaleType(wxCommandEvent &evt) void WaveformVRulerMenuTable::OnWaveformScaleType(wxCommandEvent &evt)
{ {
WaveTrack *const wt = mpData->pTrack; WaveTrack *const wt = mpData->pTrack;
@ -322,7 +320,8 @@ void WaveformVRulerMenuTable::OnWaveformScaleType(wxCommandEvent &evt)
channel->GetIndependentWaveformSettings().scaleType = newScaleType; channel->GetIndependentWaveformSettings().scaleType = newScaleType;
} }
ProjectHistory::Get( *::GetActiveProject() ).ModifyState(true); AudacityProject *const project = &mpData->project;
ProjectHistory::Get( *project ).ModifyState(true);
using namespace RefreshCode; using namespace RefreshCode;
mpData->result = UpdateVRuler | RefreshAll; mpData->result = UpdateVRuler | RefreshAll;

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());
@ -102,7 +106,7 @@ void TimeTrackMenuTable::OnSetTimeTrackRange(wxCommandEvent & /*event*/)
1000); 1000);
if (lower >= 10 && upper <= 1000 && lower < upper) { if (lower >= 10 && upper <= 1000 && lower < upper) {
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
pTrack->SetRangeLower((double)lower / 100.0); pTrack->SetRangeLower((double)lower / 100.0);
pTrack->SetRangeUpper((double)upper / 100.0); pTrack->SetRangeUpper((double)upper / 100.0);
ProjectHistory::Get( *project ) ProjectHistory::Get( *project )
@ -118,7 +122,7 @@ void TimeTrackMenuTable::OnTimeTrackLin(wxCommandEvent & /*event*/)
{ {
TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack); TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack);
pTrack->SetDisplayLog(false); pTrack->SetDisplayLog(false);
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
ProjectHistory::Get( *project ) ProjectHistory::Get( *project )
.PushState(XO("Set time track display to linear"), XO("Set Display")); .PushState(XO("Set time track display to linear"), XO("Set Display"));
@ -130,7 +134,7 @@ void TimeTrackMenuTable::OnTimeTrackLog(wxCommandEvent & /*event*/)
{ {
TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack); TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack);
pTrack->SetDisplayLog(true); pTrack->SetDisplayLog(true);
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
ProjectHistory::Get( *project ) ProjectHistory::Get( *project )
.PushState(XO("Set time track display to logarithmic"), XO("Set Display")); .PushState(XO("Set time track display to logarithmic"), XO("Set Display"));
@ -141,7 +145,7 @@ void TimeTrackMenuTable::OnTimeTrackLog(wxCommandEvent & /*event*/)
void TimeTrackMenuTable::OnTimeTrackLogInt(wxCommandEvent & /*event*/) void TimeTrackMenuTable::OnTimeTrackLogInt(wxCommandEvent & /*event*/)
{ {
TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack); TimeTrack *const pTrack = static_cast<TimeTrack*>(mpData->pTrack);
AudacityProject *const project = ::GetActiveProject(); AudacityProject *const project = &mpData->project;
if (pTrack->GetInterpolateLog()) { if (pTrack->GetInterpolateLog()) {
pTrack->SetInterpolateLog(false); pTrack->SetInterpolateLog(false);
ProjectHistory::Get( *project ) ProjectHistory::Get( *project )

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,12 +107,16 @@ 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( mpData->project );
pMenu->Enable(OnMoveUpID, tracks.CanMoveUp(pTrack)); pMenu->Enable(OnMoveUpID, tracks.CanMoveUp(pTrack));
pMenu->Enable(OnMoveDownID, tracks.CanMoveDown(pTrack)); pMenu->Enable(OnMoveDownID, tracks.CanMoveDown(pTrack));
@ -129,7 +134,7 @@ BEGIN_POPUP_MENU(TrackMenuTable)
OnMoveUpID, OnMoveUpID,
XO("Move Track &Up").Join( XO("Move Track &Up").Join(
Verbatim( Verbatim(
CommandManager::Get( *GetActiveProject() ). CommandManager::Get( mpData->project ).
// using GET to compose menu item name for wxWidgets // using GET to compose menu item name for wxWidgets
GetKeyFromName(wxT("TrackMoveUp")).GET() ), GetKeyFromName(wxT("TrackMoveUp")).GET() ),
wxT("\t") wxT("\t")
@ -139,7 +144,7 @@ BEGIN_POPUP_MENU(TrackMenuTable)
OnMoveDownID, OnMoveDownID,
XO("Move Track &Down").Join( XO("Move Track &Down").Join(
Verbatim( Verbatim(
CommandManager::Get( *GetActiveProject() ). CommandManager::Get( mpData->project ).
// using GET to compose menu item name for wxWidgets // using GET to compose menu item name for wxWidgets
GetKeyFromName(wxT("TrackMoveDown")).GET() ), GetKeyFromName(wxT("TrackMoveDown")).GET() ),
wxT("\t") wxT("\t")
@ -149,7 +154,7 @@ BEGIN_POPUP_MENU(TrackMenuTable)
OnMoveTopID, OnMoveTopID,
XO("Move Track to &Top").Join( XO("Move Track to &Top").Join(
Verbatim( Verbatim(
CommandManager::Get( *GetActiveProject() ). CommandManager::Get( mpData->project ).
// using GET to compose menu item name for wxWidgets // using GET to compose menu item name for wxWidgets
GetKeyFromName(wxT("TrackMoveTop")).GET() ), GetKeyFromName(wxT("TrackMoveTop")).GET() ),
wxT("\t") wxT("\t")
@ -159,7 +164,7 @@ BEGIN_POPUP_MENU(TrackMenuTable)
OnMoveBottomID, OnMoveBottomID,
XO("Move Track to &Bottom").Join( XO("Move Track to &Bottom").Join(
Verbatim( Verbatim(
CommandManager::Get( *GetActiveProject() ). CommandManager::Get( mpData->project ).
// using GET to compose menu item name for wxWidgets // using GET to compose menu item name for wxWidgets
GetKeyFromName(wxT("TrackMoveBottom")).GET() ), GetKeyFromName(wxT("TrackMoveBottom")).GET() ),
wxT("\t") wxT("\t")
@ -209,7 +214,7 @@ void TrackMenuTable::OnSetName(wxCommandEvent &)
Track *const pTrack = mpData->pTrack; Track *const pTrack = mpData->pTrack;
if (pTrack) if (pTrack)
{ {
AudacityProject *const proj = ::GetActiveProject(); AudacityProject *const proj = &mpData->project;
const wxString oldName = pTrack->GetName(); const wxString oldName = pTrack->GetName();
SetTrackNameCommand Command; SetTrackNameCommand Command;
@ -234,7 +239,7 @@ void TrackMenuTable::OnSetName(wxCommandEvent &)
void TrackMenuTable::OnMoveTrack(wxCommandEvent &event) void TrackMenuTable::OnMoveTrack(wxCommandEvent &event)
{ {
AudacityProject *const project = GetActiveProject(); AudacityProject *const project = &mpData->project;
TrackUtilities::MoveChoice choice; TrackUtilities::MoveChoice choice;
switch (event.GetId()) { switch (event.GetId()) {
default: default:
@ -256,17 +261,18 @@ void TrackMenuTable::OnMoveTrack(wxCommandEvent &event)
mpData->result = RefreshCode::RefreshAll; mpData->result = RefreshCode::RefreshAll;
} }
unsigned CommonTrackControls::DoContextMenu unsigned CommonTrackControls::DoContextMenu(
(const wxRect &rect, wxWindow *pParent, wxPoint *) const wxRect &rect, wxWindow *pParent, wxPoint *, AudacityProject *pProject)
{ {
using namespace RefreshCode;
wxRect buttonRect; wxRect buttonRect;
TrackInfo::GetTitleBarRect(rect, buttonRect); TrackInfo::GetTitleBarRect(rect, buttonRect);
auto track = FindTrack(); auto track = FindTrack();
if (!track) if (!track)
return RefreshCode::RefreshNone; return RefreshNone;
InitMenuData data{ track.get(), pParent, RefreshCode::RefreshNone }; InitMenuData data{ *pProject, track.get(), pParent, RefreshNone };
const auto pTable = &TrackMenuTable::Instance(); const auto pTable = &TrackMenuTable::Instance();
auto pMenu = PopupMenuTable::BuildMenu(pParent, pTable, &data); auto pMenu = PopupMenuTable::BuildMenu(pParent, pTable, &data);

View File

@ -28,11 +28,12 @@ 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
{ {
public: public:
AudacityProject &project;
Track *pTrack; Track *pTrack;
wxWindow *pParent; wxWindow *pParent;
unsigned result; unsigned result;
@ -53,7 +54,8 @@ protected:
const AudacityProject *) override = 0; const AudacityProject *) override = 0;
unsigned DoContextMenu unsigned DoContextMenu
(const wxRect &rect, wxWindow *pParent, wxPoint *pPosition) override; (const wxRect &rect, wxWindow *pParent, wxPoint *pPosition,
AudacityProject *pProject) override;
virtual PopupMenuTable *GetMenuExtension(Track *pTrack) = 0; virtual PopupMenuTable *GetMenuExtension(Track *pTrack) = 0;
// TrackPanelDrawable implementation // TrackPanelDrawable implementation

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
} }