1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-31 07:59:27 +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:
Paul Licameli 2015-07-30 14:57:13 -04:00 committed by Paul Licameli
parent c3f5fea5fc
commit 1a317af2f5
14 changed files with 309 additions and 62 deletions

View File

@ -1133,7 +1133,6 @@ void TrackPanel::HandleInterruptedDrag()
case IsResizing:
case IsResizingBetweenLinkedTracks:
case IsResizingBelowLinkedTracks:
case IsPopping:
sendEvent = false;
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
// ruler size for the track that triggered the event.
void TrackPanel::OnTrackListResized(wxCommandEvent & e)
@ -3768,10 +3737,6 @@ void TrackPanel::HandleLabelClick(wxMouseEvent & event)
auto &t = foundCell.pTrack;
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
// DM: If it's a NoteTrack, it has special controls
@ -3889,21 +3854,6 @@ void TrackPanel::CalculateRearrangingThresholds(wxMouseEvent & event)
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.
/// We use this opportunity to save which track they clicked on,
/// and the initial height of the track, so as they drag we can
@ -4764,9 +4714,6 @@ try
case IsVZooming:
HandleVZoom(event);
break;
case IsPopping:
HandlePopping(event);
break;
case IsResizing:
case IsResizingBetweenLinkedTracks:
case IsResizingBelowLinkedTracks:
@ -6021,7 +5968,17 @@ void TrackPanel::OnTrackMenu(Track *t)
if(!t) {
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;

View File

@ -491,13 +491,6 @@ protected:
virtual void HandleRearrange(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:
virtual void MakeParentRedrawScrollbars();

View File

@ -11,6 +11,8 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../Audacity.h"
#include "LabelTrackControls.h"
#include "../../../HitTestResult.h"
#include "../../../LabelTrack.h"
#include "../../../widgets/PopupMenuTable.h"
LabelTrackControls::LabelTrackControls()
{
@ -32,3 +34,38 @@ HitTestResult LabelTrackControls::HitTest
{
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();
}

View File

@ -26,6 +26,8 @@ public:
HitTestResult HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject) override;
PopupMenuTable *GetMenuExtension(Track *pTrack) override;
};
#endif

View File

@ -19,6 +19,8 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../../HitTestResult.h"
#include "../../../../Track.h"
#include "../../../../TrackPanelMouseEvent.h"
#include "../../../../NoteTrack.h"
#include "../../../../widgets/PopupMenuTable.h"
NoteTrackControls::NoteTrackControls()
{
@ -64,4 +66,39 @@ HitTestResult NoteTrackControls::HitTest
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

View File

@ -26,6 +26,8 @@ public:
HitTestResult HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject) override;
PopupMenuTable *GetMenuExtension(Track *pTrack) override;
};
#endif

View File

@ -14,9 +14,10 @@ Paul Licameli split from TrackPanel.cpp
#include "WaveTrackSliderHandles.h"
#include "../../../../HitTestResult.h"
#include "../../../../Track.h"
#include "../../../../WaveTrack.h"
#include "../../../../TrackPanel.h"
#include "../../../../TrackPanelMouseEvent.h"
#include "../../../../widgets/PopupMenuTable.h"
WaveTrackControls::WaveTrackControls()
{
@ -65,3 +66,38 @@ HitTestResult WaveTrackControls::HitTest
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();
}

View File

@ -26,6 +26,8 @@ public:
HitTestResult HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject) override;
PopupMenuTable *GetMenuExtension(Track *pTrack) override;
};
#endif

View File

@ -11,6 +11,8 @@ Paul Licameli split from TrackPanel.cpp
#include "../../../Audacity.h"
#include "TimeTrackControls.h"
#include "../../../HitTestResult.h"
#include "../../../TimeTrack.h"
#include "../../../widgets/PopupMenuTable.h"
TimeTrackControls::TimeTrackControls()
{
@ -32,3 +34,39 @@ HitTestResult TimeTrackControls::HitTest
{
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();
}

View File

@ -26,6 +26,8 @@ public:
HitTestResult HitTest
(const TrackPanelMouseEvent &event,
const AudacityProject *pProject) override;
PopupMenuTable *GetMenuExtension(Track *pTrack) override;
};
#endif

View File

@ -8,6 +8,7 @@ Paul Licameli split from TrackPanel.cpp
**********************************************************************/
#include "../../Audacity.h"
#include "TrackButtonHandles.h"
#include "../../HitTestResult.h"
@ -124,3 +125,44 @@ HitTestResult CloseButtonHandle::HitTest
else
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 {};
}

View File

@ -55,4 +55,31 @@ public:
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

View File

@ -12,6 +12,7 @@ Paul Licameli split from TrackPanel.cpp
#include "TrackControls.h"
#include "TrackButtonHandles.h"
#include "../../HitTestResult.h"
#include "../../RefreshCode.h"
#include "../../TrackPanel.h"
#include "../../TrackPanelMouseEvent.h"
@ -32,6 +33,9 @@ HitTestResult TrackControls::HitTest
if (NULL != (result = CloseButtonHandle::HitTest(event, rect)).handle)
return result;
if (NULL != (result = MenuButtonHandle::HitTest(event, rect, this)).handle)
return result;
if (NULL != (result = MinimizeButtonHandle::HitTest(event, rect)).handle)
return result;
@ -42,3 +46,56 @@ Track *TrackControls::FindTrack()
{
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;
}

View File

@ -13,6 +13,7 @@ Paul Licameli split from TrackPanel.cpp
#include "CommonTrackPanelCell.h"
class PopupMenuTable;
class Track;
class TrackControls /* not final */ : public CommonTrackPanelCell
@ -24,6 +25,16 @@ public:
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
static int gCaptureState;
@ -36,6 +47,10 @@ protected:
Track *FindTrack() override;
unsigned DoContextMenu
(const wxRect &rect, wxWindow *pParent, wxPoint *pPosition) override;
virtual PopupMenuTable *GetMenuExtension(Track *pTrack) = 0;
friend class Track;
Track *mpTrack;
};