From 0e82ec600d6906dca5b8941373590f2638737a7d Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 25 Jan 2020 18:00:35 +1100 Subject: [PATCH] keyframes: implemented same single frame strategy on bezier control points --- app/widget/keyframeview/keyframeviewbase.cpp | 40 +++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/app/widget/keyframeview/keyframeviewbase.cpp b/app/widget/keyframeview/keyframeviewbase.cpp index 49f5057f2..bcb8ad30b 100644 --- a/app/widget/keyframeview/keyframeviewbase.cpp +++ b/app/widget/keyframeview/keyframeviewbase.cpp @@ -97,9 +97,6 @@ void KeyframeViewBase::mousePressEvent(QMouseEvent *event) for (int i=0;i(selected_items.at(i)); - // Block signals for dragging for now - key->key()->parent()->blockSignals(true); - selected_keys_.replace(i, {key, key->x(), key->key()->time(), key->key()->value().toDouble()}); } } @@ -127,6 +124,8 @@ void KeyframeViewBase::mouseMoveEvent(QMouseEvent *event) false); } else if (!selected_keys_.isEmpty()) { foreach (const KeyframeItemAndTime& keypair, selected_keys_) { + keypair.key->key()->parent()->blockSignals(true); + keypair.key->key()->set_time(CalculateNewTimeFromScreen(keypair.time, mouse_diff_scaled.x())); if (y_axis_enabled_) { @@ -136,8 +135,8 @@ void KeyframeViewBase::mouseMoveEvent(QMouseEvent *event) // We emit a custom value changed signal while the keyframe is being dragged so only the currently viewed // frame gets rendered in this time keypair.key->key()->parent()->blockSignals(false); + emit keypair.key->key()->parent()->ValueChanged(GetPlayheadTime(), GetPlayheadTime()); - keypair.key->key()->parent()->blockSignals(true); } } } @@ -170,6 +169,8 @@ void KeyframeViewBase::mouseReleaseEvent(QMouseEvent *event) foreach (const KeyframeItemAndTime& keypair, selected_keys_) { KeyframeViewItem* item = keypair.key; + keypair.key->key()->parent()->blockSignals(true); + // Calculate the new time for this keyframe rational new_time = CalculateNewTimeFromScreen(keypair.time, mouse_diff_scaled.x()); @@ -280,15 +281,17 @@ void KeyframeViewBase::ProcessBezierDrag(QPointF mouse_diff_scaled, bool include new_opposing_pos = dragging_bezier_point_opposing_start_; } - dragging_bezier_point_->key()->set_bezier_control(dragging_bezier_point_->mode(), - new_bezier_pos); - - dragging_bezier_point_->key()->set_bezier_control(opposing_type, - new_opposing_pos); - if (undoable) { QUndoCommand* command = new QUndoCommand(); + // Similar to the code in MouseRelease, we manipulated the signalling earlier and need to set the keys back to their + // original position to allow the input to signal correctly when the undo command is pushed. + + dragging_bezier_point_->key()->parent()->blockSignals(true); + + dragging_bezier_point_->key()->set_bezier_control(dragging_bezier_point_->mode(), + dragging_bezier_point_start_); + new KeyframeSetBezierControlPoint(dragging_bezier_point_->key(), dragging_bezier_point_->mode(), new_bezier_pos, @@ -296,6 +299,9 @@ void KeyframeViewBase::ProcessBezierDrag(QPointF mouse_diff_scaled, bool include command); if (include_opposing) { + dragging_bezier_point_->key()->set_bezier_control(opposing_type, + dragging_bezier_point_opposing_start_); + new KeyframeSetBezierControlPoint(dragging_bezier_point_->key(), opposing_type, new_opposing_pos, @@ -303,7 +309,21 @@ void KeyframeViewBase::ProcessBezierDrag(QPointF mouse_diff_scaled, bool include command); } + dragging_bezier_point_->key()->parent()->blockSignals(false); + Core::instance()->undo_stack()->push(command); + } else { + dragging_bezier_point_->key()->parent()->blockSignals(true); + + dragging_bezier_point_->key()->set_bezier_control(dragging_bezier_point_->mode(), + new_bezier_pos); + + dragging_bezier_point_->key()->set_bezier_control(opposing_type, + new_opposing_pos); + + dragging_bezier_point_->key()->parent()->blockSignals(false); + + emit dragging_bezier_point_->key()->parent()->ValueChanged(GetPlayheadTime(), GetPlayheadTime()); } }