1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-14 17:14:07 +01: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

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