Bugzilla – Attachment 520 Details for
Bug 1056
Trackpad gestures and zooming behave very, very poorly on OSX
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Partial patch towards using QGestureEvents
0003-Partial-progress-towards-using-the-Qt-gesture-recogn.patch (text/plain), 4.64 KB, created by
Ryan Govostes
on 2019-03-20 05:39:46 CET
(
hide
)
Description:
Partial patch towards using QGestureEvents
Filename:
MIME Type:
Creator:
Ryan Govostes
Created:
2019-03-20 05:39:46 CET
Size:
4.64 KB
patch
obsolete
>From 3ec969a001f1c840e3a3d199b8224865ff4990ff Mon Sep 17 00:00:00 2001 >From: Ryan Govostes <rgovostes+git@gmail.com> >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<ViewItem> Viewport::get_mouse_over_item(const QPoint &pt) >@@ -108,49 +111,43 @@ vector< shared_ptr<ViewItem> > Viewport::items() > return items; > } > >-bool Viewport::touch_event(QTouchEvent *event) >+bool Viewport::event(QEvent *event) > { >- QList<QTouchEvent::TouchPoint> touchPoints = event->touchPoints(); >- >- if (touchPoints.count() != 2) { >- pinch_zoom_active_ = false; >- return false; >- } >+ if (event->type() == QEvent::Gesture) >+ return gestureEvent(static_cast<QGestureEvent*>(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<double>(); >- pinch_offset1_ = (view_.offset() + view_.scale() * touchPoint1.pos().x()).convert_to<double>(); >- pinch_zoom_active_ = true; >- } >+ // Handle pinch-to-zoom gestures >+ if (auto pinch = static_cast<QPinchGesture *>(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<QPanGesture *>(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 <boost/optional.hpp> > >+#include <QGestureEvent> > #include <QPoint> > #include <QTimer> >-#include <QTouchEvent> > > #include "pv/util.hpp" > #include "viewwidget.hpp" >@@ -87,10 +87,15 @@ private: > vector< shared_ptr<ViewItem> > 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<pv::util::Timestamp> 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 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 1056
:
518
|
519
| 520