reimplemented gizmos

This commit is contained in:
itsmattkc
2019-03-14 08:15:12 +11:00
parent aeadb73679
commit b884f7511b
8 changed files with 70 additions and 22 deletions
+53 -11
View File
@@ -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;i<gizmos.size();i++) {
if (gizmos.at(i) == gizmo) {
ComboAction* ca = nullptr;
if (done) ca = new ComboAction();
// If (!done && gizmo_dragging_actions_.isEmpty()), that means the drag just started and we're going to save
// the current state of the attach fields' keyframes in KeyframeDataChange objects to make the changes undoable
// by the user later.
if (!done && gizmo_dragging_actions_.isEmpty()) {
if (gizmo->x_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;j<gizmo_dragging_actions_.size();j++) {
// Set the current state of the keyframes as the "new" keyframes (the old values were set earlier when the
// KeyframeDataChange object was constructed).
gizmo_dragging_actions_.at(j)->SetNewKeyframes();
// 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;
}
}
+2
View File
@@ -246,6 +246,8 @@ private:
int flags_;
QVector<KeyframeDataChange*> gizmo_dragging_actions_;
// enable effect to update constantly
bool enable_always_update_;
+7 -7
View File
@@ -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<QColor>();
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.size();i++) {
+1 -1
View File
@@ -75,6 +75,7 @@ public:
bool IsEnabled();
void SetEnabled(bool e);
QVariant persistent_data_;
QVector<EffectKeyframe> keyframes;
signals:
@@ -95,7 +96,6 @@ private:
bool enabled_;
int colspan_;
QVariant perpetual_data_;
};
#endif // EFFECTFIELD_H
+1 -1
View File
@@ -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
-2
View File
@@ -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();
}
}
+4
View File
@@ -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;
}
}
+2
View File
@@ -636,6 +636,8 @@ private:
EffectField* field_;
QVector<EffectKeyframe> old_keys_;
QVector<EffectKeyframe> new_keys_;
QVariant old_persistent_data_;
QVariant new_persistent_data_;
bool done_;
};