From 7f84e713247a7ad287b6160f4d78fc2bed03cbf8 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Tue, 26 Jun 2018 22:43:04 -0400 Subject: [PATCH] Context menu handling is also in CellularPanel --- src/Track.h | 4 ++++ src/TrackPanel.cpp | 30 ++++++++++++++++++++---------- src/TrackPanel.h | 5 +++-- src/TrackPanelCell.h | 4 ++++ 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/Track.h b/src/Track.h index f04220309..b56629b7a 100644 --- a/src/Track.h +++ b/src/Track.h @@ -165,6 +165,10 @@ class AUDACITY_DLL_API Track /* not final */ (const TrackPanelMouseState &, const AudacityProject *pProject) final override; + // Delegates the handling to the related TCP cell + std::shared_ptr ContextMenuDelegate() override + { return GetTrackControl(); } + public: // Rather override this for subclasses: diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 0d608344b..dc75ae388 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -263,6 +263,7 @@ BEGIN_EVENT_TABLE(CellularPanel, OverlayPanel) EVT_CHAR(CellularPanel::OnChar) EVT_SET_FOCUS(CellularPanel::OnSetFocus) EVT_KILL_FOCUS(CellularPanel::OnKillFocus) + EVT_CONTEXT_MENU(CellularPanel::OnContextMenu) END_EVENT_TABLE() BEGIN_EVENT_TABLE(TrackPanel, CellularPanel) @@ -270,7 +271,6 @@ BEGIN_EVENT_TABLE(TrackPanel, CellularPanel) EVT_KEY_DOWN(TrackPanel::OnKeyDown) EVT_PAINT(TrackPanel::OnPaint) - EVT_CONTEXT_MENU(TrackPanel::OnContextMenu) EVT_TIMER(wxID_ANY, TrackPanel::OnTimer) END_EVENT_TABLE() @@ -1167,9 +1167,9 @@ void TrackPanel::OnTrackListDeletion(wxCommandEvent & e) e.Skip(); } -void TrackPanel::OnContextMenu(wxContextMenuEvent & WXUNUSED(event)) +void CellularPanel::OnContextMenu(wxContextMenuEvent & WXUNUSED(event)) { - OnTrackMenu(); + DoContextMenu(); } struct TrackInfo::TCPLine { @@ -2625,17 +2625,27 @@ void TrackPanel::ScrollIntoView(int x) void TrackPanel::OnTrackMenu(Track *t) { - if(!t) { - t = GetFocusedTrack(); - if(!t) + CellularPanel::DoContextMenu( t ); +} + +void CellularPanel::DoContextMenu( TrackPanelCell *pCell ) +{ + if( !pCell ) { + pCell = GetFocusedCell(); + if( !pCell ) return; } - const auto pCell = t->GetTrackControl(); - const wxRect rect(FindTrackRect(t, true)); + const auto delegate = pCell->ContextMenuDelegate(); + if (!delegate) + return; + + auto rect = FindRect( *delegate ); const UIHandle::Result refreshResult = - pCell->DoContextMenu(rect, this, NULL); - ProcessUIHandleResult(t, t, refreshResult); + delegate->DoContextMenu(rect, this, NULL); + + // To do: use safer shared_ptr to pCell + ProcessUIHandleResult(pCell, pCell, refreshResult); } Track * TrackPanel::GetFirstSelectedTrack() diff --git a/src/TrackPanel.h b/src/TrackPanel.h index 78b264cae..6a3c00cff 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -305,6 +305,7 @@ protected: mTarget = 0; mMouseOverUpdateFlags = 0; } + void DoContextMenu( TrackPanelCell *pCell = nullptr ); private: bool HasRotation(); @@ -320,6 +321,8 @@ private: void OnSetFocus(wxFocusEvent & event); void OnKillFocus(wxFocusEvent & event); + void OnContextMenu(wxContextMenuEvent & event); + void HandleInterruptedDrag(); void Uncapture( wxMouseState *pState = nullptr ); bool HandleEscapeKey(bool down); @@ -383,8 +386,6 @@ class AUDACITY_DLL_API TrackPanel final : public CellularPanel { void OnMouseEvent(wxMouseEvent & event); void OnKeyDown(wxKeyEvent & event); - void OnContextMenu(wxContextMenuEvent & event); - void OnPlayback(wxCommandEvent &); void OnTrackListResizing(wxCommandEvent & event); void OnTrackListDeletion(wxCommandEvent & event); diff --git a/src/TrackPanelCell.h b/src/TrackPanelCell.h index c5bf1ddd1..23d3af107 100644 --- a/src/TrackPanelCell.h +++ b/src/TrackPanelCell.h @@ -56,6 +56,10 @@ public: (const TrackPanelMouseEvent &event, AudacityProject *pProject); + // A cell may delegate context menu handling to another one + virtual std::shared_ptr ContextMenuDelegate() + { return {}; } + // The pPosition parameter indicates mouse position but may be NULL // Return value is a bitwise OR of RefreshCode values // Default implementation does nothing