-void Viewport::wheelEvent(QWheelEvent *event)
-{
- assert(event);
- _view.zoom(event->delta() / 120, event->x());
+ 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;
+ }
+
+ 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);
+ }
+
+ 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();
+ }
+ }
+
+ return true;