1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-05 14:18:53 +02:00

Fix assertions and crashes in context menu for scrubber

This commit is contained in:
Paul Licameli 2016-04-26 15:37:55 -04:00
parent 9ab0e42f29
commit 6a1d387093
2 changed files with 24 additions and 13 deletions

View File

@ -127,7 +127,7 @@ Scrubber::Scrubber(AudacityProject *project)
wxTheApp->Connect
(wxEVT_ACTIVATE_APP,
wxActivateEventHandler(Scrubber::OnActivateOrDeactivateApp), NULL, this);
mProject->PushEventHandler(this);
mProject->PushEventHandler(&mForwarder);
}
Scrubber::~Scrubber()
@ -455,32 +455,31 @@ void Scrubber::OnActivateOrDeactivateApp(wxActivateEvent &event)
event.Skip();
}
void Scrubber::OnMouse(wxMouseEvent &event)
void Scrubber::Forwarder::OnMouse(wxMouseEvent &event)
{
auto isScrubbing = IsScrubbing();
if (!isScrubbing && HasStartedScrubbing()) {
auto isScrubbing = scrubber.IsScrubbing();
if (!isScrubbing && scrubber.HasStartedScrubbing()) {
if (!event.HasAnyModifiers() &&
event.GetEventType() == wxEVT_MOTION) {
// Really start scrub if motion is far enough
auto ruler = mProject->GetRulerPanel();
auto ruler = scrubber.mProject->GetRulerPanel();
auto xx = ruler->ScreenToClient(::wxGetMousePosition()).x;
MaybeStartScrubbing(xx
);
scrubber.MaybeStartScrubbing(xx);
}
}
else if (isScrubbing && !event.HasAnyModifiers()) {
if(event.LeftDown() ||
(event.LeftIsDown() && event.Dragging())) {
mScrubSeekPress = true;
auto ruler = mProject->GetRulerPanel();
scrubber.mScrubSeekPress = true;
auto ruler = scrubber.mProject->GetRulerPanel();
auto xx = ruler->ScreenToClient(::wxGetMousePosition()).x;
ruler->UpdateQuickPlayPos(xx);
}
else if (event.m_wheelRotation) {
double steps = event.m_wheelRotation /
(event.m_wheelDelta > 0 ? (double)event.m_wheelDelta : 120.0);
HandleScrollWheel(steps);
scrubber.HandleScrollWheel(steps);
}
else
event.Skip();
@ -700,9 +699,10 @@ BEGIN_EVENT_TABLE(Scrubber, wxEvtHandler)
EVT_MENU(CMD_ID + 1, Scrubber::OnScrollScrub)
EVT_MENU(CMD_ID + 2, Scrubber::OnSeek)
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()
static_assert(nMenuItems == 4, "wrong number of items");

View File

@ -91,7 +91,18 @@ private:
void OnActivateOrDeactivateApp(wxActivateEvent & event);
void UncheckAllMenuItems();
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:
int mScrubToken;