Context menu handling is also in CellularPanel

This commit is contained in:
Paul Licameli 2018-06-26 22:43:04 -04:00
parent c08c17eafa
commit 7f84e71324
4 changed files with 31 additions and 12 deletions

View File

@ -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<TrackPanelCell> ContextMenuDelegate() override
{ return GetTrackControl(); }
public:
// Rather override this for subclasses:

View File

@ -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()

View File

@ -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);

View File

@ -56,6 +56,10 @@ public:
(const TrackPanelMouseEvent &event,
AudacityProject *pProject);
// A cell may delegate context menu handling to another one
virtual std::shared_ptr<TrackPanelCell> 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