From 6d32550459ae8cdc67a6c6d397e77d335907635c Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Mon, 25 Oct 2021 14:48:07 +0200 Subject: [PATCH] Improve 2d view navigation - Get rid of lag when two-finger-swiping - Enable one finger swipe and scroll gestures for the magic mouse - Fixed a bug where the toolbar zoom slider from the transition.- and timeline editor where not updated when zooming with a gesture. - When scrolling the curve editor, its toolbar was scrolling together with the rest of the view. This is now fixed in order to be consistent with the timeline view and transition editor. Change-Id: I611015af134976588fbcada0bc5ccfdcf8039c27 Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/CMakeLists.txt | 1 - .../componentcore/componentcore.pri | 2 - .../components/componentcore/gestures.cpp | 156 ------------------ .../components/componentcore/gestures.h | 72 -------- .../components/componentcore/navigation2d.cpp | 83 +++++----- .../components/componentcore/navigation2d.h | 22 +-- .../components/curveeditor/curveeditor.cpp | 9 +- .../curveeditor/detail/graphicsview.cpp | 25 ++- .../formeditor/formeditorgraphicsview.cpp | 28 +--- .../timelineeditor/timelinewidget.cpp | 21 ++- .../timelineeditor/timelinewidget.h | 3 +- .../transitioneditorwidget.cpp | 21 ++- .../transitioneditor/transitioneditorwidget.h | 4 +- src/plugins/qmldesigner/qmldesignerplugin.cpp | 3 - src/plugins/qmldesigner/qmldesignerplugin.qbs | 2 - 15 files changed, 111 insertions(+), 341 deletions(-) delete mode 100644 src/plugins/qmldesigner/components/componentcore/gestures.cpp delete mode 100644 src/plugins/qmldesigner/components/componentcore/gestures.h diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 467a33b40a3..1aac7a17cd8 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -134,7 +134,6 @@ extend_qtc_plugin(QmlDesigner modelnodeoperations.cpp modelnodeoperations.h formatoperation.cpp formatoperation.h navigation2d.cpp navigation2d.h - gestures.cpp gestures.h qmldesignericonprovider.cpp qmldesignericonprovider.h selectioncontext.cpp selectioncontext.h theme.cpp theme.h diff --git a/src/plugins/qmldesigner/components/componentcore/componentcore.pri b/src/plugins/qmldesigner/components/componentcore/componentcore.pri index a64f61ab466..49d646d4627 100644 --- a/src/plugins/qmldesigner/components/componentcore/componentcore.pri +++ b/src/plugins/qmldesigner/components/componentcore/componentcore.pri @@ -5,7 +5,6 @@ SOURCES += addimagesdialog.cpp SOURCES += changestyleaction.cpp SOURCES += theme.cpp SOURCES += findimplementation.cpp -SOURCES += gestures.cpp SOURCES += addsignalhandlerdialog.cpp SOURCES += layoutingridlayout.cpp SOURCES += abstractactiongroup.cpp @@ -27,7 +26,6 @@ HEADERS += addimagesdialog.h HEADERS += changestyleaction.h HEADERS += theme.h HEADERS += findimplementation.h -HEADERS += gestures.h HEADERS += addsignalhandlerdialog.h HEADERS += layoutingridlayout.h HEADERS += abstractactiongroup.h diff --git a/src/plugins/qmldesigner/components/componentcore/gestures.cpp b/src/plugins/qmldesigner/components/componentcore/gestures.cpp deleted file mode 100644 index 29ff23c2435..00000000000 --- a/src/plugins/qmldesigner/components/componentcore/gestures.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Design Tooling -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "gestures.h" - -#include - -namespace QmlDesigner { - -Qt::GestureType TwoFingerSwipe::m_type = static_cast(0); - -TwoFingerSwipe::TwoFingerSwipe() {} - -Qt::GestureType TwoFingerSwipe::type() -{ - return m_type; -} - -void TwoFingerSwipe::registerRecognizer() -{ - m_type = QGestureRecognizer::registerRecognizer(new TwoFingerSwipeRecognizer()); -} - -QPointF TwoFingerSwipe::direction() const -{ - return m_current.center() - m_last.center(); -} - -void TwoFingerSwipe::reset() -{ - m_start = QLineF(); - m_current = QLineF(); - m_last = QLineF(); -} - -QGestureRecognizer::Result TwoFingerSwipe::begin(QTouchEvent *event) -{ - Q_UNUSED(event); - return QGestureRecognizer::MayBeGesture; -} - -QGestureRecognizer::Result TwoFingerSwipe::update(QTouchEvent *event) -{ - if (event->touchPoints().size() != 2) { - if (state() == Qt::NoGesture) - return QGestureRecognizer::Ignore; - else - return QGestureRecognizer::FinishGesture; - } - - QTouchEvent::TouchPoint p0 = event->touchPoints().at(0); - QTouchEvent::TouchPoint p1 = event->touchPoints().at(1); - - QLineF line(p0.scenePos(), p1.screenPos()); - - if (m_start.isNull()) { - m_start = line; - m_current = line; - m_last = line; - } else { - auto deltaLength = line.length() - m_current.length(); - auto deltaCenter = QLineF(line.center(), m_current.center()).length(); - if (deltaLength > deltaCenter) - return QGestureRecognizer::CancelGesture; - - m_last = m_current; - m_current = line; - } - - setHotSpot(m_current.center()); - - return QGestureRecognizer::TriggerGesture; -} - -QGestureRecognizer::Result TwoFingerSwipe::end(QTouchEvent *event) -{ - Q_UNUSED(event); - bool finish = state() != Qt::NoGesture; - - reset(); - - if (finish) - return QGestureRecognizer::FinishGesture; - else - return QGestureRecognizer::CancelGesture; -} - -TwoFingerSwipeRecognizer::TwoFingerSwipeRecognizer() - : QGestureRecognizer() -{} - -QGesture *TwoFingerSwipeRecognizer::create(QObject *target) -{ - if (target && target->isWidgetType()) - qobject_cast(target)->setAttribute(Qt::WA_AcceptTouchEvents); - - return new TwoFingerSwipe; -} - -QGestureRecognizer::Result TwoFingerSwipeRecognizer::recognize(QGesture *gesture, - QObject *, - QEvent *event) -{ - if (gesture->gestureType() != TwoFingerSwipe::type()) - return QGestureRecognizer::Ignore; - - TwoFingerSwipe *swipe = static_cast(gesture); - QTouchEvent *touch = static_cast(event); - - switch (event->type()) { - case QEvent::TouchBegin: - return swipe->begin(touch); - - case QEvent::TouchUpdate: - return swipe->update(touch); - - case QEvent::TouchEnd: - return swipe->end(touch); - - default: - return QGestureRecognizer::Ignore; - } -} - -void TwoFingerSwipeRecognizer::reset(QGesture *gesture) -{ - if (gesture->gestureType() == TwoFingerSwipe::type()) { - TwoFingerSwipe *swipe = static_cast(gesture); - swipe->reset(); - } - QGestureRecognizer::reset(gesture); -} - -} // End namespace QmlDesigner. diff --git a/src/plugins/qmldesigner/components/componentcore/gestures.h b/src/plugins/qmldesigner/components/componentcore/gestures.h deleted file mode 100644 index 3100560904b..00000000000 --- a/src/plugins/qmldesigner/components/componentcore/gestures.h +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2020 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Design Tooling -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ -#pragma once - -#include -#include -#include - -QT_FORWARD_DECLARE_CLASS(QTouchEvent) - -namespace QmlDesigner { - -class TwoFingerSwipe : public QGesture -{ - Q_OBJECT - -public: - TwoFingerSwipe(); - - static Qt::GestureType type(); - static void registerRecognizer(); - - QPointF direction() const; - - void reset(); - QGestureRecognizer::Result begin(QTouchEvent *event); - QGestureRecognizer::Result update(QTouchEvent *event); - QGestureRecognizer::Result end(QTouchEvent *event); - -private: - static Qt::GestureType m_type; - - QLineF m_start; - QLineF m_current; - QLineF m_last; -}; - -class TwoFingerSwipeRecognizer : public QGestureRecognizer -{ -public: - TwoFingerSwipeRecognizer(); - - QGesture *create(QObject *target) override; - - QGestureRecognizer::Result recognize(QGesture *gesture, QObject *watched, QEvent *event) override; - - void reset(QGesture *gesture) override; -}; - -} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/componentcore/navigation2d.cpp b/src/plugins/qmldesigner/components/componentcore/navigation2d.cpp index eccd8a517ed..3399c2a8914 100644 --- a/src/plugins/qmldesigner/components/componentcore/navigation2d.cpp +++ b/src/plugins/qmldesigner/components/componentcore/navigation2d.cpp @@ -23,44 +23,38 @@ ** ****************************************************************************/ #include "navigation2d.h" -#include "gestures.h" #include +#include #include +#include #include namespace QmlDesigner { -Navigation2dScrollBar::Navigation2dScrollBar(QWidget *parent) - : QScrollBar(parent) -{} - -bool Navigation2dScrollBar::postEvent(QEvent *event) +void Navigation2dFilter::scroll(const QPointF &direction, QScrollBar *sbx, QScrollBar *sby) { - if (event->type() == QEvent::Wheel) { - wheelEvent(static_cast(event)); - return true; - } - return false; + auto doScroll = [](QScrollBar *sb, float distance) { + if (sb) { + // max - min + pageStep = sceneRect.size * scale + float d1 = sb->maximum() - sb->minimum(); + float d2 = d1 + sb->pageStep(); + + float val = (distance / d2) * d1; + sb->setValue(sb->value() - val); + } + }; + + doScroll(sbx, direction.x()); + doScroll(sby, direction.y()); } -void Navigation2dScrollBar::wheelEvent(QWheelEvent *event) -{ - if (!event->angleDelta().isNull()) - QScrollBar::wheelEvent(event); -} - - -Navigation2dFilter::Navigation2dFilter(QWidget *parent, Navigation2dScrollBar *scrollbar) +Navigation2dFilter::Navigation2dFilter(QWidget *parent) : QObject(parent) - , m_scrollbar(scrollbar) { - if (parent) { + if (parent) parent->grabGesture(Qt::PinchGesture); - if (!scrollbar) - parent->grabGesture(TwoFingerSwipe::type()); - } } bool Navigation2dFilter::eventFilter(QObject *object, QEvent *event) @@ -82,34 +76,39 @@ bool Navigation2dFilter::gestureEvent(QGestureEvent *event) event->accept(); return true; } - } else if (TwoFingerSwipe *swipe = static_cast( - event->gesture(TwoFingerSwipe::type()))) { - emit panChanged(swipe->direction()); - event->accept(); - return true; } return false; } bool Navigation2dFilter::wheelEvent(QWheelEvent *event) { - if (m_scrollbar) { - if (m_scrollbar->postEvent(event)) - event->ignore(); + if (event->source() == Qt::MouseEventSynthesizedBySystem) { + emit panChanged(QPointF(event->pixelDelta())); + event->accept(); + return true; } else if (event->source() == Qt::MouseEventNotSynthesized) { - if (event->modifiers().testFlag(Qt::ControlModifier)) { - if (QPointF angle = event->angleDelta(); !angle.isNull()) { - double delta = std::abs(angle.x()) > std::abs(angle.y()) ? angle.x() : angle.y(); - if (delta > 0) - emit zoomIn(); - else - emit zoomOut(); - event->accept(); - return true; + + auto zoomInSignal = QMetaMethod::fromSignal(&Navigation2dFilter::zoomIn); + bool zoomInConnected = QObject::isSignalConnected(zoomInSignal); + + auto zoomOutSignal = QMetaMethod::fromSignal(&Navigation2dFilter::zoomOut); + bool zoomOutConnected = QObject::isSignalConnected(zoomOutSignal); + + if (zoomInConnected && zoomOutConnected) { + if (event->modifiers().testFlag(Qt::ControlModifier)) { + if (QPointF angle = event->angleDelta(); !angle.isNull()) { + double delta = std::abs(angle.x()) > std::abs(angle.y()) ? angle.x() : angle.y(); + if (delta > 0) + emit zoomIn(); + else + emit zoomOut(); + event->accept(); + return true; + } } } } - return true; + return false; } } // End namespace QmlDesigner. diff --git a/src/plugins/qmldesigner/components/componentcore/navigation2d.h b/src/plugins/qmldesigner/components/componentcore/navigation2d.h index fe432b4a6b4..8a4513ed821 100644 --- a/src/plugins/qmldesigner/components/componentcore/navigation2d.h +++ b/src/plugins/qmldesigner/components/componentcore/navigation2d.h @@ -24,27 +24,14 @@ ****************************************************************************/ #pragma once -#include +#include QT_FORWARD_DECLARE_CLASS(QGestureEvent) +QT_FORWARD_DECLARE_CLASS(QScrollBar) QT_FORWARD_DECLARE_CLASS(QWheelEvent) namespace QmlDesigner { -class Navigation2dScrollBar : public QScrollBar -{ - Q_OBJECT - -public: - Navigation2dScrollBar(QWidget *parent = nullptr); - - bool postEvent(QEvent *event); - -protected: - void wheelEvent(QWheelEvent *event) override; -}; - - class Navigation2dFilter : public QObject { Q_OBJECT @@ -57,7 +44,9 @@ signals: void zoomOut(); public: - Navigation2dFilter(QWidget *parent = nullptr, Navigation2dScrollBar *scrollbar = nullptr); + static void scroll(const QPointF &direction, QScrollBar *sbx, QScrollBar *sby); + + Navigation2dFilter(QWidget *parent); protected: bool eventFilter(QObject *obj, QEvent *event) override; @@ -65,7 +54,6 @@ protected: private: bool gestureEvent(QGestureEvent *event); bool wheelEvent(QWheelEvent *event); - Navigation2dScrollBar *m_scrollbar = nullptr; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/curveeditor/curveeditor.cpp b/src/plugins/qmldesigner/components/curveeditor/curveeditor.cpp index acc77acf0a5..534799efcd9 100644 --- a/src/plugins/qmldesigner/components/curveeditor/curveeditor.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/curveeditor.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -40,16 +41,20 @@ namespace QmlDesigner { CurveEditor::CurveEditor(CurveEditorModel *model, QWidget *parent) : QWidget(parent) , m_tree(new TreeView(model, this)) - , m_view(new GraphicsView(model)) + , m_view(new GraphicsView(model, this)) { auto *splitter = new QSplitter; splitter->addWidget(m_tree); splitter->addWidget(m_view); splitter->setStretchFactor(1, 2); + QScrollArea* area = new QScrollArea; + area->setWidget(splitter); + area->setWidgetResizable(true); + auto *box = new QVBoxLayout; box->addWidget(createToolBar(model)); - box->addWidget(splitter); + box->addWidget(area); setLayout(box); connect(m_tree, &TreeView::treeItemLocked, model, &CurveEditorModel::setLocked); diff --git a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp index 23daabba66e..02a8dcd3a76 100644 --- a/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp +++ b/src/plugins/qmldesigner/components/curveeditor/detail/graphicsview.cpp @@ -45,6 +45,18 @@ namespace QmlDesigner { +template< typename T > +T* nextParentOfType(QWidget* widget) +{ + auto* p = widget->parent(); + while (p) { + if (T* w = qobject_cast(p)) + return w; + p = p->parent(); + } + return nullptr; +} + GraphicsView::GraphicsView(CurveEditorModel *model, QWidget *parent) : QGraphicsView(parent) , m_dragging(false) @@ -65,7 +77,7 @@ GraphicsView::GraphicsView(CurveEditorModel *model, QWidget *parent) setResizeAnchor(QGraphicsView::NoAnchor); setRenderHint(QPainter::Antialiasing, true); setTransformationAnchor(QGraphicsView::NoAnchor); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); setViewportUpdateMode(QGraphicsView::FullViewportUpdate); @@ -78,12 +90,19 @@ GraphicsView::GraphicsView(CurveEditorModel *model, QWidget *parent) connect(m_scene, &GraphicsScene::curveChanged, itemSlot); - QmlDesigner::Navigation2dFilter *filter = new QmlDesigner::Navigation2dFilter(this); + QmlDesigner::Navigation2dFilter *filter = new QmlDesigner::Navigation2dFilter(viewport()); + connect(filter, &Navigation2dFilter::panChanged, [this](const QPointF &direction) { + QScrollBar* verticalBar = nullptr; + if (QScrollArea* area = nextParentOfType< QScrollArea >(this)) + verticalBar = area->verticalScrollBar(); + Navigation2dFilter::scroll(direction, horizontalScrollBar(), verticalBar); + }); + auto zoomChanged = &QmlDesigner::Navigation2dFilter::zoomChanged; connect(filter, zoomChanged, [this](double scale, const QPointF &pos) { applyZoom(m_zoomX + scale, m_zoomY, mapToGlobal(pos.toPoint())); }); - installEventFilter(filter); + viewport()->installEventFilter(filter); applyZoom(m_zoomX, m_zoomY); update(); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp index 4cfa6402d56..d98e43ffef9 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorgraphicsview.cpp @@ -62,28 +62,12 @@ FormEditorGraphicsView::FormEditorGraphicsView(QWidget *parent) // eventFilter method so it works also for the space scrolling case as expected QCoreApplication::instance()->installEventFilter(this); - QmlDesigner::Navigation2dFilter *filter = new QmlDesigner::Navigation2dFilter(this); + QmlDesigner::Navigation2dFilter *filter = new QmlDesigner::Navigation2dFilter(viewport()); connect(filter, &Navigation2dFilter::zoomIn, this, &FormEditorGraphicsView::zoomIn); connect(filter, &Navigation2dFilter::zoomOut, this, &FormEditorGraphicsView::zoomOut); - auto panChanged = &Navigation2dFilter::panChanged; - connect(filter, panChanged, [this](const QPointF &direction) { - QScrollBar *sbx = horizontalScrollBar(); - QScrollBar *sby = verticalScrollBar(); - - // max - min + pageStep = sceneRect.size * scale - QPointF min(sbx->minimum(), sby->minimum()); - QPointF max(sbx->maximum(), sby->maximum()); - QPointF step(sbx->pageStep(), sby->pageStep()); - - QPointF d1 = max - min; - QPointF d2 = d1 + step; - - QPoint val = QPointF((direction.x() / d2.x()) * d1.x(), (direction.y() / d2.y()) * d1.y()) - .toPoint(); - - sbx->setValue(sbx->value() - val.x()); - sby->setValue(sby->value() - val.y()); + connect(filter, &Navigation2dFilter::panChanged, [this](const QPointF &direction) { + Navigation2dFilter::scroll(direction, horizontalScrollBar(), verticalScrollBar()); }); auto zoomChanged = &Navigation2dFilter::zoomChanged; @@ -93,7 +77,7 @@ FormEditorGraphicsView::FormEditorGraphicsView(QWidget *parent) emit this->zoomChanged(transform().m11()); } }); - installEventFilter(filter); + viewport()->installEventFilter(filter); } bool FormEditorGraphicsView::eventFilter(QObject *watched, QEvent *event) @@ -123,8 +107,8 @@ void FormEditorGraphicsView::wheelEvent(QWheelEvent *event) { if (event->modifiers().testFlag(Qt::ControlModifier)) event->ignore(); - else if (event->source() == Qt::MouseEventNotSynthesized) - QGraphicsView::wheelEvent(event); + + QGraphicsView::wheelEvent(event); } void FormEditorGraphicsView::mousePressEvent(QMouseEvent *event) diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp index b583863015f..f4ff114bf62 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.cpp @@ -118,7 +118,7 @@ TimelineWidget::TimelineWidget(TimelineView *view) , m_toolbar(new TimelineToolBar(this)) , m_rulerView(new QGraphicsView(this)) , m_graphicsView(new QGraphicsView(this)) - , m_scrollbar(new Navigation2dScrollBar(this)) + , m_scrollbar(new QScrollBar(this)) , m_statusBar(new QLabel(this)) , m_timelineView(view) , m_graphicsScene(new TimelineGraphicsScene(this)) @@ -160,7 +160,6 @@ TimelineWidget::TimelineWidget(TimelineView *view) m_graphicsView->setFrameShape(QFrame::NoFrame); m_graphicsView->setFrameShadow(QFrame::Plain); m_graphicsView->setLineWidth(0); - m_graphicsView->setVerticalScrollBar(new Navigation2dScrollBar); m_graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); m_graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -274,13 +273,19 @@ TimelineWidget::TimelineWidget(TimelineView *view) m_timelineView->addNewTimelineDialog(); }); - Navigation2dFilter *filter = new Navigation2dFilter(this, m_scrollbar); - connect(filter, &Navigation2dFilter::zoomChanged, [this](double scale, const QPointF& pos) { - int s = static_cast(std::round(scale*100.)); - double ps = m_graphicsScene->mapFromScene(pos.x()); - m_graphicsScene->setZoom(std::clamp(m_graphicsScene->zoom() + s, 0, 100), ps); + Navigation2dFilter *filter = new Navigation2dFilter(m_graphicsView->viewport()); + connect(filter, &Navigation2dFilter::panChanged, [this](const QPointF &direction) { + Navigation2dFilter::scroll(direction, m_scrollbar, m_graphicsView->verticalScrollBar()); }); - installEventFilter(filter); + + connect(filter, &Navigation2dFilter::zoomChanged, [this](double scale, const QPointF &pos) { + int s = static_cast(std::round(scale*100.)); + int scaleFactor = std::clamp(m_graphicsScene->zoom() + s, 0, 100); + double ps = m_graphicsScene->mapFromScene(pos.x()); + m_graphicsScene->setZoom(scaleFactor, ps); + m_toolbar->setScaleFactor(scaleFactor); + }); + m_graphicsView->viewport()->installEventFilter(filter); m_playbackAnimation->stop(); auto playAnimation = [this](QVariant frame) { graphicsScene()->setCurrentFrame(qRound(frame.toDouble())); }; diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.h b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.h index 3fa3db1abf9..ebaf00104dc 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.h +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinewidget.h @@ -40,6 +40,7 @@ QT_FORWARD_DECLARE_CLASS(QShowEvent) QT_FORWARD_DECLARE_CLASS(QString) QT_FORWARD_DECLARE_CLASS(QPushButton) QT_FORWARD_DECLARE_CLASS(QVariantAnimation) +QT_FORWARD_DECLARE_CLASS(QScrollBar) namespace QmlDesigner { @@ -97,7 +98,7 @@ private: QGraphicsView *m_graphicsView = nullptr; - Navigation2dScrollBar *m_scrollbar = nullptr; + QScrollBar *m_scrollbar = nullptr; QLabel *m_statusBar = nullptr; diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp index 1c8c042fdc3..6077c9de28c 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.cpp @@ -90,7 +90,7 @@ TransitionEditorWidget::TransitionEditorWidget(TransitionEditorView *view) , m_toolbar(new TransitionEditorToolBar(this)) , m_rulerView(new QGraphicsView(this)) , m_graphicsView(new QGraphicsView(this)) - , m_scrollbar(new Navigation2dScrollBar(this)) + , m_scrollbar(new QScrollBar(this)) , m_statusBar(new QLabel(this)) , m_transitionEditorView(view) , m_graphicsScene(new TransitionEditorGraphicsScene(this)) @@ -129,7 +129,6 @@ TransitionEditorWidget::TransitionEditorWidget(TransitionEditorView *view) m_graphicsView->setFrameShape(QFrame::NoFrame); m_graphicsView->setFrameShadow(QFrame::Plain); m_graphicsView->setLineWidth(0); - m_graphicsView->setVerticalScrollBar(new Navigation2dScrollBar); m_graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); m_graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -223,13 +222,19 @@ TransitionEditorWidget::TransitionEditorWidget(TransitionEditorView *view) m_transitionEditorView->addNewTransition(); }); - Navigation2dFilter *filter = new Navigation2dFilter(this, m_scrollbar); - connect(filter, &Navigation2dFilter::zoomChanged, [this](double scale, const QPointF& pos) { - int s = static_cast(std::round(scale*100.)); - double ps = m_graphicsScene->mapFromScene(pos.x()); - m_graphicsScene->setZoom(std::clamp(m_graphicsScene->zoom() + s, 0, 100), ps); + Navigation2dFilter *filter = new Navigation2dFilter(m_graphicsView->viewport()); + connect(filter, &Navigation2dFilter::panChanged, [this](const QPointF &direction) { + Navigation2dFilter::scroll(direction, m_scrollbar, m_graphicsView->verticalScrollBar()); }); - installEventFilter(filter); + + connect(filter, &Navigation2dFilter::zoomChanged, [this](double scale, const QPointF &pos) { + int s = static_cast(std::round(scale*100.)); + int scaleFactor = std::clamp(m_graphicsScene->zoom() + s, 0, 100); + double ps = m_graphicsScene->mapFromScene(pos.x()); + m_graphicsScene->setZoom(scaleFactor, ps); + m_toolbar->setScaleFactor(scaleFactor); + }); + m_graphicsView->viewport()->installEventFilter(filter); } void TransitionEditorWidget::setTransitionActive(bool b) diff --git a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.h b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.h index f1c4174418a..ea4b2a6affa 100644 --- a/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.h +++ b/src/plugins/qmldesigner/components/transitioneditor/transitioneditorwidget.h @@ -40,6 +40,7 @@ QT_FORWARD_DECLARE_CLASS(QResizeEvent) QT_FORWARD_DECLARE_CLASS(QShowEvent) QT_FORWARD_DECLARE_CLASS(QString) QT_FORWARD_DECLARE_CLASS(QPushButton) +QT_FORWARD_DECLARE_CLASS(QScrollBar) namespace QmlDesigner { @@ -47,7 +48,6 @@ class TransitionEditorView; class TransitionEditorToolBar; class TransitionEditorGraphicsScene; class ModelNode; -class Navigation2dScrollBar; class TransitionEditorWidget : public QWidget { @@ -88,7 +88,7 @@ private: QGraphicsView *m_graphicsView = nullptr; - Navigation2dScrollBar *m_scrollbar = nullptr; + QScrollBar *m_scrollbar = nullptr; QLabel *m_statusBar = nullptr; diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index b8affa11ff7..f23b43ddd95 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -33,7 +33,6 @@ #include "generateresource.h" #include "generatecmakelists.h" #include "nodeinstanceview.h" -#include "gestures.h" #include #include @@ -232,8 +231,6 @@ bool QmlDesignerPlugin::initialize(const QStringList & /*arguments*/, QString *e if (QFontDatabase::addApplicationFont(fontPath) < 0) qCWarning(qmldesignerLog) << "Could not add font " << fontPath << "to font database"; - TwoFingerSwipe::registerRecognizer(); - return true; } diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index a3b70ec9706..2ff2d3cb2bb 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -461,8 +461,6 @@ Project { "componentcore/findimplementation.h", "componentcore/formatoperation.cpp", "componentcore/formatoperation.h", - "componentcore/gestures.cpp", - "componentcore/gestures.h", "componentcore/layoutingridlayout.cpp", "componentcore/layoutingridlayout.h", "componentcore/theme.cpp",