From 570fa4e5b035a4ac8aa3503e677b402e8617ac9c Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 30 Dec 2019 22:22:30 +1100 Subject: [PATCH] implemented correct value changing in the CurveView widget --- app/widget/curvewidget/curveview.cpp | 10 ++---- app/widget/curvewidget/curveview.h | 4 --- app/widget/keyframeview/keyframeviewbase.cpp | 33 +++++++++++++++++--- app/widget/keyframeview/keyframeviewbase.h | 9 ++++++ 4 files changed, 40 insertions(+), 16 deletions(-) diff --git a/app/widget/curvewidget/curveview.cpp b/app/widget/curvewidget/curveview.cpp index c92e868be..b3984321b 100644 --- a/app/widget/curvewidget/curveview.cpp +++ b/app/widget/curvewidget/curveview.cpp @@ -6,12 +6,12 @@ #include "common/qtversionabstraction.h" CurveView::CurveView(QWidget *parent) : - KeyframeViewBase(parent), - y_scale_(1.0) + KeyframeViewBase(parent) { setAlignment(Qt::AlignLeft | Qt::AlignBottom); setDragMode(RubberBandDrag); setViewportUpdateMode(FullViewportUpdate); + SetYAxisEnabled(true); text_padding_ = QFontMetricsWidth(fontMetrics(), QStringLiteral("i")); @@ -36,12 +36,6 @@ void CurveView::Clear() lines_.clear(); } -void CurveView::SetYScale(const double &y_scale) -{ - y_scale_ = y_scale; - viewport()->update(); -} - void CurveView::drawBackground(QPainter *painter, const QRectF &rect) { if (timebase().isNull()) { diff --git a/app/widget/curvewidget/curveview.h b/app/widget/curvewidget/curveview.h index 84163b646..d3508858a 100644 --- a/app/widget/curvewidget/curveview.h +++ b/app/widget/curvewidget/curveview.h @@ -15,8 +15,6 @@ public: virtual void Clear() override; - void SetYScale(const double& y_scale); - public slots: void AddKeyframe(NodeKeyframePtr key); @@ -40,8 +38,6 @@ private: int text_padding_; - double y_scale_; - int minimum_grid_space_; QList lines_; diff --git a/app/widget/keyframeview/keyframeviewbase.cpp b/app/widget/keyframeview/keyframeviewbase.cpp index 889270fde..fb5b4c823 100644 --- a/app/widget/keyframeview/keyframeviewbase.cpp +++ b/app/widget/keyframeview/keyframeviewbase.cpp @@ -11,7 +11,9 @@ KeyframeViewBase::KeyframeViewBase(QWidget *parent) : TimelineViewBase(parent), - dragging_bezier_point_(nullptr) + y_scale_(1.0), + dragging_bezier_point_(nullptr), + y_axis_enabled_(false) { setDragMode(RubberBandDrag); setContextMenuPolicy(Qt::CustomContextMenu); @@ -31,6 +33,12 @@ void KeyframeViewBase::Clear() item_map_.clear(); } +void KeyframeViewBase::SetYScale(const double &y_scale) +{ + y_scale_ = y_scale; + viewport()->update(); +} + void KeyframeViewBase::RemoveKeyframe(NodeKeyframePtr key) { KeyframeAboutToBeRemoved(key.get()); @@ -79,7 +87,7 @@ void KeyframeViewBase::mousePressEvent(QMouseEvent *event) for (int i=0;i(selected_items.at(i)); - selected_keys_.replace(i, {key, key->x(), key->key()->time()}); + selected_keys_.replace(i, {key, key->x(), key->key()->time(), key->key()->value().toDouble()}); } } } @@ -108,6 +116,10 @@ void KeyframeViewBase::mouseMoveEvent(QMouseEvent *event) foreach (const KeyframeItemAndTime& keypair, selected_keys_) { // FIXME: Find some way to do single frame updates as the NodeParamViewWidgetBridge does? keypair.key->key()->set_time(CalculateNewTimeFromScreen(keypair.time, mouse_diff_scaled.x())); + + if (y_axis_enabled_) { + keypair.key->key()->set_value(keypair.value - mouse_diff_scaled.y()); + } } } } @@ -148,6 +160,14 @@ void KeyframeViewBase::mouseReleaseEvent(QMouseEvent *event) new_time, keypair.time, command); + + // Commit value if we're setting a vaule + if (y_axis_enabled_) { + new NodeParamSetKeyframeValueCommand(item->key(), + keypair.value - mouse_diff_scaled.y(), + keypair.value, + command); + } } Core::instance()->undo_stack()->push(command); @@ -177,6 +197,11 @@ void KeyframeViewBase::KeyframeAboutToBeRemoved(NodeKeyframe *) { } +void KeyframeViewBase::SetYAxisEnabled(bool e) +{ + y_axis_enabled_ = e; +} + rational KeyframeViewBase::CalculateNewTimeFromScreen(const rational &old_time, double cursor_diff) { return rational::fromDouble(old_time.toDouble() + cursor_diff); @@ -252,8 +277,8 @@ void KeyframeViewBase::ProcessBezierDrag(QPointF mouse_diff_scaled, bool include QPointF KeyframeViewBase::GetScaledCursorPos(const QPoint &cursor_pos) { - return QPointF (static_cast(cursor_pos.x()) / scale_, - cursor_pos.y());; + return QPointF(static_cast(cursor_pos.x()) / scale_, + static_cast(cursor_pos.y()) / y_scale_); } void KeyframeViewBase::ShowContextMenu() diff --git a/app/widget/keyframeview/keyframeviewbase.h b/app/widget/keyframeview/keyframeviewbase.h index ca79b0c75..5d49f547e 100644 --- a/app/widget/keyframeview/keyframeviewbase.h +++ b/app/widget/keyframeview/keyframeviewbase.h @@ -15,6 +15,8 @@ public: virtual void Clear(); + void SetYScale(const double& y_scale); + public slots: void RemoveKeyframe(NodeKeyframePtr key); @@ -31,6 +33,10 @@ protected: virtual void KeyframeAboutToBeRemoved(NodeKeyframe* key); + void SetYAxisEnabled(bool e); + + double y_scale_; + private: rational CalculateNewTimeFromScreen(const rational& old_time, double cursor_diff); @@ -46,6 +52,7 @@ private: KeyframeViewItem* key; qreal item_x; rational time; + double value; }; QMap item_map_; @@ -60,6 +67,8 @@ private: QVector selected_keys_; + bool y_axis_enabled_; + private slots: void ShowContextMenu();