mirror of
https://github.com/cookiengineer/audacity
synced 2025-08-02 17:09:26 +02:00
Move code for handling the menu button out of TrackPanel, but...
... Still to do, move out the code for menu items. They remain accessible from Shift-M but not from the menu button. And ESC key is now implemented.
This commit is contained in:
parent
c3f5fea5fc
commit
1a317af2f5
@ -1133,7 +1133,6 @@ void TrackPanel::HandleInterruptedDrag()
|
|||||||
case IsResizing:
|
case IsResizing:
|
||||||
case IsResizingBetweenLinkedTracks:
|
case IsResizingBetweenLinkedTracks:
|
||||||
case IsResizingBelowLinkedTracks:
|
case IsResizingBelowLinkedTracks:
|
||||||
case IsPopping:
|
|
||||||
sendEvent = false;
|
sendEvent = false;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -3482,36 +3481,6 @@ void TrackPanel::UpdateViewIfNoTracks()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrackPanel::HandlePopping(wxMouseEvent & event)
|
|
||||||
{
|
|
||||||
Track *t = mCapturedTrack;
|
|
||||||
wxRect rect = mCapturedRect;
|
|
||||||
|
|
||||||
if( t==NULL ){
|
|
||||||
SetCapturedTrack( NULL );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxRect titleRect;
|
|
||||||
mTrackInfo.GetTitleBarRect(rect, titleRect);
|
|
||||||
|
|
||||||
wxClientDC dc(this);
|
|
||||||
|
|
||||||
if (event.Dragging()) {
|
|
||||||
mTrackInfo.DrawTitleBar(&dc, rect, t, titleRect.Contains(event.m_x, event.m_y));
|
|
||||||
}
|
|
||||||
else if (event.LeftUp()) {
|
|
||||||
if (titleRect.Contains(event.m_x, event.m_y))
|
|
||||||
{
|
|
||||||
OnTrackMenu(t);
|
|
||||||
}
|
|
||||||
|
|
||||||
SetCapturedTrack( NULL );
|
|
||||||
|
|
||||||
mTrackInfo.DrawTitleBar(&dc, rect, t, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// The tracks positions within the list have changed, so update the vertical
|
// The tracks positions within the list have changed, so update the vertical
|
||||||
// ruler size for the track that triggered the event.
|
// ruler size for the track that triggered the event.
|
||||||
void TrackPanel::OnTrackListResized(wxCommandEvent & e)
|
void TrackPanel::OnTrackListResized(wxCommandEvent & e)
|
||||||
@ -3768,10 +3737,6 @@ void TrackPanel::HandleLabelClick(wxMouseEvent & event)
|
|||||||
auto &t = foundCell.pTrack;
|
auto &t = foundCell.pTrack;
|
||||||
auto &rect = foundCell.rect;
|
auto &rect = foundCell.rect;
|
||||||
|
|
||||||
// LL: Check title bar for popup
|
|
||||||
if (isleft && PopupFunc(t, rect, event.m_x, event.m_y))
|
|
||||||
return;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
#ifdef USE_MIDI
|
#ifdef USE_MIDI
|
||||||
// DM: If it's a NoteTrack, it has special controls
|
// DM: If it's a NoteTrack, it has special controls
|
||||||
@ -3889,21 +3854,6 @@ void TrackPanel::CalculateRearrangingThresholds(wxMouseEvent & event)
|
|||||||
mMoveDownThreshold = INT_MAX;
|
mMoveDownThreshold = INT_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TrackPanel::PopupFunc(Track * t, wxRect rect, int x, int y)
|
|
||||||
{
|
|
||||||
wxRect titleRect;
|
|
||||||
mTrackInfo.GetTitleBarRect(rect, titleRect);
|
|
||||||
if (!titleRect.Contains(x, y))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
wxClientDC dc(this);
|
|
||||||
SetCapturedTrack( t, IsPopping );
|
|
||||||
mCapturedRect = rect;
|
|
||||||
|
|
||||||
mTrackInfo.DrawTitleBar(&dc, rect, t, true);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// ButtonDown means they just clicked and haven't released yet.
|
/// ButtonDown means they just clicked and haven't released yet.
|
||||||
/// We use this opportunity to save which track they clicked on,
|
/// We use this opportunity to save which track they clicked on,
|
||||||
/// and the initial height of the track, so as they drag we can
|
/// and the initial height of the track, so as they drag we can
|
||||||
@ -4764,9 +4714,6 @@ try
|
|||||||
case IsVZooming:
|
case IsVZooming:
|
||||||
HandleVZoom(event);
|
HandleVZoom(event);
|
||||||
break;
|
break;
|
||||||
case IsPopping:
|
|
||||||
HandlePopping(event);
|
|
||||||
break;
|
|
||||||
case IsResizing:
|
case IsResizing:
|
||||||
case IsResizingBetweenLinkedTracks:
|
case IsResizingBetweenLinkedTracks:
|
||||||
case IsResizingBelowLinkedTracks:
|
case IsResizingBelowLinkedTracks:
|
||||||
@ -6021,7 +5968,17 @@ void TrackPanel::OnTrackMenu(Track *t)
|
|||||||
|
|
||||||
if(!t) {
|
if(!t) {
|
||||||
t = GetFocusedTrack();
|
t = GetFocusedTrack();
|
||||||
if(!t) return;
|
if(!t)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
TrackPanelCell *const pCell = t->GetTrackControl();
|
||||||
|
const wxRect rect(FindTrackRect(t, true));
|
||||||
|
const UIHandle::Result refreshResult =
|
||||||
|
pCell->DoContextMenu(rect, this, NULL);
|
||||||
|
ProcessUIHandleResult(this, mRuler, t, t, refreshResult);
|
||||||
|
// TODO: Hide following lines inside the above.
|
||||||
}
|
}
|
||||||
|
|
||||||
mPopupMenuTarget = t;
|
mPopupMenuTarget = t;
|
||||||
|
@ -491,13 +491,6 @@ protected:
|
|||||||
|
|
||||||
virtual void HandleRearrange(wxMouseEvent & event);
|
virtual void HandleRearrange(wxMouseEvent & event);
|
||||||
virtual void CalculateRearrangingThresholds(wxMouseEvent & event);
|
virtual void CalculateRearrangingThresholds(wxMouseEvent & event);
|
||||||
virtual void HandlePopping(wxMouseEvent & event);
|
|
||||||
|
|
||||||
// These *Func methods are used in TrackPanel::HandleLabelClick to set up
|
|
||||||
// for actual handling in methods called by TrackPanel::OnMouseEvent, and
|
|
||||||
// to draw button-down states, etc.
|
|
||||||
virtual bool PopupFunc(Track * t, wxRect rect, int x, int y);
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual void MakeParentRedrawScrollbars();
|
virtual void MakeParentRedrawScrollbars();
|
||||||
|
@ -11,6 +11,8 @@ Paul Licameli split from TrackPanel.cpp
|
|||||||
#include "../../../Audacity.h"
|
#include "../../../Audacity.h"
|
||||||
#include "LabelTrackControls.h"
|
#include "LabelTrackControls.h"
|
||||||
#include "../../../HitTestResult.h"
|
#include "../../../HitTestResult.h"
|
||||||
|
#include "../../../LabelTrack.h"
|
||||||
|
#include "../../../widgets/PopupMenuTable.h"
|
||||||
|
|
||||||
LabelTrackControls::LabelTrackControls()
|
LabelTrackControls::LabelTrackControls()
|
||||||
{
|
{
|
||||||
@ -32,3 +34,38 @@ HitTestResult LabelTrackControls::HitTest
|
|||||||
{
|
{
|
||||||
return TrackControls::HitTest(event, pProject);
|
return TrackControls::HitTest(event, pProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class LabelTrackMenuTable : public PopupMenuTable
|
||||||
|
{
|
||||||
|
LabelTrackMenuTable() : mpData(NULL) {}
|
||||||
|
DECLARE_POPUP_MENU(LabelTrackMenuTable);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static LabelTrackMenuTable &Instance();
|
||||||
|
|
||||||
|
void InitMenu(Menu*, void *pUserData) override
|
||||||
|
{
|
||||||
|
mpData = static_cast<TrackControls::InitMenuData*>(pUserData);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DestroyMenu() override
|
||||||
|
{
|
||||||
|
mpData = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
TrackControls::InitMenuData *mpData;
|
||||||
|
};
|
||||||
|
|
||||||
|
LabelTrackMenuTable &LabelTrackMenuTable::Instance()
|
||||||
|
{
|
||||||
|
static LabelTrackMenuTable instance;
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN_POPUP_MENU(LabelTrackMenuTable)
|
||||||
|
END_POPUP_MENU()
|
||||||
|
|
||||||
|
PopupMenuTable *LabelTrackControls::GetMenuExtension(Track *)
|
||||||
|
{
|
||||||
|
return &LabelTrackMenuTable::Instance();
|
||||||
|
}
|
||||||
|
@ -26,6 +26,8 @@ public:
|
|||||||
HitTestResult HitTest
|
HitTestResult HitTest
|
||||||
(const TrackPanelMouseEvent &event,
|
(const TrackPanelMouseEvent &event,
|
||||||
const AudacityProject *pProject) override;
|
const AudacityProject *pProject) override;
|
||||||
|
|
||||||
|
PopupMenuTable *GetMenuExtension(Track *pTrack) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -19,6 +19,8 @@ Paul Licameli split from TrackPanel.cpp
|
|||||||
#include "../../../../HitTestResult.h"
|
#include "../../../../HitTestResult.h"
|
||||||
#include "../../../../Track.h"
|
#include "../../../../Track.h"
|
||||||
#include "../../../../TrackPanelMouseEvent.h"
|
#include "../../../../TrackPanelMouseEvent.h"
|
||||||
|
#include "../../../../NoteTrack.h"
|
||||||
|
#include "../../../../widgets/PopupMenuTable.h"
|
||||||
|
|
||||||
NoteTrackControls::NoteTrackControls()
|
NoteTrackControls::NoteTrackControls()
|
||||||
{
|
{
|
||||||
@ -64,4 +66,39 @@ HitTestResult NoteTrackControls::HitTest
|
|||||||
return TrackControls::HitTest(evt, pProject);
|
return TrackControls::HitTest(evt, pProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class NoteTrackMenuTable : public PopupMenuTable
|
||||||
|
{
|
||||||
|
NoteTrackMenuTable() : mpData(NULL) {}
|
||||||
|
DECLARE_POPUP_MENU(NoteTrackMenuTable);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static NoteTrackMenuTable &Instance();
|
||||||
|
|
||||||
|
void InitMenu(Menu*, void *pUserData) override
|
||||||
|
{
|
||||||
|
mpData = static_cast<TrackControls::InitMenuData*>(pUserData);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DestroyMenu() override
|
||||||
|
{
|
||||||
|
mpData = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
TrackControls::InitMenuData *mpData;
|
||||||
|
};
|
||||||
|
|
||||||
|
NoteTrackMenuTable &NoteTrackMenuTable::Instance()
|
||||||
|
{
|
||||||
|
static NoteTrackMenuTable instance;
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN_POPUP_MENU(NoteTrackMenuTable)
|
||||||
|
END_POPUP_MENU()
|
||||||
|
|
||||||
|
PopupMenuTable *NoteTrackControls::GetMenuExtension(Track *)
|
||||||
|
{
|
||||||
|
return &NoteTrackMenuTable::Instance();
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -26,6 +26,8 @@ public:
|
|||||||
HitTestResult HitTest
|
HitTestResult HitTest
|
||||||
(const TrackPanelMouseEvent &event,
|
(const TrackPanelMouseEvent &event,
|
||||||
const AudacityProject *pProject) override;
|
const AudacityProject *pProject) override;
|
||||||
|
|
||||||
|
PopupMenuTable *GetMenuExtension(Track *pTrack) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -14,9 +14,10 @@ Paul Licameli split from TrackPanel.cpp
|
|||||||
#include "WaveTrackSliderHandles.h"
|
#include "WaveTrackSliderHandles.h"
|
||||||
|
|
||||||
#include "../../../../HitTestResult.h"
|
#include "../../../../HitTestResult.h"
|
||||||
#include "../../../../Track.h"
|
#include "../../../../WaveTrack.h"
|
||||||
#include "../../../../TrackPanel.h"
|
#include "../../../../TrackPanel.h"
|
||||||
#include "../../../../TrackPanelMouseEvent.h"
|
#include "../../../../TrackPanelMouseEvent.h"
|
||||||
|
#include "../../../../widgets/PopupMenuTable.h"
|
||||||
|
|
||||||
WaveTrackControls::WaveTrackControls()
|
WaveTrackControls::WaveTrackControls()
|
||||||
{
|
{
|
||||||
@ -65,3 +66,38 @@ HitTestResult WaveTrackControls::HitTest
|
|||||||
|
|
||||||
return TrackControls::HitTest(evt, pProject);
|
return TrackControls::HitTest(evt, pProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class WaveTrackMenuTable : public PopupMenuTable
|
||||||
|
{
|
||||||
|
WaveTrackMenuTable() : mpData(NULL) {}
|
||||||
|
DECLARE_POPUP_MENU(WaveTrackMenuTable);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static WaveTrackMenuTable &Instance();
|
||||||
|
|
||||||
|
void InitMenu(Menu*, void *pUserData) override
|
||||||
|
{
|
||||||
|
mpData = static_cast<TrackControls::InitMenuData*>(pUserData);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DestroyMenu() override
|
||||||
|
{
|
||||||
|
mpData = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
TrackControls::InitMenuData *mpData;
|
||||||
|
};
|
||||||
|
|
||||||
|
WaveTrackMenuTable &WaveTrackMenuTable::Instance()
|
||||||
|
{
|
||||||
|
static WaveTrackMenuTable instance;
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN_POPUP_MENU(WaveTrackMenuTable)
|
||||||
|
END_POPUP_MENU()
|
||||||
|
|
||||||
|
PopupMenuTable *WaveTrackControls::GetMenuExtension(Track*)
|
||||||
|
{
|
||||||
|
return &WaveTrackMenuTable::Instance();
|
||||||
|
}
|
||||||
|
@ -26,6 +26,8 @@ public:
|
|||||||
HitTestResult HitTest
|
HitTestResult HitTest
|
||||||
(const TrackPanelMouseEvent &event,
|
(const TrackPanelMouseEvent &event,
|
||||||
const AudacityProject *pProject) override;
|
const AudacityProject *pProject) override;
|
||||||
|
|
||||||
|
PopupMenuTable *GetMenuExtension(Track *pTrack) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -11,6 +11,8 @@ Paul Licameli split from TrackPanel.cpp
|
|||||||
#include "../../../Audacity.h"
|
#include "../../../Audacity.h"
|
||||||
#include "TimeTrackControls.h"
|
#include "TimeTrackControls.h"
|
||||||
#include "../../../HitTestResult.h"
|
#include "../../../HitTestResult.h"
|
||||||
|
#include "../../../TimeTrack.h"
|
||||||
|
#include "../../../widgets/PopupMenuTable.h"
|
||||||
|
|
||||||
TimeTrackControls::TimeTrackControls()
|
TimeTrackControls::TimeTrackControls()
|
||||||
{
|
{
|
||||||
@ -32,3 +34,39 @@ HitTestResult TimeTrackControls::HitTest
|
|||||||
{
|
{
|
||||||
return TrackControls::HitTest(event, pProject);
|
return TrackControls::HitTest(event, pProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class TimeTrackMenuTable : public PopupMenuTable
|
||||||
|
{
|
||||||
|
TimeTrackMenuTable() : mpData(NULL) {}
|
||||||
|
DECLARE_POPUP_MENU(TimeTrackMenuTable);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static TimeTrackMenuTable &Instance();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void InitMenu(Menu *pMenu, void *pUserData) override
|
||||||
|
{
|
||||||
|
mpData = static_cast<TrackControls::InitMenuData*>(pUserData);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DestroyMenu() override
|
||||||
|
{
|
||||||
|
mpData = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
TrackControls::InitMenuData *mpData;
|
||||||
|
};
|
||||||
|
|
||||||
|
TimeTrackMenuTable &TimeTrackMenuTable::Instance()
|
||||||
|
{
|
||||||
|
static TimeTrackMenuTable instance;
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN_POPUP_MENU(TimeTrackMenuTable)
|
||||||
|
END_POPUP_MENU()
|
||||||
|
|
||||||
|
PopupMenuTable *TimeTrackControls::GetMenuExtension(Track *)
|
||||||
|
{
|
||||||
|
return &TimeTrackMenuTable::Instance();
|
||||||
|
}
|
||||||
|
@ -26,6 +26,8 @@ public:
|
|||||||
HitTestResult HitTest
|
HitTestResult HitTest
|
||||||
(const TrackPanelMouseEvent &event,
|
(const TrackPanelMouseEvent &event,
|
||||||
const AudacityProject *pProject) override;
|
const AudacityProject *pProject) override;
|
||||||
|
|
||||||
|
PopupMenuTable *GetMenuExtension(Track *pTrack) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -8,6 +8,7 @@ Paul Licameli split from TrackPanel.cpp
|
|||||||
|
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
|
#include "../../Audacity.h"
|
||||||
#include "TrackButtonHandles.h"
|
#include "TrackButtonHandles.h"
|
||||||
|
|
||||||
#include "../../HitTestResult.h"
|
#include "../../HitTestResult.h"
|
||||||
@ -124,3 +125,44 @@ HitTestResult CloseButtonHandle::HitTest
|
|||||||
else
|
else
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
MenuButtonHandle::MenuButtonHandle()
|
||||||
|
: ButtonHandle{ TrackPanel::IsPopping }
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
MenuButtonHandle::~MenuButtonHandle()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
MenuButtonHandle &MenuButtonHandle::Instance()
|
||||||
|
{
|
||||||
|
static MenuButtonHandle instance;
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
UIHandle::Result MenuButtonHandle::CommitChanges
|
||||||
|
(const wxMouseEvent &, AudacityProject *, wxWindow *pParent)
|
||||||
|
{
|
||||||
|
return mpCell->DoContextMenu(mRect, pParent, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
HitTestResult MenuButtonHandle::HitTest
|
||||||
|
(const wxMouseEvent &event, const wxRect &rect, TrackPanelCell *pCell)
|
||||||
|
{
|
||||||
|
wxRect buttonRect;
|
||||||
|
TrackInfo::GetTitleBarRect(rect, buttonRect);
|
||||||
|
|
||||||
|
if (buttonRect.Contains(event.m_x, event.m_y)) {
|
||||||
|
Instance().mpCell = pCell;
|
||||||
|
Instance().mRect = buttonRect;
|
||||||
|
return {
|
||||||
|
HitPreview(),
|
||||||
|
&Instance()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
@ -55,4 +55,31 @@ public:
|
|||||||
static HitTestResult HitTest(const wxMouseEvent &event, const wxRect &rect);
|
static HitTestResult HitTest(const wxMouseEvent &event, const wxRect &rect);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <wx/event.h>
|
||||||
|
#include "../../widgets/PopupMenuTable.h"
|
||||||
|
|
||||||
|
class MenuButtonHandle final : public ButtonHandle
|
||||||
|
{
|
||||||
|
MenuButtonHandle(const MenuButtonHandle&) = delete;
|
||||||
|
MenuButtonHandle &operator=(const MenuButtonHandle&) = delete;
|
||||||
|
|
||||||
|
MenuButtonHandle();
|
||||||
|
virtual ~MenuButtonHandle();
|
||||||
|
static MenuButtonHandle& Instance();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Result CommitChanges
|
||||||
|
(const wxMouseEvent &event, AudacityProject *pProject, wxWindow *pParent)
|
||||||
|
override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static HitTestResult HitTest
|
||||||
|
(const wxMouseEvent &event, const wxRect &rect, TrackPanelCell *pCell);
|
||||||
|
|
||||||
|
private:
|
||||||
|
TrackPanelCell *mpCell{};
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -12,6 +12,7 @@ Paul Licameli split from TrackPanel.cpp
|
|||||||
#include "TrackControls.h"
|
#include "TrackControls.h"
|
||||||
#include "TrackButtonHandles.h"
|
#include "TrackButtonHandles.h"
|
||||||
#include "../../HitTestResult.h"
|
#include "../../HitTestResult.h"
|
||||||
|
#include "../../RefreshCode.h"
|
||||||
#include "../../TrackPanel.h"
|
#include "../../TrackPanel.h"
|
||||||
#include "../../TrackPanelMouseEvent.h"
|
#include "../../TrackPanelMouseEvent.h"
|
||||||
|
|
||||||
@ -32,6 +33,9 @@ HitTestResult TrackControls::HitTest
|
|||||||
if (NULL != (result = CloseButtonHandle::HitTest(event, rect)).handle)
|
if (NULL != (result = CloseButtonHandle::HitTest(event, rect)).handle)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
if (NULL != (result = MenuButtonHandle::HitTest(event, rect, this)).handle)
|
||||||
|
return result;
|
||||||
|
|
||||||
if (NULL != (result = MinimizeButtonHandle::HitTest(event, rect)).handle)
|
if (NULL != (result = MinimizeButtonHandle::HitTest(event, rect)).handle)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
@ -42,3 +46,56 @@ Track *TrackControls::FindTrack()
|
|||||||
{
|
{
|
||||||
return GetTrack();
|
return GetTrack();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class TrackMenuTable : public PopupMenuTable
|
||||||
|
{
|
||||||
|
TrackMenuTable() : mpData(NULL) {}
|
||||||
|
DECLARE_POPUP_MENU(TrackMenuTable);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static TrackMenuTable &Instance();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void InitMenu(Menu*, void *pUserData) override
|
||||||
|
{
|
||||||
|
mpData = static_cast<TrackControls::InitMenuData*>(pUserData);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DestroyMenu() override
|
||||||
|
{
|
||||||
|
mpData = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
TrackControls::InitMenuData *mpData;
|
||||||
|
};
|
||||||
|
|
||||||
|
TrackMenuTable &TrackMenuTable::Instance()
|
||||||
|
{
|
||||||
|
static TrackMenuTable instance;
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN_POPUP_MENU(TrackMenuTable)
|
||||||
|
END_POPUP_MENU()
|
||||||
|
|
||||||
|
unsigned TrackControls::DoContextMenu
|
||||||
|
(const wxRect &rect, wxWindow *pParent, wxPoint *)
|
||||||
|
{
|
||||||
|
wxRect buttonRect;
|
||||||
|
TrackInfo::GetTitleBarRect(rect, buttonRect);
|
||||||
|
|
||||||
|
InitMenuData data{ mpTrack, pParent, RefreshCode::RefreshNone };
|
||||||
|
|
||||||
|
const auto pTable = &TrackMenuTable::Instance();
|
||||||
|
auto pMenu = PopupMenuTable::BuildMenu(pParent, pTable, &data);
|
||||||
|
|
||||||
|
PopupMenuTable *const pExtension = GetMenuExtension(mpTrack);
|
||||||
|
if (pExtension)
|
||||||
|
pMenu->Extend(pExtension);
|
||||||
|
|
||||||
|
pParent->PopupMenu
|
||||||
|
(pMenu.get(), buttonRect.x + 1, buttonRect.y + buttonRect.height + 1);
|
||||||
|
|
||||||
|
return data.result;
|
||||||
|
}
|
||||||
|
@ -13,6 +13,7 @@ Paul Licameli split from TrackPanel.cpp
|
|||||||
|
|
||||||
#include "CommonTrackPanelCell.h"
|
#include "CommonTrackPanelCell.h"
|
||||||
|
|
||||||
|
class PopupMenuTable;
|
||||||
class Track;
|
class Track;
|
||||||
|
|
||||||
class TrackControls /* not final */ : public CommonTrackPanelCell
|
class TrackControls /* not final */ : public CommonTrackPanelCell
|
||||||
@ -24,6 +25,16 @@ public:
|
|||||||
|
|
||||||
Track *GetTrack() const { return mpTrack; }
|
Track *GetTrack() const { return mpTrack; }
|
||||||
|
|
||||||
|
// This is passed to the InitMenu() methods of the PopupMenuTable
|
||||||
|
// objects returned by GetMenuExtension:
|
||||||
|
struct InitMenuData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Track *pTrack;
|
||||||
|
wxWindow *pParent;
|
||||||
|
unsigned result;
|
||||||
|
};
|
||||||
|
|
||||||
// Make this hack go away! See TrackPanel::DrawOutside
|
// Make this hack go away! See TrackPanel::DrawOutside
|
||||||
static int gCaptureState;
|
static int gCaptureState;
|
||||||
|
|
||||||
@ -36,6 +47,10 @@ protected:
|
|||||||
|
|
||||||
Track *FindTrack() override;
|
Track *FindTrack() override;
|
||||||
|
|
||||||
|
unsigned DoContextMenu
|
||||||
|
(const wxRect &rect, wxWindow *pParent, wxPoint *pPosition) override;
|
||||||
|
virtual PopupMenuTable *GetMenuExtension(Track *pTrack) = 0;
|
||||||
|
|
||||||
friend class Track;
|
friend class Track;
|
||||||
Track *mpTrack;
|
Track *mpTrack;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user