From f65e1e52b5705239db09e58e8d7da9c1149e8790 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 31 Dec 2019 19:49:09 +1100 Subject: [PATCH] implemented scroll wheel zooming in all TimelineViewBase derivatives --- app/widget/curvewidget/curveview.cpp | 17 ++++++++++++++ app/widget/curvewidget/curveview.h | 2 ++ app/widget/curvewidget/curvewidget.cpp | 1 + app/widget/curvewidget/curvewidget.h | 4 +++- app/widget/keyframeview/keyframeview.cpp | 7 ++++++ app/widget/keyframeview/keyframeview.h | 3 +++ app/widget/nodeparamview/nodeparamview.cpp | 3 +++ app/widget/nodeparamview/nodeparamview.h | 3 ++- .../timelinewidget/view/timelineview.cpp | 4 +++- .../timelinewidget/view/timelineviewbase.cpp | 23 +++++++++++++++++++ .../timelinewidget/view/timelineviewbase.h | 4 ++++ 11 files changed, 68 insertions(+), 3 deletions(-) diff --git a/app/widget/curvewidget/curveview.cpp b/app/widget/curvewidget/curveview.cpp index 9d651402a..256fe9f27 100644 --- a/app/widget/curvewidget/curveview.cpp +++ b/app/widget/curvewidget/curveview.cpp @@ -201,6 +201,23 @@ void CurveView::VerticalScaleChangedEvent(double scale) } } +void CurveView::wheelEvent(QWheelEvent *event) +{ + if (WheelEventIsAZoomEvent(event)) { + if (event->delta() != 0) { + if (event->delta() > 0) { + emit ScaleChanged(scale_ * 1.1); + SetYScale(y_scale_ * 1.1); + } else { + emit ScaleChanged(scale_ * 0.9); + SetYScale(y_scale_ * 0.9); + } + } + } else { + KeyframeViewBase::wheelEvent(event); + } +} + QList CurveView::GetKeyframesSortedByTime() { QList sorted; diff --git a/app/widget/curvewidget/curveview.h b/app/widget/curvewidget/curveview.h index 974003f7c..b240c3d40 100644 --- a/app/widget/curvewidget/curveview.h +++ b/app/widget/curvewidget/curveview.h @@ -27,6 +27,8 @@ protected: virtual void VerticalScaleChangedEvent(double scale) override; + virtual void wheelEvent(QWheelEvent* event) override; + private: QList GetKeyframesSortedByTime(); diff --git a/app/widget/curvewidget/curvewidget.cpp b/app/widget/curvewidget/curvewidget.cpp index a48d34be8..6cc8cb41e 100644 --- a/app/widget/curvewidget/curvewidget.cpp +++ b/app/widget/curvewidget/curvewidget.cpp @@ -66,6 +66,7 @@ CurveWidget::CurveWidget(QWidget *parent) : connect(ruler_, &TimeRuler::TimeChanged, this, &CurveWidget::UpdateBridgeTime); connect(view_, &CurveView::TimeChanged, this, &CurveWidget::UpdateBridgeTime); connect(view_->scene(), &QGraphicsScene::selectionChanged, this, &CurveWidget::SelectionChanged); + connect(view_, &CurveView::ScaleChanged, this, &CurveWidget::SetScale); widget_bridge_layout_ = new QHBoxLayout(); widget_bridge_layout_->addStretch(); diff --git a/app/widget/curvewidget/curvewidget.h b/app/widget/curvewidget/curvewidget.h index 6b95fae51..8d09d64ea 100644 --- a/app/widget/curvewidget/curvewidget.h +++ b/app/widget/curvewidget/curvewidget.h @@ -26,11 +26,13 @@ public: void SetTime(const int64_t& timestamp); const double& GetScale(); - void SetScale(const double& scale); const double& GetVerticalScale(); void SetVerticalScale(const double& vscale); +public slots: + void SetScale(const double& scale); + signals: void TimeChanged(const int64_t& timestamp); diff --git a/app/widget/keyframeview/keyframeview.cpp b/app/widget/keyframeview/keyframeview.cpp index 3ae79242c..d65abe925 100644 --- a/app/widget/keyframeview/keyframeview.cpp +++ b/app/widget/keyframeview/keyframeview.cpp @@ -6,6 +6,13 @@ KeyframeView::KeyframeView(QWidget *parent) : setAlignment(Qt::AlignLeft | Qt::AlignTop); } +void KeyframeView::wheelEvent(QWheelEvent *event) +{ + if (!HandleZoomFromScroll(event)) { + KeyframeViewBase::wheelEvent(event); + } +} + void KeyframeView::AddKeyframe(NodeKeyframePtr key, int y) { QPoint global_pt(0, y); diff --git a/app/widget/keyframeview/keyframeview.h b/app/widget/keyframeview/keyframeview.h index 744721b53..61fec1d03 100644 --- a/app/widget/keyframeview/keyframeview.h +++ b/app/widget/keyframeview/keyframeview.h @@ -9,6 +9,9 @@ class KeyframeView : public KeyframeViewBase public: KeyframeView(QWidget* parent = nullptr); +protected: + virtual void wheelEvent(QWheelEvent* event) override; + public slots: void AddKeyframe(NodeKeyframePtr key, int y); diff --git a/app/widget/nodeparamview/nodeparamview.cpp b/app/widget/nodeparamview/nodeparamview.cpp index 744db0ac4..30a5a194c 100644 --- a/app/widget/nodeparamview/nodeparamview.cpp +++ b/app/widget/nodeparamview/nodeparamview.cpp @@ -79,6 +79,9 @@ NodeParamView::NodeParamView(QWidget *parent) : connect(ruler_, &TimeRuler::TimeChanged, this, &NodeParamView::RulerTimeChanged); connect(keyframe_view_, &KeyframeView::TimeChanged, this, &NodeParamView::RulerTimeChanged); + // Connect keyframe view scaling to this + connect(keyframe_view_, &KeyframeView::ScaleChanged, this, &NodeParamView::SetScale); + splitter->addWidget(keyframe_area); // Set both widgets to 50/50 diff --git a/app/widget/nodeparamview/nodeparamview.h b/app/widget/nodeparamview/nodeparamview.h index d4310c353..800bac25b 100644 --- a/app/widget/nodeparamview/nodeparamview.h +++ b/app/widget/nodeparamview/nodeparamview.h @@ -39,9 +39,10 @@ public: const QList& nodes(); const double& GetScale() const; - void SetScale(const double &scale); public slots: + void SetScale(const double &scale); + void SetTime(const int64_t& timestamp); signals: diff --git a/app/widget/timelinewidget/view/timelineview.cpp b/app/widget/timelinewidget/view/timelineview.cpp index 9d44cf914..203596bbb 100644 --- a/app/widget/timelinewidget/view/timelineview.cpp +++ b/app/widget/timelinewidget/view/timelineview.cpp @@ -116,7 +116,9 @@ void TimelineView::mouseDoubleClickEvent(QMouseEvent *event) void TimelineView::wheelEvent(QWheelEvent *event) { - if (Config::Current()["InvertTimelineScrollAxes"].toBool()) { + if (HandleZoomFromScroll(event)) { + return; + } else if (Config::Current()["InvertTimelineScrollAxes"].toBool()) { QWheelEvent e(event->pos(), event->delta(), event->buttons(), diff --git a/app/widget/timelinewidget/view/timelineviewbase.cpp b/app/widget/timelinewidget/view/timelineviewbase.cpp index 2c37d617a..915b209a2 100644 --- a/app/widget/timelinewidget/view/timelineviewbase.cpp +++ b/app/widget/timelinewidget/view/timelineviewbase.cpp @@ -213,6 +213,29 @@ void TimelineViewBase::ScaleChangedEvent(double scale) Q_UNUSED(scale) } +bool TimelineViewBase::HandleZoomFromScroll(QWheelEvent *event) +{ + if (WheelEventIsAZoomEvent(event)) { + // If CTRL is held (or a preference is set to swap CTRL behavior), we zoom instead of scrolling + if (event->delta() != 0) { + if (event->delta() > 0) { + emit ScaleChanged(scale_ * 2.0); + } else { + emit ScaleChanged(scale_ * 0.5); + } + } + + return true; + } + + return false; +} + +bool TimelineViewBase::WheelEventIsAZoomEvent(QWheelEvent *event) +{ + return (static_cast(event->modifiers() & Qt::ControlModifier) == !Config::Current()["ScrollZooms"].toBool()); +} + void TimelineViewBase::SetLimitYAxis(bool e) { limit_y_axis_ = true; diff --git a/app/widget/timelinewidget/view/timelineviewbase.h b/app/widget/timelinewidget/view/timelineviewbase.h index 516656573..25cd85015 100644 --- a/app/widget/timelinewidget/view/timelineviewbase.h +++ b/app/widget/timelinewidget/view/timelineviewbase.h @@ -34,6 +34,10 @@ protected: virtual void ScaleChangedEvent(double scale); + bool HandleZoomFromScroll(QWheelEvent* event); + + bool WheelEventIsAZoomEvent(QWheelEvent* event); + void SetLimitYAxis(bool e); rational GetPlayheadTime();