From b884f7511b21f86ddf0443f7feba54ba0b6e446a Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 14 Mar 2019 08:15:12 +1100 Subject: [PATCH] reimplemented gizmos --- effects/effect.cpp | 64 ++++++++++++++++++++++++++++++++++------- effects/effect.h | 2 ++ effects/effectfield.cpp | 14 ++++----- effects/effectfield.h | 2 +- olive.pro | 2 +- ui/viewerwidget.cpp | 2 -- undo/undo.cpp | 4 +++ undo/undo.h | 2 ++ 8 files changed, 70 insertions(+), 22 deletions(-) diff --git a/effects/effect.cpp b/effects/effect.cpp index dec9b4d38..c35752b14 100644 --- a/effects/effect.cpp +++ b/effects/effect.cpp @@ -896,27 +896,69 @@ void Effect::process_audio(double, double, quint8*, int, int) {} void Effect::gizmo_draw(double, GLTextureCoords &) {} void Effect::gizmo_move(EffectGizmo* gizmo, int x_movement, int y_movement, double timecode, bool done) { + // Loop through each gizmo to find `gizmo` for (int i=0;ix_field1 != nullptr) { + gizmo_dragging_actions_.append(new KeyframeDataChange(gizmo->x_field1)); + } + if (gizmo->y_field1 != nullptr) { + gizmo_dragging_actions_.append(new KeyframeDataChange(gizmo->y_field1)); + } + if (gizmo->x_field2 != nullptr) { + gizmo_dragging_actions_.append(new KeyframeDataChange(gizmo->x_field2)); + } + if (gizmo->y_field2 != nullptr) { + gizmo_dragging_actions_.append(new KeyframeDataChange(gizmo->y_field2)); + } + } + + // Update the field values if (gizmo->x_field1 != nullptr) { - gizmo->x_field1->SetValueAt(timecode, gizmo->x_field1->GetDoubleAt(timecode) + x_movement*gizmo->x_field_multi1); - //gizmo->x_field1->make_key_from_change(ca); + gizmo->x_field1->SetValueAt(timecode, + gizmo->x_field1->GetDoubleAt(timecode) + x_movement*gizmo->x_field_multi1); } if (gizmo->y_field1 != nullptr) { - gizmo->y_field1->SetValueAt(timecode, gizmo->y_field1->GetDoubleAt(timecode) + y_movement*gizmo->y_field_multi1); - //gizmo->y_field1->make_key_from_change(ca); + gizmo->y_field1->SetValueAt(timecode, + gizmo->y_field1->GetDoubleAt(timecode) + y_movement*gizmo->y_field_multi1); } if (gizmo->x_field2 != nullptr) { - gizmo->x_field2->SetValueAt(timecode, gizmo->x_field2->GetDoubleAt(timecode) + x_movement*gizmo->x_field_multi2); - //gizmo->x_field2->make_key_from_change(ca); + gizmo->x_field2->SetValueAt(timecode, + gizmo->x_field2->GetDoubleAt(timecode) + x_movement*gizmo->x_field_multi2); } if (gizmo->y_field2 != nullptr) { - gizmo->y_field2->SetValueAt(timecode, gizmo->y_field2->GetDoubleAt(timecode) + y_movement*gizmo->y_field_multi2); - //gizmo->y_field2->make_key_from_change(ca); + gizmo->y_field2->SetValueAt(timecode, + gizmo->y_field2->GetDoubleAt(timecode) + y_movement*gizmo->y_field_multi2); + } + + // If (done && !gizmo_dragging_actions_.isEmpty()), that means the drag just ended and we're going to save + // the new state of the attach fields' keyframes in KeyframeDataChange objects to make the changes undoable + // by the user later. + if (done && !gizmo_dragging_actions_.isEmpty()) { + + // Store all the KeyframeDataChange objects into a ComboAction to send to the undo stack (makes them all + // undoable together rather than having to be undone individually). + ComboAction* ca = new ComboAction(); + + for (int j=0;jSetNewKeyframes(); + + // Add this KeyframeDataChange object to the ComboAction + ca->append(gizmo_dragging_actions_.at(j)); + } + + olive::UndoStack.push(ca); + + gizmo_dragging_actions_.clear(); } - if (done) olive::UndoStack.push(ca); break; } } diff --git a/effects/effect.h b/effects/effect.h index 89d4dfbf9..dd0780c5a 100644 --- a/effects/effect.h +++ b/effects/effect.h @@ -246,6 +246,8 @@ private: int flags_; + QVector gizmo_dragging_actions_; + // enable effect to update constantly bool enable_always_update_; diff --git a/effects/effectfield.cpp b/effects/effectfield.cpp index 73aabc02d..23c863060 100644 --- a/effects/effectfield.cpp +++ b/effects/effectfield.cpp @@ -179,7 +179,7 @@ QVariant EffectField::GetValueAt(double timecode) } } - perpetual_data_ = value; + persistent_data_ = value; break; } case EFFECT_FIELD_COLOR: @@ -192,7 +192,7 @@ QVariant EffectField::GetValueAt(double timecode) QColor after_data = keyframes.at(after_keyframe).data.value(); value = QColor(lerp(before_data.red(), after_data.red(), progress), lerp(before_data.green(), after_data.green(), progress), lerp(before_data.blue(), after_data.blue(), progress)); } - perpetual_data_ = value; + persistent_data_ = value; break; } case EFFECT_FIELD_STRING: @@ -200,14 +200,14 @@ QVariant EffectField::GetValueAt(double timecode) case EFFECT_FIELD_COMBO: case EFFECT_FIELD_FONT: case EFFECT_FIELD_FILE: - perpetual_data_ = before_data; + persistent_data_ = before_data; break; default: break; } } - return perpetual_data_; + return persistent_data_; } void EffectField::SetValueAt(double time, const QVariant &value) @@ -241,7 +241,7 @@ void EffectField::SetValueAt(double time, const QVariant &value) } } else { - perpetual_data_ = value; + persistent_data_ = value; } emit Changed(); @@ -267,7 +267,7 @@ void EffectField::PrepareDataForKeyframing(bool enabled, ComboAction *ca) EffectKeyframe key; key.time = NowInFrames(); - key.data = perpetual_data_; + key.data = persistent_data_; key.type = EFFECT_KEYFRAME_LINEAR; keyframes.append(key); @@ -279,7 +279,7 @@ void EffectField::PrepareDataForKeyframing(bool enabled, ComboAction *ca) // Convert keyframes to one "perpetual" keyframe // Set first keyframe to whatever the data is now - ca->append(new SetQVariant(&perpetual_data_, perpetual_data_, GetValueAt(Now()))); + ca->append(new SetQVariant(&persistent_data_, persistent_data_, GetValueAt(Now()))); // Delete all keyframes for (int i=0;i keyframes; signals: @@ -95,7 +96,6 @@ private: bool enabled_; int colspan_; - QVariant perpetual_data_; }; #endif // EFFECTFIELD_H diff --git a/olive.pro b/olive.pro index f559cbf16..59319e67c 100644 --- a/olive.pro +++ b/olive.pro @@ -344,7 +344,7 @@ unix:!mac:isEmpty(PREFIX) { unix:!mac:target.path = $$PREFIX/bin -effects.files = $$PWD/effects/*.frag $$PWD/effects/*.xml $$PWD/effects/*.vert +effects.files = $$PWD/effects/shaders/* unix:!mac:effects.path = $$PREFIX/share/olive-editor/effects translations.files = $$PWD/ts/*.qm diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index 5901098b0..37a24d540 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -310,8 +310,6 @@ void ViewerWidget::move_gizmos(QMouseEvent *event, bool done) { drag_start_x = event->pos().x(); drag_start_y = event->pos().y(); - - gizmos->FieldChanged(); } } diff --git a/undo/undo.cpp b/undo/undo.cpp index 725516b2c..23d3429bc 100644 --- a/undo/undo.cpp +++ b/undo/undo.cpp @@ -1159,16 +1159,19 @@ KeyframeDataChange::KeyframeDataChange(EffectField *field) : done_(true) { old_keys_ = field_->keyframes; + old_persistent_data_ = field_->persistent_data_; } void KeyframeDataChange::SetNewKeyframes() { new_keys_ = field_->keyframes; + new_persistent_data_ = field_->persistent_data_; } void KeyframeDataChange::doUndo() { field_->keyframes = old_keys_; + field_->persistent_data_ = old_persistent_data_; done_ = false; } @@ -1176,6 +1179,7 @@ void KeyframeDataChange::doRedo() { if (!done_) { field_->keyframes = new_keys_; + field_->persistent_data_ = new_persistent_data_; done_ = true; } } diff --git a/undo/undo.h b/undo/undo.h index 6ec38c988..11853f818 100644 --- a/undo/undo.h +++ b/undo/undo.h @@ -636,6 +636,8 @@ private: EffectField* field_; QVector old_keys_; QVector new_keys_; + QVariant old_persistent_data_; + QVariant new_persistent_data_; bool done_; };