From 3ec969a001f1c840e3a3d199b8224865ff4990ff Mon Sep 17 00:00:00 2001 From: Ryan Govostes Date: Wed, 20 Mar 2019 00:19:45 -0400 Subject: [PATCH 3/3] Partial progress towards using the Qt gesture recognition API --- pv/views/trace/viewport.cpp | 71 ++++++++++++++++++------------------- pv/views/trace/viewport.hpp | 16 +++++---- 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/pv/views/trace/viewport.cpp b/pv/views/trace/viewport.cpp index 44c912a..d1522e0 100644 --- a/pv/views/trace/viewport.cpp +++ b/pv/views/trace/viewport.cpp @@ -49,11 +49,14 @@ namespace views { namespace trace { Viewport::Viewport(View &parent) : - ViewWidget(parent), - pinch_zoom_active_(false) + ViewWidget(parent) { setAutoFillBackground(true); setBackgroundRole(QPalette::Base); + + // Register for gestures + grabGesture(Qt::PanGesture); + grabGesture(Qt::PinchGesture); } shared_ptr Viewport::get_mouse_over_item(const QPoint &pt) @@ -108,49 +111,43 @@ vector< shared_ptr > Viewport::items() return items; } -bool Viewport::touch_event(QTouchEvent *event) +bool Viewport::event(QEvent *event) { - QList touchPoints = event->touchPoints(); - - if (touchPoints.count() != 2) { - pinch_zoom_active_ = false; - return false; - } + if (event->type() == QEvent::Gesture) + return gestureEvent(static_cast(event)); + return ViewWidget::event(event); +} - const QTouchEvent::TouchPoint &touchPoint0 = touchPoints.first(); - const QTouchEvent::TouchPoint &touchPoint1 = touchPoints.last(); +bool Viewport::gestureEvent(QGestureEvent *event) +{ + assert(event); - if (!pinch_zoom_active_ || - (event->touchPointStates() & Qt::TouchPointPressed)) { - pinch_offset0_ = (view_.offset() + view_.scale() * touchPoint0.pos().x()).convert_to(); - pinch_offset1_ = (view_.offset() + view_.scale() * touchPoint1.pos().x()).convert_to(); - pinch_zoom_active_ = true; - } + // Handle pinch-to-zoom gestures + if (auto pinch = static_cast(event->gesture(Qt::PinchGesture))) { + if (pinch->state() == Qt::GestureStarted) { + gesture_start_scale_ = view_.scale(); + gesture_start_offset_ = view_.offset(); + } - double w = touchPoint1.pos().x() - touchPoint0.pos().x(); - if (abs(w) >= 1.0) { - const double scale = - fabs((pinch_offset1_ - pinch_offset0_) / w); - double offset = pinch_offset0_ - touchPoint0.pos().x() * scale; - if (scale > 0) - view_.set_scale_offset(scale, offset); + // FIXME: Make pinch-to-zoom more intuitive + auto flags = QPinchGesture::ScaleFactorChanged | QPinchGesture::CenterPointChanged; + if (pinch->changeFlags() & flags) { + double scale = gesture_start_scale_ * pinch->totalScaleFactor(); + double xdelta = pinch->centerPoint().x() - pinch->startCenterPoint().x(); + pv::util::Timestamp offset = gesture_start_offset_ + xdelta * scale; + if (scale > 0.0) { + view_.set_scale_offset(scale, offset); + } + } + return true; } - if (event->touchPointStates() & Qt::TouchPointReleased) { - pinch_zoom_active_ = false; - - if (touchPoint0.state() & Qt::TouchPointReleased) { - // Primary touch released - drag_release(); - } else { - // Update the mouse down fields so that continued - // dragging with the primary touch will work correctly - mouse_down_point_ = touchPoint0.pos().toPoint(); - drag(); - } + if (auto pan = static_cast(event->gesture(Qt::PanGesture))) { + // TODO: Implement + return true; } - return true; + return false; } void Viewport::paintEvent(QPaintEvent*) diff --git a/pv/views/trace/viewport.hpp b/pv/views/trace/viewport.hpp index 1b77a0d..d633798 100644 --- a/pv/views/trace/viewport.hpp +++ b/pv/views/trace/viewport.hpp @@ -22,9 +22,9 @@ #include +#include #include #include -#include #include "pv/util.hpp" #include "viewwidget.hpp" @@ -87,10 +87,15 @@ private: vector< shared_ptr > items(); /** - * Handles touch begin update and end events. + * Main event handler; dispatches gesture events to gestureEvent(). + */ + bool event(QEvent *event); + + /** + * Handles gesture-related events. * @param e the event that triggered this handler. */ - bool touch_event(QTouchEvent *event); + bool gestureEvent(QGestureEvent *event); private: void paintEvent(QPaintEvent *event); @@ -102,9 +107,8 @@ private: boost::optional drag_offset_; int drag_v_offset_; - double pinch_offset0_; - double pinch_offset1_; - bool pinch_zoom_active_; + double gesture_start_scale_; + pv::util::Timestamp gesture_start_offset_; }; } // namespace trace -- 2.20.1