diff --git a/app/node/input.cpp b/app/node/input.cpp index e025f5ed7..33ab85da4 100644 --- a/app/node/input.cpp +++ b/app/node/input.cpp @@ -737,6 +737,19 @@ void NodeInput::remove_keyframe(NodeKeyframePtr key) emit_time_range(time_affected); } +NodeKeyframePtr NodeInput::get_keyframe_shared_ptr_from_raw(NodeKeyframe* raw) const +{ + foreach (const KeyframeTrack& track, keyframe_tracks_) { + foreach (NodeKeyframePtr key, track) { + if (key.get() == raw) { + return key; + } + } + } + + return nullptr; +} + void NodeInput::KeyframeTimeChanged() { NodeKeyframe* key = static_cast(sender()); diff --git a/app/node/input.h b/app/node/input.h index f14521bc1..2f271a4a1 100644 --- a/app/node/input.h +++ b/app/node/input.h @@ -172,6 +172,11 @@ public: */ void remove_keyframe(NodeKeyframePtr key); + /** + * @brief Hacky convenience function to turn a raw pointer into a shared pointer + */ + NodeKeyframePtr get_keyframe_shared_ptr_from_raw(NodeKeyframe *raw) const; + /** * @brief Return whether a keyframe exists at this time * diff --git a/app/panel/curve/curve.cpp b/app/panel/curve/curve.cpp index 233b637f5..2c9fc0e4b 100644 --- a/app/panel/curve/curve.cpp +++ b/app/panel/curve/curve.cpp @@ -37,6 +37,11 @@ NodeInput *CurvePanel::GetInput() const return static_cast(GetTimeBasedWidget())->GetInput(); } +void CurvePanel::DeleteSelected() +{ + static_cast(GetTimeBasedWidget())->DeleteSelected(); +} + void CurvePanel::SetInput(NodeInput *input) { static_cast(GetTimeBasedWidget())->SetInput(input); diff --git a/app/panel/curve/curve.h b/app/panel/curve/curve.h index 761b00a0f..4b25b2b22 100644 --- a/app/panel/curve/curve.h +++ b/app/panel/curve/curve.h @@ -34,6 +34,8 @@ public: NodeInput* GetInput() const; + virtual void DeleteSelected() override; + public slots: void SetInput(NodeInput* input); diff --git a/app/panel/param/param.cpp b/app/panel/param/param.cpp index 2544c7748..3c3f64e10 100644 --- a/app/panel/param/param.cpp +++ b/app/panel/param/param.cpp @@ -59,6 +59,11 @@ void ParamPanel::SetTimestamp(const int64_t ×tamp) } } +void ParamPanel::DeleteSelected() +{ + static_cast(GetTimeBasedWidget())->DeleteSelected(); +} + void ParamPanel::Retranslate() { SetTitle(tr("Parameter Editor")); diff --git a/app/panel/param/param.h b/app/panel/param/param.h index 0ad5523c4..0f6d43d20 100644 --- a/app/panel/param/param.h +++ b/app/panel/param/param.h @@ -38,6 +38,8 @@ public slots: virtual void SetTimestamp(const int64_t& timestamp) override; + virtual void DeleteSelected() override; + signals: void TimeTargetChanged(Node* node); diff --git a/app/widget/curvewidget/curvewidget.cpp b/app/widget/curvewidget/curvewidget.cpp index b31e31ea8..4cd9dba3e 100644 --- a/app/widget/curvewidget/curvewidget.cpp +++ b/app/widget/curvewidget/curvewidget.cpp @@ -168,6 +168,11 @@ void CurveWidget::SetVerticalScale(const double &vscale) view_->SetYScale(vscale); } +void CurveWidget::DeleteSelected() +{ + view_->DeleteSelected(); +} + void CurveWidget::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { diff --git a/app/widget/curvewidget/curvewidget.h b/app/widget/curvewidget/curvewidget.h index b0276bb7f..21e0400d0 100644 --- a/app/widget/curvewidget/curvewidget.h +++ b/app/widget/curvewidget/curvewidget.h @@ -47,6 +47,8 @@ public: const double& GetVerticalScale(); void SetVerticalScale(const double& vscale); + void DeleteSelected(); + protected: virtual void changeEvent(QEvent *) override; diff --git a/app/widget/keyframeview/keyframeviewbase.cpp b/app/widget/keyframeview/keyframeviewbase.cpp index 8c830f615..65009bef4 100644 --- a/app/widget/keyframeview/keyframeviewbase.cpp +++ b/app/widget/keyframeview/keyframeviewbase.cpp @@ -73,6 +73,25 @@ void KeyframeViewBase::SetYScale(const double &y_scale) } } +void KeyframeViewBase::DeleteSelected() +{ + QUndoCommand* command = new QUndoCommand(); + + QMap::const_iterator i; + + for (i=item_map_.constBegin(); i!=item_map_.constEnd(); i++) { + if (i.value()->isSelected()) { + NodeInput* input_parent = i.key()->parent(); + + new NodeParamRemoveKeyframeCommand(input_parent, + input_parent->get_keyframe_shared_ptr_from_raw(i.key()), + command); + } + } + + Core::instance()->undo_stack()->pushIfHasChildren(command); +} + void KeyframeViewBase::RemoveKeyframe(NodeKeyframePtr key) { KeyframeAboutToBeRemoved(key.get()); diff --git a/app/widget/keyframeview/keyframeviewbase.h b/app/widget/keyframeview/keyframeviewbase.h index 71b46f6a7..000394641 100644 --- a/app/widget/keyframeview/keyframeviewbase.h +++ b/app/widget/keyframeview/keyframeviewbase.h @@ -40,6 +40,8 @@ public: const double& GetYScale() const; void SetYScale(const double& y_scale); + void DeleteSelected(); + public slots: void RemoveKeyframe(NodeKeyframePtr key); diff --git a/app/widget/nodeparamview/nodeparamview.cpp b/app/widget/nodeparamview/nodeparamview.cpp index 8675794c1..0ddc3e2ed 100644 --- a/app/widget/nodeparamview/nodeparamview.cpp +++ b/app/widget/nodeparamview/nodeparamview.cpp @@ -225,6 +225,11 @@ Node *NodeParamView::GetTimeTarget() const return keyframe_view_->GetTimeTarget(); } +void NodeParamView::DeleteSelected() +{ + keyframe_view_->DeleteSelected(); +} + void NodeParamView::UpdateItemTime(const int64_t ×tamp) { rational time = Timecode::timestamp_to_time(timestamp, keyframe_view_->timebase()); diff --git a/app/widget/nodeparamview/nodeparamview.h b/app/widget/nodeparamview/nodeparamview.h index be5cb5835..6f71b0994 100644 --- a/app/widget/nodeparamview/nodeparamview.h +++ b/app/widget/nodeparamview/nodeparamview.h @@ -42,6 +42,8 @@ public: Node* GetTimeTarget() const; + void DeleteSelected(); + signals: void InputDoubleClicked(NodeInput* input);