diff --git a/DSView/pv/view/header.cpp b/DSView/pv/view/header.cpp index bd26d73b..40bcaa43 100755 --- a/DSView/pv/view/header.cpp +++ b/DSView/pv/view/header.cpp @@ -264,7 +264,27 @@ void Header::wheelEvent(QWheelEvent *event) const vector< boost::shared_ptr > traces( _view.get_traces(ALL_VIEW)); // Vertical scrolling - double shift = event->delta() / 80.0; + double shift = 0; + #ifdef Q_OS_DARWIN + static bool active = true; + static int64_t last_time; + if (event->source() == Qt::MouseEventSynthesizedBySystem) { + if (active) { + last_time = QDateTime::currentMSecsSinceEpoch(); + shift = event->delta() > 1.5 ? -1 : + event->delta() < -1.5 ? 1 : 0; + } + int64_t cur_time = QDateTime::currentMSecsSinceEpoch(); + if (cur_time - last_time > 100) + active = true; + else + active = false; + } else { + shift = -event->delta() / 80.0; + } + #else + shift = event->delta() / 80.0; + #endif BOOST_FOREACH(const boost::shared_ptr t, traces) if (t->mouse_wheel(width(), event->pos(), shift)) break; diff --git a/DSView/pv/view/view.cpp b/DSView/pv/view/view.cpp index b4fcafe4..8c99c094 100755 --- a/DSView/pv/view/view.cpp +++ b/DSView/pv/view/view.cpp @@ -293,8 +293,9 @@ void View::update_hori_res() } } -void View::zoom(double steps, int offset) +bool View::zoom(double steps, int offset) { + bool ret = true; _preScale = _scale; _preOffset = _offset; @@ -304,7 +305,7 @@ void View::zoom(double steps, int offset) } else { if (_session.get_capture_state() == SigSession::Running && _session.get_instant()) - return; + return ret; double hori_res = -1; if(steps > 0.5) @@ -315,6 +316,8 @@ void View::zoom(double steps, int offset) if (hori_res > 0) { const double scale = _session.cur_view_time() / get_view_width(); _scale = max(min(scale, _maxscale), _minscale); + } else { + ret = false; } } @@ -327,6 +330,8 @@ void View::zoom(double steps, int offset) viewport_update(); update_scroll(); } + + return ret; } void View::timebase_changed() @@ -816,6 +821,7 @@ bool View::viewportEvent(QEvent *e) case QEvent::MouseButtonDblClick: case QEvent::MouseMove: case QEvent::Wheel: + case QEvent::Gesture: return false; default: diff --git a/DSView/pv/view/view.h b/DSView/pv/view/view.h index c8fab8e3..73a65d01 100755 --- a/DSView/pv/view/view.h +++ b/DSView/pv/view/view.h @@ -130,7 +130,7 @@ public: void capture_init(); void zoom(double steps); - void zoom(double steps, int offset); + bool zoom(double steps, int offset); /** * Sets the scale and offset. diff --git a/DSView/pv/view/viewport.cpp b/DSView/pv/view/viewport.cpp index fa589e9f..56b0748e 100755 --- a/DSView/pv/view/viewport.cpp +++ b/DSView/pv/view/viewport.cpp @@ -130,6 +130,13 @@ QPoint Viewport::get_mouse_point() const return _mouse_point; } +bool Viewport::event(QEvent *event) +{ + if (event->type() == QEvent::NativeGesture) + return gestureEvent(static_cast(event)); + return QWidget::event(event); +} + void Viewport::paintEvent(QPaintEvent *event) { (void)event; @@ -1007,11 +1014,32 @@ void Viewport::wheelEvent(QWheelEvent *event) if (event->orientation() == Qt::Vertical) { // Vertical scrolling is interpreted as zooming in/out const int offset = event->x(); + #ifdef Q_OS_DARWIN + static bool active = true; + static int64_t last_time; + if (event->source() == Qt::MouseEventSynthesizedBySystem) { + if (active && (event->modifiers() & Qt::ShiftModifier)) { + last_time = QDateTime::currentMSecsSinceEpoch(); + const double scale = event->delta() > 1.5 ? 1 : + event->delta() < -1.5 ? -1 : 0; + _view.zoom(scale, offset); + } + int64_t cur_time = QDateTime::currentMSecsSinceEpoch(); + if (cur_time - last_time > 50) + active = true; + else + active = false; + } else { + _view.zoom(-event->delta() / 80, offset); + } + #else _view.zoom(event->delta() / 80, offset); + #endif } else if (event->orientation() == Qt::Horizontal) { // Horizontal scrolling is interpreted as moving left/right - _view.set_scale_offset(_view.scale(), - event->delta() + _view.offset()); + if (!(event->modifiers() & Qt::ShiftModifier)) + _view.set_scale_offset(_view.scale(), + _view.offset() - event->delta()); } } @@ -1027,6 +1055,32 @@ void Viewport::wheelEvent(QWheelEvent *event) measure(); } +bool Viewport::gestureEvent(QNativeGestureEvent *event) +{ + static double total_scale = 0; + switch(event->gestureType()) { + case Qt::BeginNativeGesture: + break; + case Qt::EndNativeGesture: + total_scale = 0; + break; + case Qt::ZoomNativeGesture: { + total_scale += event->value() * 2; + if (_view.zoom(total_scale, _view.hover_point().x())) + total_scale = 0; + } + break; + case Qt::SmartZoomNativeGesture: + _view.zoom(-1, _view.hover_point().x()); + break; + default: + return QWidget::event(event); + } + + measure(); + return true; +} + void Viewport::leaveEvent(QEvent *) { _mouse_point = QPoint(-1, -1); diff --git a/DSView/pv/view/viewport.h b/DSView/pv/view/viewport.h index 8773c5e3..aac7b55e 100755 --- a/DSView/pv/view/viewport.h +++ b/DSView/pv/view/viewport.h @@ -32,6 +32,7 @@ #include #include #include +#include #include "../view/view.h" #include "../../extdef.h" @@ -107,16 +108,18 @@ public: bool get_dso_trig_moved() const; protected: - void paintEvent(QPaintEvent *event); + bool event(QEvent *event) override; + void paintEvent(QPaintEvent *event) override; private: - void mousePressEvent(QMouseEvent *event); - void mouseMoveEvent(QMouseEvent *event); - void mouseReleaseEvent(QMouseEvent *event); - void mouseDoubleClickEvent(QMouseEvent *event); - void wheelEvent(QWheelEvent *event); - void leaveEvent(QEvent *); - void resizeEvent(QResizeEvent *e); + void mousePressEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + void mouseDoubleClickEvent(QMouseEvent *event) override; + void wheelEvent(QWheelEvent *event) override; + void leaveEvent(QEvent *) override; + void resizeEvent(QResizeEvent *e) override; + bool gestureEvent(QNativeGestureEvent *event); void paintSignals(QPainter& p, QColor fore, QColor back); void paintProgress(QPainter& p, QColor fore, QColor back);