1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-25 08:38:39 +02:00

Fix assertions and crashes in context menu for scrubber

This commit is contained in:
Paul Licameli 2016-04-26 15:38:27 -04:00
commit 3154b78b0f
2 changed files with 24 additions and 13 deletions

View File

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

View File

@ -91,7 +91,18 @@ private:
void OnActivateOrDeactivateApp(wxActivateEvent & event); void OnActivateOrDeactivateApp(wxActivateEvent & event);
void UncheckAllMenuItems(); void UncheckAllMenuItems();
void CheckMenuItem(); void CheckMenuItem();
void OnMouse(wxMouseEvent &event);
// 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);
DECLARE_EVENT_TABLE()
};
Forwarder mForwarder{ *this };
private: private:
int mScrubToken; int mScrubToken;