diff --git a/src/cursor.cpp b/src/cursor.cpp index 0d5dd3a..6352a95 100644 --- a/src/cursor.cpp +++ b/src/cursor.cpp @@ -40,12 +40,12 @@ bool Cursor::pointOverCursor(QPoint point) bool Cursor::mouseEvent(QEvent::Type type, QMouseEvent *event) { // If the mouse pointer moves over a cursor, display a resize pointer - if (pointOverCursor(event->pos()) && type != QEvent::Leave) { + if (pointOverCursor(event->pos())) { if (!cursorOverriden) { cursorOverriden = true; QApplication::setOverrideCursor(QCursor(cursorShape)); } - // Restore pointer if it moves off the cursor, or leaves the widget + // Restore pointer if it moves off the cursor } else if (cursorOverriden) { cursorOverriden = false; QApplication::restoreOverrideCursor(); @@ -77,6 +77,14 @@ bool Cursor::mouseEvent(QEvent::Type type, QMouseEvent *event) return false; } +void Cursor::leaveEvent() +{ + if (cursorOverriden) { + cursorOverriden = false; + QApplication::restoreOverrideCursor(); + } +} + int Cursor::pos() { return cursorPosition; diff --git a/src/cursor.h b/src/cursor.h index f25609d..76451ed 100644 --- a/src/cursor.h +++ b/src/cursor.h @@ -33,6 +33,7 @@ public: int pos(); void setPos(int newPos); bool mouseEvent(QEvent::Type type, QMouseEvent *event); + void leaveEvent(); signals: void posChanged(); diff --git a/src/cursors.cpp b/src/cursors.cpp index fbf157c..66eaadf 100644 --- a/src/cursors.cpp +++ b/src/cursors.cpp @@ -52,7 +52,7 @@ bool Cursors::mouseEvent(QEvent::Type type, QMouseEvent *event) return true; // If the mouse pointer is between the cursors, display a resize pointer - if (pointWithinDragRegion(event->pos()) && type != QEvent::Leave) { + if (pointWithinDragRegion(event->pos()) ) { if (!cursorOverride) { cursorOverride = true; QApplication::setOverrideCursor(QCursor(Qt::SizeAllCursor)); @@ -92,6 +92,17 @@ bool Cursors::mouseEvent(QEvent::Type type, QMouseEvent *event) return false; } +void Cursors::leaveEvent() +{ + minCursor->leaveEvent(); + maxCursor->leaveEvent(); + + if (cursorOverride) { + cursorOverride = false; + QApplication::restoreOverrideCursor(); + } +} + void Cursors::paintFront(QPainter &painter, QRect &rect, range_t sampleRange) { painter.save(); diff --git a/src/cursors.h b/src/cursors.h index 78192c8..84356d1 100644 --- a/src/cursors.h +++ b/src/cursors.h @@ -34,6 +34,7 @@ public: Cursors(QObject * parent); int segments(); bool mouseEvent(QEvent::Type type, QMouseEvent *event); + void leaveEvent(); void paintFront(QPainter &painter, QRect &rect, range_t sampleRange); range_t selection(); void setSegments(int segments); diff --git a/src/plot.cpp b/src/plot.cpp index e3e7267..af2fa03 100644 --- a/src/plot.cpp +++ b/src/plot.cpp @@ -39,6 +39,11 @@ bool Plot::mouseEvent(QEvent::Type type, QMouseEvent *event) return false; } +void Plot::leaveEvent() +{ + +} + std::shared_ptr Plot::output() { return sampleSource; diff --git a/src/plot.h b/src/plot.h index 028fbe2..94ccf60 100644 --- a/src/plot.h +++ b/src/plot.h @@ -34,6 +34,7 @@ public: ~Plot(); void invalidateEvent() override; virtual bool mouseEvent(QEvent::Type type, QMouseEvent *event); + virtual void leaveEvent(); virtual std::shared_ptr output(); virtual void paintBack(QPainter &painter, QRect &rect, range_t sampleRange); virtual void paintMid(QPainter &painter, QRect &rect, range_t sampleRange); diff --git a/src/plotview.cpp b/src/plotview.cpp index df79017..100055b 100644 --- a/src/plotview.cpp +++ b/src/plotview.cpp @@ -253,8 +253,7 @@ bool PlotView::viewportEvent(QEvent *event) { // Pass mouse events to individual plot objects if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseMove || - event->type() == QEvent::MouseButtonRelease || - event->type() == QEvent::Leave) { + event->type() == QEvent::MouseButtonRelease) { QMouseEvent *mouseEvent = static_cast(event); @@ -281,6 +280,15 @@ bool PlotView::viewportEvent(QEvent *event) { return true; } + if (event->type() == QEvent::Leave) { + for (auto&& plot : plots) { + plot->leaveEvent(); + } + + if (cursorsEnabled) + cursors.leaveEvent(); + } + // Handle parent eveents return QGraphicsView::viewportEvent(event); } diff --git a/src/spectrogramplot.cpp b/src/spectrogramplot.cpp index c20e242..c71763e 100644 --- a/src/spectrogramplot.cpp +++ b/src/spectrogramplot.cpp @@ -359,6 +359,12 @@ bool SpectrogramPlot::mouseEvent(QEvent::Type type, QMouseEvent *event) return false; } +void SpectrogramPlot::leaveEvent() +{ + if (tunerEnabled()) + tuner.leaveEvent(); +} + std::shared_ptr SpectrogramPlot::output() { return tunerTransform; diff --git a/src/spectrogramplot.h b/src/spectrogramplot.h index 91fca7a..c75f193 100644 --- a/src/spectrogramplot.h +++ b/src/spectrogramplot.h @@ -68,6 +68,7 @@ public: void paintFront(QPainter &painter, QRect &rect, range_t sampleRange) override; void paintMid(QPainter &painter, QRect &rect, range_t sampleRange) override; bool mouseEvent(QEvent::Type type, QMouseEvent *event) override; + void leaveEvent(); std::shared_ptr>> input() { return inputSource; }; void setSampleRate(double sampleRate); bool tunerEnabled(); diff --git a/src/tuner.cpp b/src/tuner.cpp index 7d167d5..2dbc144 100644 --- a/src/tuner.cpp +++ b/src/tuner.cpp @@ -75,6 +75,13 @@ bool Tuner::mouseEvent(QEvent::Type type, QMouseEvent *event) return false; } +void Tuner::leaveEvent() +{ + cfCursor->leaveEvent(); + minCursor->leaveEvent(); + maxCursor->leaveEvent(); +} + void Tuner::paintFront(QPainter &painter, QRect &rect, range_t sampleRange) { painter.save(); diff --git a/src/tuner.h b/src/tuner.h index 89a9f13..175dbba 100644 --- a/src/tuner.h +++ b/src/tuner.h @@ -35,6 +35,7 @@ public: int centre(); int deviation(); bool mouseEvent(QEvent::Type, QMouseEvent *event); + void leaveEvent(); void paintFront(QPainter &painter, QRect &rect, range_t sampleRange); void setCentre(int centre); void setDeviation(int dev);