mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-25 16:48:44 +02:00
Fix assertions and crashes in context menu for scrubber
This commit is contained in:
commit
3154b78b0f
@ -127,7 +127,7 @@ Scrubber::Scrubber(AudacityProject *project)
|
|||||||
wxTheApp->Connect
|
wxTheApp->Connect
|
||||||
(wxEVT_ACTIVATE_APP,
|
(wxEVT_ACTIVATE_APP,
|
||||||
wxActivateEventHandler(Scrubber::OnActivateOrDeactivateApp), NULL, this);
|
wxActivateEventHandler(Scrubber::OnActivateOrDeactivateApp), NULL, this);
|
||||||
mProject->PushEventHandler(this);
|
mProject->PushEventHandler(&mForwarder);
|
||||||
}
|
}
|
||||||
|
|
||||||
Scrubber::~Scrubber()
|
Scrubber::~Scrubber()
|
||||||
@ -455,32 +455,31 @@ void Scrubber::OnActivateOrDeactivateApp(wxActivateEvent &event)
|
|||||||
event.Skip();
|
event.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scrubber::OnMouse(wxMouseEvent &event)
|
void Scrubber::Forwarder::OnMouse(wxMouseEvent &event)
|
||||||
{
|
{
|
||||||
auto isScrubbing = IsScrubbing();
|
auto isScrubbing = scrubber.IsScrubbing();
|
||||||
if (!isScrubbing && HasStartedScrubbing()) {
|
if (!isScrubbing && scrubber.HasStartedScrubbing()) {
|
||||||
if (!event.HasAnyModifiers() &&
|
if (!event.HasAnyModifiers() &&
|
||||||
event.GetEventType() == wxEVT_MOTION) {
|
event.GetEventType() == wxEVT_MOTION) {
|
||||||
|
|
||||||
// Really start scrub if motion is far enough
|
// Really start scrub if motion is far enough
|
||||||
auto ruler = mProject->GetRulerPanel();
|
auto ruler = scrubber.mProject->GetRulerPanel();
|
||||||
auto xx = ruler->ScreenToClient(::wxGetMousePosition()).x;
|
auto xx = ruler->ScreenToClient(::wxGetMousePosition()).x;
|
||||||
MaybeStartScrubbing(xx
|
scrubber.MaybeStartScrubbing(xx);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (isScrubbing && !event.HasAnyModifiers()) {
|
else if (isScrubbing && !event.HasAnyModifiers()) {
|
||||||
if(event.LeftDown() ||
|
if(event.LeftDown() ||
|
||||||
(event.LeftIsDown() && event.Dragging())) {
|
(event.LeftIsDown() && event.Dragging())) {
|
||||||
mScrubSeekPress = true;
|
scrubber.mScrubSeekPress = true;
|
||||||
auto ruler = mProject->GetRulerPanel();
|
auto ruler = scrubber.mProject->GetRulerPanel();
|
||||||
auto xx = ruler->ScreenToClient(::wxGetMousePosition()).x;
|
auto xx = ruler->ScreenToClient(::wxGetMousePosition()).x;
|
||||||
ruler->UpdateQuickPlayPos(xx);
|
ruler->UpdateQuickPlayPos(xx);
|
||||||
}
|
}
|
||||||
else if (event.m_wheelRotation) {
|
else if (event.m_wheelRotation) {
|
||||||
double steps = event.m_wheelRotation /
|
double steps = event.m_wheelRotation /
|
||||||
(event.m_wheelDelta > 0 ? (double)event.m_wheelDelta : 120.0);
|
(event.m_wheelDelta > 0 ? (double)event.m_wheelDelta : 120.0);
|
||||||
HandleScrollWheel(steps);
|
scrubber.HandleScrollWheel(steps);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
event.Skip();
|
event.Skip();
|
||||||
@ -700,9 +699,10 @@ BEGIN_EVENT_TABLE(Scrubber, wxEvtHandler)
|
|||||||
EVT_MENU(CMD_ID + 1, Scrubber::OnScrollScrub)
|
EVT_MENU(CMD_ID + 1, Scrubber::OnScrollScrub)
|
||||||
EVT_MENU(CMD_ID + 2, Scrubber::OnSeek)
|
EVT_MENU(CMD_ID + 2, Scrubber::OnSeek)
|
||||||
EVT_MENU(CMD_ID + 3, Scrubber::OnScrollSeek)
|
EVT_MENU(CMD_ID + 3, Scrubber::OnScrollSeek)
|
||||||
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
EVT_MOUSE_EVENTS(Scrubber::OnMouse)
|
BEGIN_EVENT_TABLE(Scrubber::Forwarder, wxEvtHandler)
|
||||||
|
EVT_MOUSE_EVENTS(Scrubber::Forwarder::OnMouse)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
static_assert(nMenuItems == 4, "wrong number of items");
|
static_assert(nMenuItems == 4, "wrong number of items");
|
||||||
|
@ -91,7 +91,18 @@ private:
|
|||||||
void OnActivateOrDeactivateApp(wxActivateEvent & event);
|
void OnActivateOrDeactivateApp(wxActivateEvent & event);
|
||||||
void UncheckAllMenuItems();
|
void UncheckAllMenuItems();
|
||||||
void CheckMenuItem();
|
void CheckMenuItem();
|
||||||
|
|
||||||
|
// I need this because I can't push the scrubber as an event handler
|
||||||
|
// in two places at once.
|
||||||
|
struct Forwarder : public wxEvtHandler {
|
||||||
|
Forwarder(Scrubber &scrubber_) : scrubber{ scrubber_ } {}
|
||||||
|
|
||||||
|
Scrubber &scrubber;
|
||||||
|
|
||||||
void OnMouse(wxMouseEvent &event);
|
void OnMouse(wxMouseEvent &event);
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
};
|
||||||
|
Forwarder mForwarder{ *this };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int mScrubToken;
|
int mScrubToken;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user