diff --git a/dialogs/aboutdialog.cpp b/dialogs/aboutdialog.cpp index 3e5969075..711c11e73 100644 --- a/dialogs/aboutdialog.cpp +++ b/dialogs/aboutdialog.cpp @@ -24,7 +24,7 @@ #include #include -#include "oliveglobal.h" +#include "global/global.h" AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent) diff --git a/dialogs/actionsearch.cpp b/dialogs/actionsearch.cpp index a21a2ef3d..c112061dd 100644 --- a/dialogs/actionsearch.cpp +++ b/dialogs/actionsearch.cpp @@ -25,123 +25,123 @@ #include #include -#include "mainwindow.h" +#include "ui/mainwindow.h" ActionSearch::ActionSearch(QWidget *parent) : - QDialog(parent) + QDialog(parent) { - setObjectName("ASDiag"); - setStyleSheet("#ASDiag{border: 2px solid #808080;}"); + setObjectName("ASDiag"); + setStyleSheet("#ASDiag{border: 2px solid #808080;}"); - resize(parent->width()/3, parent->height()/3); + resize(parent->width()/3, parent->height()/3); - setWindowFlags(Qt::Popup); + setWindowFlags(Qt::Popup); - QVBoxLayout* layout = new QVBoxLayout(this); + QVBoxLayout* layout = new QVBoxLayout(this); - ActionSearchEntry* entry_field = new ActionSearchEntry(this); - QFont entry_field_font = entry_field->font(); - entry_field_font.setPointSize(qRound(entry_field_font.pointSize()*1.2)); - entry_field->setFont(entry_field_font); - entry_field->setPlaceholderText(tr("Search for action...")); - connect(entry_field, SIGNAL(textChanged(const QString&)), this, SLOT(search_update(const QString &))); - connect(entry_field, SIGNAL(returnPressed()), this, SLOT(perform_action())); - connect(entry_field, SIGNAL(moveSelectionUp()), this, SLOT(move_selection_up())); - connect(entry_field, SIGNAL(moveSelectionDown()), this, SLOT(move_selection_down())); - layout->addWidget(entry_field); + ActionSearchEntry* entry_field = new ActionSearchEntry(this); + QFont entry_field_font = entry_field->font(); + entry_field_font.setPointSize(qRound(entry_field_font.pointSize()*1.2)); + entry_field->setFont(entry_field_font); + entry_field->setPlaceholderText(tr("Search for action...")); + connect(entry_field, SIGNAL(textChanged(const QString&)), this, SLOT(search_update(const QString &))); + connect(entry_field, SIGNAL(returnPressed()), this, SLOT(perform_action())); + connect(entry_field, SIGNAL(moveSelectionUp()), this, SLOT(move_selection_up())); + connect(entry_field, SIGNAL(moveSelectionDown()), this, SLOT(move_selection_down())); + layout->addWidget(entry_field); - list_widget = new ActionSearchList(this); - QFont list_widget_font = list_widget->font(); - list_widget_font.setPointSize(qRound(list_widget_font.pointSize()*1.2)); - list_widget->setFont(list_widget_font); - layout->addWidget(list_widget); - connect(list_widget, SIGNAL(dbl_click()), this, SLOT(perform_action())); + list_widget = new ActionSearchList(this); + QFont list_widget_font = list_widget->font(); + list_widget_font.setPointSize(qRound(list_widget_font.pointSize()*1.2)); + list_widget->setFont(list_widget_font); + layout->addWidget(list_widget); + connect(list_widget, SIGNAL(dbl_click()), this, SLOT(perform_action())); - entry_field->setFocus(); + entry_field->setFocus(); } void ActionSearch::search_update(const QString &s, const QString &p, QMenu *parent) { - if (parent == nullptr) { - list_widget->clear(); + if (parent == nullptr) { + list_widget->clear(); QList menus = olive::MainWindow->menuBar()->actions(); - for (int i=0;imenu(); - search_update(s, p, menu); - } - if (list_widget->count() > 0) - list_widget->item(0)->setSelected(true); - } else { - QString menu_text; - if (!p.isEmpty()) menu_text += p + " > "; - menu_text += parent->title().replace("&", ""); - QList actions = parent->actions(); - for (int i=0;iisSeparator()) { - if (a->menu() != nullptr) { - search_update(s, menu_text, a->menu()); - } else { - QString comp = a->text().replace("&", ""); - if (comp.contains(s, Qt::CaseInsensitive)) { - QListWidgetItem* item = new QListWidgetItem(QString("%1\n(%2)").arg(comp, menu_text), list_widget); - item->setData(Qt::UserRole+1, reinterpret_cast(a)); - list_widget->addItem(item); - } - } - } - } - } + for (int i=0;imenu(); + search_update(s, p, menu); + } + if (list_widget->count() > 0) + list_widget->item(0)->setSelected(true); + } else { + QString menu_text; + if (!p.isEmpty()) menu_text += p + " > "; + menu_text += parent->title().replace("&", ""); + QList actions = parent->actions(); + for (int i=0;iisSeparator()) { + if (a->menu() != nullptr) { + search_update(s, menu_text, a->menu()); + } else { + QString comp = a->text().replace("&", ""); + if (comp.contains(s, Qt::CaseInsensitive)) { + QListWidgetItem* item = new QListWidgetItem(QString("%1\n(%2)").arg(comp, menu_text), list_widget); + item->setData(Qt::UserRole+1, reinterpret_cast(a)); + list_widget->addItem(item); + } + } + } + } + } } void ActionSearch::perform_action() { - QList selected_items = list_widget->selectedItems(); - if (list_widget->count() > 0 && selected_items.size() > 0) { - QListWidgetItem* item = selected_items.at(0); - QAction* a = reinterpret_cast(item->data(Qt::UserRole+1).value()); - a->trigger(); - } - accept(); + QList selected_items = list_widget->selectedItems(); + if (list_widget->count() > 0 && selected_items.size() > 0) { + QListWidgetItem* item = selected_items.at(0); + QAction* a = reinterpret_cast(item->data(Qt::UserRole+1).value()); + a->trigger(); + } + accept(); } void ActionSearch::move_selection_up() { - int lim = list_widget->count(); - for (int i=1;iitem(i)->isSelected()) { - list_widget->item(i-1)->setSelected(true); - list_widget->scrollToItem(list_widget->item(i-1)); - break; - } - } + int lim = list_widget->count(); + for (int i=1;iitem(i)->isSelected()) { + list_widget->item(i-1)->setSelected(true); + list_widget->scrollToItem(list_widget->item(i-1)); + break; + } + } } void ActionSearch::move_selection_down() { - int lim = list_widget->count()-1; - for (int i=0;iitem(i)->isSelected()) { - list_widget->item(i+1)->setSelected(true); - list_widget->scrollToItem(list_widget->item(i+1)); - break; - } - } + int lim = list_widget->count()-1; + for (int i=0;iitem(i)->isSelected()) { + list_widget->item(i+1)->setSelected(true); + list_widget->scrollToItem(list_widget->item(i+1)); + break; + } + } } ActionSearchEntry::ActionSearchEntry(QWidget *parent) : QLineEdit(parent) {} void ActionSearchEntry::keyPressEvent(QKeyEvent * event) { - switch (event->key()) { - case Qt::Key_Up: - emit moveSelectionUp(); - break; - case Qt::Key_Down: - emit moveSelectionDown(); - break; - default: - QLineEdit::keyPressEvent(event); - } + switch (event->key()) { + case Qt::Key_Up: + emit moveSelectionUp(); + break; + case Qt::Key_Down: + emit moveSelectionDown(); + break; + default: + QLineEdit::keyPressEvent(event); + } } ActionSearchList::ActionSearchList(QWidget *parent) : QListWidget(parent) {} void ActionSearchList::mouseDoubleClickEvent(QMouseEvent *) { - emit dbl_click(); + emit dbl_click(); } diff --git a/dialogs/debugdialog.cpp b/dialogs/debugdialog.cpp index 33e8e29a2..6205d661a 100644 --- a/dialogs/debugdialog.cpp +++ b/dialogs/debugdialog.cpp @@ -25,15 +25,15 @@ #include #include -#include "debug.h" +#include "global/debug.h" DebugDialog* olive::DebugDialog = nullptr; DebugDialog::DebugDialog(QWidget *parent) : QDialog(parent) { - QVBoxLayout* layout = new QVBoxLayout(this); + QVBoxLayout* layout = new QVBoxLayout(this); - textEdit = new QTextEdit(this); - textEdit->setWordWrapMode(QTextOption::NoWrap); + textEdit = new QTextEdit(this); + textEdit->setWordWrapMode(QTextOption::NoWrap); layout->addWidget(textEdit); Retranslate(); @@ -45,7 +45,7 @@ void DebugDialog::Retranslate() } void DebugDialog::update_log() { - textEdit->setHtml(get_debug_str()); + textEdit->setHtml(get_debug_str()); textEdit->verticalScrollBar()->setValue(textEdit->verticalScrollBar()->maximum()); } @@ -59,5 +59,5 @@ void DebugDialog::changeEvent(QEvent *e) } void DebugDialog::showEvent(QShowEvent *) { - update_log(); + update_log(); } diff --git a/effects/effect.h b/effects/effect.h index e7c9ca99f..325406836 100644 --- a/effects/effect.h +++ b/effects/effect.h @@ -42,7 +42,6 @@ #include "ui/collapsiblewidget.h" #include "ui/checkboxex.h" -#include "effectfields.h" #include "effectrow.h" #include "effectgizmo.h" diff --git a/effects/effectfield.h b/effects/effectfield.h index f8f824896..a41566ce0 100644 --- a/effects/effectfield.h +++ b/effects/effectfield.h @@ -26,6 +26,7 @@ #include #include "effects/keyframe.h" +#include "undo/undo.h" class EffectRow; class ComboAction; diff --git a/effects/effectgizmo.cpp b/effects/effectgizmo.cpp index 9d3413708..c1449b657 100644 --- a/effects/effectgizmo.cpp +++ b/effects/effectgizmo.cpp @@ -21,8 +21,8 @@ #include "effectgizmo.h" #include "ui/labelslider.h" -#include "effectfields/doublefield.h" -#include "project/effect.h" +#include "effects/fields/doublefield.h" +#include "effects/effect.h" EffectGizmo::EffectGizmo(Effect *parent, int type) : QObject(parent), diff --git a/effects/effectrow.cpp b/effects/effectrow.cpp index 3821c08a0..bda3a1a76 100644 --- a/effects/effectrow.cpp +++ b/effects/effectrow.cpp @@ -183,8 +183,32 @@ void EffectRow::ToggleKeyframe() { } else { // If we DID find keyframes at this time, delete them - for (int i=0;iappend(new KeyframeDelete(key_fields.at(i), key_field_index.at(i))); + + QVector sorted_key_fields; + QVector sorted_key_field_index; + + // Since QVectors shift themselves when removing items, we need to sort these in reverse order + for (int i=0;iappend(new KeyframeDelete(sorted_key_fields.at(i), sorted_key_field_index.at(i))); } } @@ -215,7 +239,13 @@ void EffectRow::FocusRow() { void EffectRow::SetKeyframeOnAllFields(ComboAction* ca) { for (int i=0;iSetValueAt(field->Now(), field->GetValueAt(field->Now())); + + kdc->SetNewKeyframes(); + ca->append(kdc); } panel_effect_controls->update_keyframes(); diff --git a/effects/fields/boolfield.cpp b/effects/fields/boolfield.cpp index f7f4d70ac..9c23d9202 100644 --- a/effects/fields/boolfield.cpp +++ b/effects/fields/boolfield.cpp @@ -48,5 +48,10 @@ QString BoolField::ConvertValueToString(const QVariant &v) void BoolField::UpdateFromWidget(bool b) { + KeyframeDataChange* kdc = new KeyframeDataChange(this); + SetValueAt(Now(), b); + + kdc->SetNewKeyframes(); + olive::UndoStack.push(kdc); } diff --git a/effects/fields/colorfield.cpp b/effects/fields/colorfield.cpp index 909c177d1..a48c4b841 100644 --- a/effects/fields/colorfield.cpp +++ b/effects/fields/colorfield.cpp @@ -42,5 +42,10 @@ QString ColorField::ConvertValueToString(const QVariant &v) void ColorField::UpdateFromWidget(const QColor& c) { + KeyframeDataChange* kdc = new KeyframeDataChange(this); + SetValueAt(Now(), c); + + kdc->SetNewKeyframes(); + olive::UndoStack.push(kdc); } diff --git a/effects/fields/combofield.cpp b/effects/fields/combofield.cpp index 7b25645f4..6b1a46e3f 100644 --- a/effects/fields/combofield.cpp +++ b/effects/fields/combofield.cpp @@ -54,5 +54,10 @@ void ComboField::UpdateWidgetValue(QWidget *widget, double timecode) void ComboField::UpdateFromWidget(int index) { + KeyframeDataChange* kdc = new KeyframeDataChange(this); + SetValueAt(Now(), items_.at(index).data); + + kdc->SetNewKeyframes(); + olive::UndoStack.push(kdc); } diff --git a/effects/fields/doublefield.cpp b/effects/fields/doublefield.cpp index 8499c2f9b..18ff66740 100644 --- a/effects/fields/doublefield.cpp +++ b/effects/fields/doublefield.cpp @@ -1,6 +1,6 @@ #include "doublefield.h" -#include +#include "effects/effectrow.h" DoubleField::DoubleField(EffectRow* parent, const QString& id) : EffectField(parent, id, EFFECT_FIELD_DOUBLE), @@ -9,7 +9,8 @@ DoubleField::DoubleField(EffectRow* parent, const QString& id) : default_(0), display_type_(LabelSlider::Normal), frame_rate_(30), - value_set_(false) + value_set_(false), + kdc_(nullptr) { connect(this, SIGNAL(Changed()), this, SLOT(ValueHasBeenSet()), Qt::DirectConnection); } @@ -94,5 +95,18 @@ void DoubleField::ValueHasBeenSet() void DoubleField::UpdateFromWidget(double d) { + LabelSlider* ls = static_cast(sender()); + + if (ls->IsDragging() && kdc_ == nullptr) { + kdc_ = new KeyframeDataChange(this); + } + SetValueAt(Now(), d); + GetParentRow()->SetKeyframeOnAllFields(nullptr); + + if (!ls->IsDragging() && kdc_ != nullptr) { + kdc_->SetNewKeyframes(); + olive::UndoStack.push(kdc_); + kdc_ = nullptr; + } } diff --git a/effects/fields/doublefield.h b/effects/fields/doublefield.h index 39a46a334..935e895bf 100644 --- a/effects/fields/doublefield.h +++ b/effects/fields/doublefield.h @@ -46,6 +46,8 @@ private: double frame_rate_; bool value_set_; + + KeyframeDataChange* kdc_; private slots: void ValueHasBeenSet(); void UpdateFromWidget(double d); diff --git a/effects/fields/filefield.cpp b/effects/fields/filefield.cpp index a76383e15..27698c94c 100644 --- a/effects/fields/filefield.cpp +++ b/effects/fields/filefield.cpp @@ -25,5 +25,10 @@ QWidget *FileField::CreateWidget() void FileField::UpdateFromWidget(const QString &s) { + KeyframeDataChange* kdc = new KeyframeDataChange(this); + SetValueAt(Now(), s); + + kdc->SetNewKeyframes(); + olive::UndoStack.push(kdc); } diff --git a/effects/fields/fontfield.cpp b/effects/fields/fontfield.cpp index 9c7343225..c95c87697 100644 --- a/effects/fields/fontfield.cpp +++ b/effects/fields/fontfield.cpp @@ -54,5 +54,10 @@ void FontField::UpdateWidgetValue(QWidget *widget, double timecode) void FontField::UpdateFromWidget(const QString& s) { + KeyframeDataChange* kdc = new KeyframeDataChange(this); + SetValueAt(Now(), s); + + kdc->SetNewKeyframes(); + olive::UndoStack.push(kdc); } diff --git a/effects/fields/stringfield.cpp b/effects/fields/stringfield.cpp index b885ef035..777a0fdfc 100644 --- a/effects/fields/stringfield.cpp +++ b/effects/fields/stringfield.cpp @@ -41,5 +41,10 @@ void StringField::UpdateWidgetValue(QWidget *widget, double timecode) void StringField::UpdateFromWidget(const QString &s) { + KeyframeDataChange* kdc = new KeyframeDataChange(this); + SetValueAt(Now(), s); + + kdc->SetNewKeyframes(); + olive::UndoStack.push(kdc); } diff --git a/ui/checkboxex.cpp b/ui/checkboxex.cpp index 25d812253..b42c7159e 100644 --- a/ui/checkboxex.cpp +++ b/ui/checkboxex.cpp @@ -20,13 +20,13 @@ #include "checkboxex.h" -#include "project/undo.h" +#include "undo/undo.h" CheckboxEx::CheckboxEx(QWidget* parent) : QCheckBox(parent) { // connect(this, SIGNAL(clicked(bool)), this, SLOT(checkbox_command())); } void CheckboxEx::checkbox_command() { - CheckboxCommand* c = new CheckboxCommand(this); - olive::UndoStack.push(c); + CheckboxCommand* c = new CheckboxCommand(this); + olive::UndoStack.push(c); } diff --git a/ui/collapsiblewidget.cpp b/ui/collapsiblewidget.cpp index dd0e9ced9..a75ec85a5 100644 --- a/ui/collapsiblewidget.cpp +++ b/ui/collapsiblewidget.cpp @@ -33,7 +33,7 @@ #include "ui/checkboxex.h" #include "ui/icons.h" -#include "debug.h" +#include "global/debug.h" CollapsibleWidget::CollapsibleWidget(QWidget* parent) : QWidget(parent) { selected = false; diff --git a/ui/colorbutton.cpp b/ui/colorbutton.cpp index a5e200fbc..e841707b1 100644 --- a/ui/colorbutton.cpp +++ b/ui/colorbutton.cpp @@ -20,8 +20,6 @@ #include "colorbutton.h" -#include "project/undo.h" - #include ColorButton::ColorButton(QWidget *parent) @@ -58,14 +56,3 @@ void ColorButton::open_dialog() { emit color_changed(color); } } - -ColorCommand::ColorCommand(ColorButton* s, QColor o, QColor n) - : sender(s), old_color(o), new_color(n) {} - -void ColorCommand::undo() { - sender->set_color(old_color); -} - -void ColorCommand::redo() { - sender->set_color(new_color); -} diff --git a/ui/colorbutton.h b/ui/colorbutton.h index 74364d951..944378b8c 100644 --- a/ui/colorbutton.h +++ b/ui/colorbutton.h @@ -42,15 +42,4 @@ private slots: void open_dialog(); }; -class ColorCommand : public QUndoCommand { -public: - ColorCommand(ColorButton* s, QColor o, QColor n); - void undo(); - void redo(); -private: - ColorButton* sender; - QColor old_color; - QColor new_color; -}; - #endif // COLORBUTTON_H diff --git a/ui/effectui.cpp b/ui/effectui.cpp index 6305c6116..f8c60aa37 100644 --- a/ui/effectui.cpp +++ b/ui/effectui.cpp @@ -66,6 +66,8 @@ EffectUI::EffectUI(Effect* e) : KeyframeNavigator* nav = new KeyframeNavigator(); + nav->enable_keyframes(row->IsKeyframing()); + connect(nav, SIGNAL(goto_previous_key()), row, SLOT(GoToPreviousKeyframe())); connect(nav, SIGNAL(toggle_key()), row, SLOT(ToggleKeyframe())); connect(nav, SIGNAL(goto_next_key()), row, SLOT(GoToNextKeyframe())); diff --git a/ui/icons.cpp b/ui/icons.cpp index 0e3eff232..eae5ba1f3 100644 --- a/ui/icons.cpp +++ b/ui/icons.cpp @@ -1,5 +1,7 @@ #include "icons.h" +#include + #include "global/global.h" #include "global/config.h" diff --git a/ui/keyframedrawing.cpp b/ui/keyframedrawing.cpp index e282cafdf..568ab3533 100644 --- a/ui/keyframedrawing.cpp +++ b/ui/keyframedrawing.cpp @@ -20,8 +20,8 @@ #include "keyframedrawing.h" -#include "project/effect.h" -#include "project/clip.h" +#include "effects/effect.h" +#include "timeline/clip.h" #define KEYFRAME_POINT_COUNT 4 diff --git a/ui/keyframenavigator.cpp b/ui/keyframenavigator.cpp index 18625b26d..c27e07415 100644 --- a/ui/keyframenavigator.cpp +++ b/ui/keyframenavigator.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include "ui/icons.h" diff --git a/ui/keyframenavigator.h b/ui/keyframenavigator.h index 772a1f8f7..3811b3906 100644 --- a/ui/keyframenavigator.h +++ b/ui/keyframenavigator.h @@ -34,6 +34,7 @@ public: ~KeyframeNavigator(); void enable_keyframe_toggle(bool); +public slots: void enable_keyframes(bool); signals: void goto_previous_key(); diff --git a/ui/resizablescrollbar.cpp b/ui/resizablescrollbar.cpp index aa23c960a..785f2eba8 100644 --- a/ui/resizablescrollbar.cpp +++ b/ui/resizablescrollbar.cpp @@ -24,7 +24,7 @@ #include #include -#include "debug.h" +#include "global/debug.h" #define RESIZE_HANDLE_SIZE 10 diff --git a/ui/sourcetable.h b/ui/sourcetable.h index 94868decc..251d87776 100644 --- a/ui/sourcetable.h +++ b/ui/sourcetable.h @@ -30,19 +30,19 @@ class Media; class SourceTable : public QTreeView { - Q_OBJECT + Q_OBJECT public: - SourceTable(QWidget* parent = 0); - Project* project_parent; + SourceTable(QWidget* parent = 0); + Project* project_parent; protected: - void mousePressEvent(QMouseEvent*); - void mouseDoubleClickEvent(QMouseEvent *); - void dragEnterEvent(QDragEnterEvent *event); - void dragMoveEvent(QDragMoveEvent *event); - void dropEvent(QDropEvent *event); + void mousePressEvent(QMouseEvent*); + void mouseDoubleClickEvent(QMouseEvent *); + void dragEnterEvent(QDragEnterEvent *event); + void dragMoveEvent(QDragMoveEvent *event); + void dropEvent(QDropEvent *event); private slots: - void item_click(const QModelIndex& index); - void show_context_menu(); + void item_click(const QModelIndex& index); + void show_context_menu(); }; #endif // SOURCETABLE_H diff --git a/undo/undo.cpp b/undo/undo.cpp index e30228e9b..725516b2c 100644 --- a/undo/undo.cpp +++ b/undo/undo.cpp @@ -607,22 +607,6 @@ void KeyframeDelete::doRedo() { field->keyframes.removeAt(index); } -/* -EffectFieldUndo::EffectFieldUndo(EffectField* f, const QVariant& old_data, const QVariant new_data) : - field(f), - old_val(old_data), - new_val(new_data) -{} - -void EffectFieldUndo::doUndo() { - field->SetCurrentValue(old_val); -} - -void EffectFieldUndo::doRedo() { - field->SetCurrentValue(new_val); -} -*/ - SetClipProperty::SetClipProperty(SetClipPropertyType type) : type_(type) {} @@ -1169,3 +1153,29 @@ void OliveAction::redo() { } } + +KeyframeDataChange::KeyframeDataChange(EffectField *field) : + field_(field), + done_(true) +{ + old_keys_ = field_->keyframes; +} + +void KeyframeDataChange::SetNewKeyframes() +{ + new_keys_ = field_->keyframes; +} + +void KeyframeDataChange::doUndo() +{ + field_->keyframes = old_keys_; + done_ = false; +} + +void KeyframeDataChange::doRedo() +{ + if (!done_) { + field_->keyframes = new_keys_; + done_ = true; + } +} diff --git a/undo/undo.h b/undo/undo.h index 4327839f2..6ec38c988 100644 --- a/undo/undo.h +++ b/undo/undo.h @@ -28,15 +28,30 @@ #include #include -#include "project/projectelements.h" -#include "timeline/selection.h" -#include "timeline/clip.h" -#include "timeline/sequence.h" -#include "effects/transition.h" -#include "effects/effectfield.h" +#include "comboaction.h" -#include "ui/labelslider.h" -#include "ui/sourcetable.h" +#include "timeline/marker.h" +#include "timeline/selection.h" +#include "effects/keyframe.h" + +class Clip; +using ClipPtr = std::shared_ptr; + +class Sequence; +using SequencePtr = std::shared_ptr; + +class Media; +using MediaPtr = std::shared_ptr; + +class Effect; +using EffectPtr = std::shared_ptr; + +class Transition; +using TransitionPtr = std::shared_ptr; + +struct EffectMeta; +class EffectRow; +class EffectField; namespace olive { extern QUndoStack UndoStack; @@ -334,18 +349,6 @@ private: bool done; }; -class EffectFieldUndo : public OliveAction { -public: - EffectFieldUndo(EffectField* field, const QVariant &old_data, const QVariant new_data); - virtual void doUndo() override; - virtual void doRedo() override; -private: - EffectField* field; - QVariant old_val; - QVariant new_val; - bool done; -}; - enum SetClipPropertyType { kSetClipPropertyAutoscale, kSetClipPropertyReversed, @@ -620,4 +623,20 @@ private: QByteArray old_data; }; +class KeyframeDataChange : public OliveAction { +public: + KeyframeDataChange(EffectField* field); + + void SetNewKeyframes(); + + virtual void doUndo() override; + virtual void doRedo() override; + +private: + EffectField* field_; + QVector old_keys_; + QVector new_keys_; + bool done_; +}; + #endif // UNDO_H