diff --git a/src/AdornedRulerPanel.cpp b/src/AdornedRulerPanel.cpp index ecc33cad9..8338568b6 100644 --- a/src/AdornedRulerPanel.cpp +++ b/src/AdornedRulerPanel.cpp @@ -430,7 +430,7 @@ public: unsigned DoContextMenu (const wxRect &rect, - wxWindow *pParent, wxPoint *pPosition) final override + wxWindow *pParent, wxPoint *pPosition, AudacityProject*) final override { (void)pParent;// Compiler food (void)rect;// Compiler food diff --git a/src/CellularPanel.cpp b/src/CellularPanel.cpp index 8191820c7..17ba3859f 100644 --- a/src/CellularPanel.cpp +++ b/src/CellularPanel.cpp @@ -877,7 +877,7 @@ void CellularPanel::DoContextMenu( TrackPanelCell *pCell ) auto rect = FindRect( *delegate ); const UIHandle::Result refreshResult = - delegate->DoContextMenu(rect, this, NULL); + delegate->DoContextMenu(rect, this, nullptr, GetProject()); // To do: use safer shared_ptr to pCell ProcessUIHandleResult(pCell, pCell, refreshResult); diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 411389281..10702ca8a 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -1597,7 +1597,7 @@ unsigned TrackPanelCell::HandleWheelRotation } unsigned TrackPanelCell::DoContextMenu - (const wxRect &, wxWindow*, wxPoint *) + (const wxRect &, wxWindow*, wxPoint *, AudacityProject*) { return RefreshCode::RefreshNone; } diff --git a/src/TrackPanelCell.h b/src/TrackPanelCell.h index 4deec8e64..46540cbc8 100644 --- a/src/TrackPanelCell.h +++ b/src/TrackPanelCell.h @@ -109,7 +109,7 @@ public: // Default implementation does nothing virtual unsigned DoContextMenu (const wxRect &rect, - wxWindow *pParent, wxPoint *pPosition); + wxWindow *pParent, wxPoint *pPosition, AudacityProject *pProject); // Return value is a bitwise OR of RefreshCode values // Default skips the event and does nothing diff --git a/src/tracks/labeltrack/ui/LabelTrackControls.cpp b/src/tracks/labeltrack/ui/LabelTrackControls.cpp index a99c39851..da525e24b 100644 --- a/src/tracks/labeltrack/ui/LabelTrackControls.cpp +++ b/src/tracks/labeltrack/ui/LabelTrackControls.cpp @@ -43,7 +43,7 @@ class LabelTrackMenuTable : public PopupMenuTable public: static LabelTrackMenuTable &Instance(); - void InitMenu(Menu*, void *pUserData) override + void InitUserData(void *pUserData) override { mpData = static_cast(pUserData); } diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp index 9acef78f0..86dd2d565 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackControls.cpp @@ -83,7 +83,7 @@ public: static NoteTrackMenuTable &Instance(); private: - void InitMenu(Menu*, void *pUserData) override + void InitUserData(void *pUserData) override { mpData = static_cast(pUserData); } @@ -120,7 +120,7 @@ void NoteTrackMenuTable::OnChangeOctave(wxCommandEvent &event) const bool bDown = (OnDownOctaveID == event.GetId()); pTrack->ShiftNoteRange((bDown) ? -12 : 12); - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; ProjectHistory::Get( *project ) .ModifyState(false); mpData->result = RefreshCode::RefreshAll; diff --git a/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp b/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp index c8bcf5ddb..321094907 100644 --- a/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp +++ b/src/tracks/playabletrack/notetrack/ui/NoteTrackVZoomHandle.cpp @@ -35,6 +35,7 @@ namespace struct InitMenuData { public: + AudacityProject &project; NoteTrack *pTrack; wxRect rect; unsigned result; @@ -209,7 +210,7 @@ private: mpData = nullptr; } - virtual void InitMenu(Menu *pMenu, void *pUserData) override; + void InitUserData(void *pUserData) override; }; NoteTrackVRulerMenuTable &NoteTrackVRulerMenuTable::Instance() @@ -218,7 +219,7 @@ NoteTrackVRulerMenuTable &NoteTrackVRulerMenuTable::Instance() return instance; } -void NoteTrackVRulerMenuTable::InitMenu(Menu *WXUNUSED(pMenu), void *pUserData) +void NoteTrackVRulerMenuTable::InitUserData(void *pUserData) { mpData = static_cast(pUserData); } @@ -244,7 +245,8 @@ void NoteTrackVRulerMenuTable::OnZoom( int iZoomCode ){ mpData->pTrack->ShiftNoteRange(-12); break; } - ProjectHistory::Get( *GetActiveProject() ).ModifyState(false); + AudacityProject *const project = &mpData->project; + ProjectHistory::Get( *project ).ModifyState(false); using namespace RefreshCode; mpData->result = UpdateVRuler | RefreshAll; } @@ -290,7 +292,7 @@ UIHandle::Result NoteTrackVZoomHandle::Release !(event.ShiftDown() || event.CmdDown())) { InitMenuData data { - pTrack.get(), mRect, RefreshCode::RefreshNone, event.m_y + *pProject, pTrack.get(), mRect, RefreshNone, event.m_y }; PopupMenuTable *const pTable = diff --git a/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.cpp b/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.cpp index f417343c4..113b5d740 100644 --- a/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.cpp @@ -265,9 +265,9 @@ PopupMenuTable &SpectrumVRulerMenuTable::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; const int id = @@ -292,8 +292,6 @@ POPUP_MENU_SEPARATOR() POPUP_MENU_ITEM(OnZoomOutVerticalID, XO("Zoom Out\tShift-Left-Click"), OnZoomOutVertical) END_POPUP_MENU() -#include "../../../../Project.h" // for GetActiveProject - void SpectrumVRulerMenuTable::OnSpectrumScaleType(wxCommandEvent &evt) { WaveTrack *const wt = mpData->pTrack; @@ -308,7 +306,7 @@ void SpectrumVRulerMenuTable::OnSpectrumScaleType(wxCommandEvent &evt) for (auto channel : TrackList::Channels(wt)) channel->GetIndependentSpectrogramSettings().scaleType = newScaleType; - ProjectHistory::Get( *::GetActiveProject() ).ModifyState(true); + ProjectHistory::Get( mpData->project ).ModifyState(true); using namespace RefreshCode; mpData->result = UpdateVRuler | RefreshAll; diff --git a/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.h b/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.h index 310c7fe7d..1fbf566f8 100644 --- a/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.h +++ b/src/tracks/playabletrack/wavetrack/ui/SpectrumVZoomHandle.h @@ -83,7 +83,7 @@ public: static PopupMenuTable &Instance(); private: - void InitMenu(Menu *pMenu, void *pUserData) override; + void InitMenu(Menu *pMenu) override; void OnSpectrumScaleType(wxCommandEvent &evt); }; diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp index 1a2fa48dc..88a4cda04 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackControls.cpp @@ -155,7 +155,8 @@ public: static WaveColorMenuTable &Instance(); private: - void InitMenu(Menu *pMenu, void *pUserData) override; + void InitUserData(void *pUserData) override; + void InitMenu(Menu *pMenu) override; void DestroyMenu() override { @@ -174,14 +175,18 @@ WaveColorMenuTable &WaveColorMenuTable::Instance() return instance; } -void WaveColorMenuTable::InitMenu(Menu *pMenu, void *pUserData) +void WaveColorMenuTable::InitUserData(void *pUserData) { mpData = static_cast(pUserData); +} + +void WaveColorMenuTable::InitMenu(Menu *pMenu) +{ WaveTrack *const pTrack = static_cast(mpData->pTrack); auto WaveColorId = IdOfWaveColor( pTrack->GetWaveColorIndex()); SetMenuChecks(*pMenu, [=](int id){ return id == WaveColorId; }); - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; bool unsafe = ProjectAudioIO::Get( *project ).IsAudioActive(); for (int i = OnInstrument1ID; i <= OnInstrument4ID; i++) { pMenu->Enable(i, !unsafe); @@ -219,7 +224,7 @@ void WaveColorMenuTable::OnWaveColorChange(wxCommandEvent & event) int newWaveColor = id - OnInstrument1ID; - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; for (auto channel : TrackList::Channels(pTrack)) channel->SetWaveColorIndex(newWaveColor); @@ -247,7 +252,8 @@ public: static FormatMenuTable &Instance(); private: - void InitMenu(Menu *pMenu, void *pUserData) override; + void InitUserData(void *pUserData) override; + void InitMenu(Menu *pMenu) override; void DestroyMenu() override { @@ -267,14 +273,18 @@ FormatMenuTable &FormatMenuTable::Instance() return instance; } -void FormatMenuTable::InitMenu(Menu *pMenu, void *pUserData) +void FormatMenuTable::InitUserData(void *pUserData) { mpData = static_cast(pUserData); +} + +void FormatMenuTable::InitMenu(Menu *pMenu) +{ WaveTrack *const pTrack = static_cast(mpData->pTrack); auto formatId = IdOfFormat(pTrack->GetSampleFormat()); SetMenuChecks(*pMenu, [=](int id){ return id == formatId; }); - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; bool unsafe = ProjectAudioIO::Get( *project ).IsAudioActive(); for (int i = On16BitID; i <= OnFloatID; i++) { pMenu->Enable(i, !unsafe); @@ -336,7 +346,7 @@ void FormatMenuTable::OnFormatChange(wxCommandEvent & event) if (newFormat == pTrack->GetSampleFormat()) return; // Nothing to do. - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; for (auto channel : TrackList::Channels(pTrack)) channel->ConvertToSampleFormat(newFormat); @@ -363,7 +373,8 @@ public: static RateMenuTable &Instance(); private: - void InitMenu(Menu *pMenu, void *pUserData) override; + void InitUserData(void *pUserData) override; + void InitMenu(Menu *pMenu) override; void DestroyMenu() override { @@ -385,14 +396,18 @@ RateMenuTable &RateMenuTable::Instance() return instance; } -void RateMenuTable::InitMenu(Menu *pMenu, void *pUserData) +void RateMenuTable::InitUserData(void *pUserData) { mpData = static_cast(pUserData); +} + +void RateMenuTable::InitMenu(Menu *pMenu) +{ WaveTrack *const pTrack = static_cast(mpData->pTrack); const auto rateId = IdOfRate((int)pTrack->GetRate()); SetMenuChecks(*pMenu, [=](int id){ return id == rateId; }); - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; bool unsafe = ProjectAudioIO::Get( *project ).IsAudioActive(); for (int i = OnRate8ID; i <= OnRateOtherID; i++) { pMenu->Enable(i, !unsafe); @@ -439,7 +454,7 @@ int RateMenuTable::IdOfRate(int rate) /// another track, that one as well. void RateMenuTable::SetRate(WaveTrack * pTrack, double rate) { - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; for (auto channel : TrackList::Channels(pTrack)) channel->SetRate(rate); @@ -557,7 +572,8 @@ public: protected: 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 { @@ -597,9 +613,13 @@ WaveTrackMenuTable &WaveTrackMenuTable::Instance( Track * pTrack ) return instance; } -void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData) +void WaveTrackMenuTable::InitUserData(void *pUserData) { mpData = static_cast(pUserData); +} + +void WaveTrackMenuTable::InitMenu(Menu *pMenu) +{ WaveTrack *const pTrack = static_cast(mpData->pTrack); std::vector checkedIds; @@ -625,7 +645,7 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData) .contains( WaveTrackViewConstants::Spectrum ); pMenu->Enable(OnSpectrogramSettingsID, hasSpectrum && !bAudioBusy); - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; auto &tracks = TrackList::Get( *project ); bool unsafe = RealtimeEffectManager::Get().RealtimeIsActive() && ProjectAudioIO::Get( *project ).IsAudioActive(); @@ -637,7 +657,6 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData) if ( isMono ) { - mpData = static_cast(pUserData); WaveTrack *const pTrack2 = static_cast(mpData->pTrack); auto next = * ++ tracks.Find(pTrack2); @@ -795,7 +814,7 @@ void WaveTrackMenuTable::OnSetDisplay(wxCommandEvent & event) .SetDisplay(WaveTrackView::WaveTrackDisplay(id)); } - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; ProjectHistory::Get( *project ).ModifyState(true); using namespace RefreshCode; @@ -854,7 +873,7 @@ void WaveTrackMenuTable::OnSpectrogramSettings(wxCommandEvent &) if (0 != dialog.ShowModal()) { // Redraw - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; ProjectHistory::Get( *project ).ModifyState(true); //Bug 1725 Toolbar was left greyed out. //This solution is overkill, but does fix the problem and is what the @@ -889,7 +908,7 @@ void WaveTrackMenuTable::OnChannelChange(wxCommandEvent & event) break; } 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) */ ProjectHistory::Get( *project ) .PushState( @@ -902,7 +921,7 @@ void WaveTrackMenuTable::OnChannelChange(wxCommandEvent & event) /// Merge two tracks into one stereo track ?? void WaveTrackMenuTable::OnMergeStereo(wxCommandEvent &) { - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; auto &tracks = TrackList::Get( *project ); WaveTrack *const pTrack = static_cast(mpData->pTrack); @@ -964,7 +983,7 @@ void WaveTrackMenuTable::SplitStereo(bool stereo) { WaveTrack *const pTrack = static_cast(mpData->pTrack); wxASSERT(pTrack); - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; auto channels = TrackList::Channels( pTrack ); int totalHeight = 0; @@ -998,7 +1017,7 @@ void WaveTrackMenuTable::SplitStereo(bool stereo) /// Swap the left and right channels of a stero track... void WaveTrackMenuTable::OnSwapChannels(wxCommandEvent &) { - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; WaveTrack *const pTrack = static_cast(mpData->pTrack); auto channels = TrackList::Channels( pTrack ); @@ -1033,7 +1052,7 @@ void WaveTrackMenuTable::OnSplitStereo(wxCommandEvent &) { SplitStereo(true); WaveTrack *const pTrack = static_cast(mpData->pTrack); - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; /* i18n-hint: The string names a track */ ProjectHistory::Get( *project ).PushState( XO("Split stereo track '%s'").Format( pTrack->GetName() ), @@ -1048,7 +1067,7 @@ void WaveTrackMenuTable::OnSplitStereoMono(wxCommandEvent &) { SplitStereo(false); WaveTrack *const pTrack = static_cast(mpData->pTrack); - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; /* i18n-hint: The string names a track */ ProjectHistory::Get( *project ).PushState( XO("Split Stereo to Mono '%s'").Format( pTrack->GetName() ), diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.cpp index 0b7084552..4d3ec4f61 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.cpp @@ -34,7 +34,7 @@ bool WaveTrackVZoomHandle::IsDragZooming(int zoomStart, int zoomEnd) /////////////////////////////////////////////////////////////////////////////// // Table class -void WaveTrackVRulerMenuTable::InitMenu(Menu *, void *pUserData) +void WaveTrackVRulerMenuTable::InitUserData(void *pUserData) { mpData = static_cast(pUserData); } @@ -44,7 +44,7 @@ void WaveTrackVRulerMenuTable::OnZoom( WaveTrackViewConstants::ZoomActions iZoomCode ) { mpData->doZoom( - ::GetActiveProject(), mpData->pTrack, + &mpData->project, mpData->pTrack, iZoomCode, mpData->rect, mpData->yy, mpData->yy, false ); @@ -115,6 +115,7 @@ UIHandle::Result WaveTrackVZoomHandle::DoRelease( !(event.ShiftDown() || event.CmdDown())) { WaveTrackVRulerMenuTable::InitMenuData data { + *pProject, pTrack, rect, RefreshCode::RefreshNone, event.m_y, doZoom }; std::unique_ptr diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.h b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.h index 6ad50bd50..c6e72e6a3 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.h +++ b/src/tracks/playabletrack/wavetrack/ui/WaveTrackVZoomHandle.h @@ -59,6 +59,7 @@ public: struct InitMenuData { public: + AudacityProject &project; WaveTrack *pTrack; wxRect rect; unsigned result; @@ -69,7 +70,7 @@ public: protected: WaveTrackVRulerMenuTable() {} - void InitMenu(Menu *pMenu, void *pUserData) override; + void InitUserData(void *pUserData) override; private: void DestroyMenu() override diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.cpp b/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.cpp index 6be94f7e0..7ac1ae2cf 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.cpp +++ b/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.cpp @@ -266,9 +266,9 @@ PopupMenuTable &WaveformVRulerMenuTable::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. WaveTrack *const wt = mpData->pTrack; @@ -304,8 +304,6 @@ BEGIN_POPUP_MENU(WaveformVRulerMenuTable) END_POPUP_MENU() -#include "../../../../Project.h" // for GetActiveProject - void WaveformVRulerMenuTable::OnWaveformScaleType(wxCommandEvent &evt) { WaveTrack *const wt = mpData->pTrack; @@ -322,7 +320,8 @@ void WaveformVRulerMenuTable::OnWaveformScaleType(wxCommandEvent &evt) channel->GetIndependentWaveformSettings().scaleType = newScaleType; } - ProjectHistory::Get( *::GetActiveProject() ).ModifyState(true); + AudacityProject *const project = &mpData->project; + ProjectHistory::Get( *project ).ModifyState(true); using namespace RefreshCode; mpData->result = UpdateVRuler | RefreshAll; diff --git a/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.h b/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.h index 81900093f..544910c87 100644 --- a/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.h +++ b/src/tracks/playabletrack/wavetrack/ui/WaveformVZoomHandle.h @@ -83,7 +83,7 @@ public: static PopupMenuTable &Instance(); private: - virtual void InitMenu(Menu *pMenu, void *pUserData) override; + virtual void InitMenu(Menu *pMenu) override; void OnWaveformScaleType(wxCommandEvent &evt); }; diff --git a/src/tracks/timetrack/ui/TimeTrackControls.cpp b/src/tracks/timetrack/ui/TimeTrackControls.cpp index 3293ea2a6..efb013241 100644 --- a/src/tracks/timetrack/ui/TimeTrackControls.cpp +++ b/src/tracks/timetrack/ui/TimeTrackControls.cpp @@ -47,9 +47,13 @@ public: static TimeTrackMenuTable &Instance(); private: - void InitMenu(Menu *pMenu, void *pUserData) override + void InitUserData(void *pUserData) override { mpData = static_cast(pUserData); + } + + void InitMenu(Menu *pMenu) override + { TimeTrack *const pTrack = static_cast(mpData->pTrack); pMenu->Check(OnTimeTrackLogIntID, pTrack->GetInterpolateLog()); @@ -102,7 +106,7 @@ void TimeTrackMenuTable::OnSetTimeTrackRange(wxCommandEvent & /*event*/) 1000); if (lower >= 10 && upper <= 1000 && lower < upper) { - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; pTrack->SetRangeLower((double)lower / 100.0); pTrack->SetRangeUpper((double)upper / 100.0); ProjectHistory::Get( *project ) @@ -118,7 +122,7 @@ void TimeTrackMenuTable::OnTimeTrackLin(wxCommandEvent & /*event*/) { TimeTrack *const pTrack = static_cast(mpData->pTrack); pTrack->SetDisplayLog(false); - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; ProjectHistory::Get( *project ) .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(mpData->pTrack); pTrack->SetDisplayLog(true); - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; ProjectHistory::Get( *project ) .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*/) { TimeTrack *const pTrack = static_cast(mpData->pTrack); - AudacityProject *const project = ::GetActiveProject(); + AudacityProject *const project = &mpData->project; if (pTrack->GetInterpolateLog()) { pTrack->SetInterpolateLog(false); ProjectHistory::Get( *project ) diff --git a/src/tracks/ui/CommonTrackControls.cpp b/src/tracks/ui/CommonTrackControls.cpp index 6ed7af9b6..5994ae4b9 100644 --- a/src/tracks/ui/CommonTrackControls.cpp +++ b/src/tracks/ui/CommonTrackControls.cpp @@ -90,7 +90,8 @@ private: void OnSetName(wxCommandEvent &); void OnMoveTrack(wxCommandEvent &event); - void InitMenu(Menu *pMenu, void *pUserData) override; + void InitUserData(void *pUserData) override; + void InitMenu(Menu *pMenu) override; void DestroyMenu() override { @@ -106,12 +107,16 @@ TrackMenuTable &TrackMenuTable::Instance() return instance; } -void TrackMenuTable::InitMenu(Menu *pMenu, void *pUserData) +void TrackMenuTable::InitUserData(void *pUserData) { mpData = static_cast(pUserData); +} + +void TrackMenuTable::InitMenu(Menu *pMenu) +{ 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(OnMoveDownID, tracks.CanMoveDown(pTrack)); @@ -129,7 +134,7 @@ BEGIN_POPUP_MENU(TrackMenuTable) OnMoveUpID, XO("Move Track &Up").Join( Verbatim( - CommandManager::Get( *GetActiveProject() ). + CommandManager::Get( mpData->project ). // using GET to compose menu item name for wxWidgets GetKeyFromName(wxT("TrackMoveUp")).GET() ), wxT("\t") @@ -139,7 +144,7 @@ BEGIN_POPUP_MENU(TrackMenuTable) OnMoveDownID, XO("Move Track &Down").Join( Verbatim( - CommandManager::Get( *GetActiveProject() ). + CommandManager::Get( mpData->project ). // using GET to compose menu item name for wxWidgets GetKeyFromName(wxT("TrackMoveDown")).GET() ), wxT("\t") @@ -149,7 +154,7 @@ BEGIN_POPUP_MENU(TrackMenuTable) OnMoveTopID, XO("Move Track to &Top").Join( Verbatim( - CommandManager::Get( *GetActiveProject() ). + CommandManager::Get( mpData->project ). // using GET to compose menu item name for wxWidgets GetKeyFromName(wxT("TrackMoveTop")).GET() ), wxT("\t") @@ -159,7 +164,7 @@ BEGIN_POPUP_MENU(TrackMenuTable) OnMoveBottomID, XO("Move Track to &Bottom").Join( Verbatim( - CommandManager::Get( *GetActiveProject() ). + CommandManager::Get( mpData->project ). // using GET to compose menu item name for wxWidgets GetKeyFromName(wxT("TrackMoveBottom")).GET() ), wxT("\t") @@ -209,7 +214,7 @@ void TrackMenuTable::OnSetName(wxCommandEvent &) Track *const pTrack = mpData->pTrack; if (pTrack) { - AudacityProject *const proj = ::GetActiveProject(); + AudacityProject *const proj = &mpData->project; const wxString oldName = pTrack->GetName(); SetTrackNameCommand Command; @@ -234,7 +239,7 @@ void TrackMenuTable::OnSetName(wxCommandEvent &) void TrackMenuTable::OnMoveTrack(wxCommandEvent &event) { - AudacityProject *const project = GetActiveProject(); + AudacityProject *const project = &mpData->project; TrackUtilities::MoveChoice choice; switch (event.GetId()) { default: @@ -256,17 +261,18 @@ void TrackMenuTable::OnMoveTrack(wxCommandEvent &event) mpData->result = RefreshCode::RefreshAll; } -unsigned CommonTrackControls::DoContextMenu - (const wxRect &rect, wxWindow *pParent, wxPoint *) +unsigned CommonTrackControls::DoContextMenu( + const wxRect &rect, wxWindow *pParent, wxPoint *, AudacityProject *pProject) { + using namespace RefreshCode; wxRect buttonRect; TrackInfo::GetTitleBarRect(rect, buttonRect); auto track = FindTrack(); 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(); auto pMenu = PopupMenuTable::BuildMenu(pParent, pTable, &data); diff --git a/src/tracks/ui/CommonTrackControls.h b/src/tracks/ui/CommonTrackControls.h index ce05975fc..c441f8474 100644 --- a/src/tracks/ui/CommonTrackControls.h +++ b/src/tracks/ui/CommonTrackControls.h @@ -28,11 +28,12 @@ class CommonTrackControls /* not final */ : public TrackControls public: 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: struct InitMenuData { public: + AudacityProject &project; Track *pTrack; wxWindow *pParent; unsigned result; @@ -53,7 +54,8 @@ protected: const AudacityProject *) override = 0; 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; // TrackPanelDrawable implementation diff --git a/src/widgets/PopupMenuTable.cpp b/src/widgets/PopupMenuTable.cpp index ef093b07b..454878b5a 100644 --- a/src/widgets/PopupMenuTable.cpp +++ b/src/widgets/PopupMenuTable.cpp @@ -20,6 +20,8 @@ PopupMenuTable::Menu::~Menu() void PopupMenuTable::Menu::Extend(PopupMenuTable *pTable) { + pTable->InitUserData(pUserData); + auto connect = [&]( const PopupMenuTable::Entry *pEntry ) { this->pParent->Bind (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) @@ -85,6 +87,10 @@ void PopupMenuTable::Menu::Disconnect() DisconnectTable(pTable); } +void PopupMenuTable::InitMenu(Menu *) +{ +} + // static std::unique_ptr PopupMenuTable::BuildMenu ( wxEvtHandler *pParent, PopupMenuTable *pTable, void *pUserData ) diff --git a/src/widgets/PopupMenuTable.h b/src/widgets/PopupMenuTable.h index 2c25e3520..9e3a98ef8 100644 --- a/src/widgets/PopupMenuTable.h +++ b/src/widgets/PopupMenuTable.h @@ -79,14 +79,19 @@ public: 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. // 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. 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. static std::unique_ptr BuildMenu (wxEvtHandler *pParent, PopupMenuTable *pTable, void *pUserData = NULL); @@ -101,14 +106,19 @@ In class MyTable (maybe in the private section), which inherits from PopupMenuTable, DECLARE_POPUP_MENU(MyTable); -virtual void InitMenu(Menu *pMenu, void *pUserData); +virtual void InitUserData(void *pUserData); +virtual void InitMenu(Menu *pMenu); virtual void DestroyMenu(); Then in MyTable.cpp, -void MyTable::InitMenu(Menu *pMenu, void *pUserData) +void MyTable::InitUserData(void *pUserData) { auto pData = static_cast(pUserData); +} + +void MyTable::InitMenu(Menu *pMenu) +{ // Remember pData, enable or disable menu items }