diff --git a/project/undo.cpp b/project/undo.cpp index fc9f77d92..963b02c32 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -1301,3 +1301,34 @@ void RippleAction::redo() { } ca->redo(); } + +SetDouble::SetDouble(double* pointer, double new_value) : + p(pointer), + oldval(*pointer), + newval(new_value), + old_project_changed(mainWindow->isWindowModified()) +{} + +void SetDouble::undo() { + *p = oldval; + mainWindow->setWindowModified(old_project_changed); +} + +void SetDouble::redo() { + *p = newval; + mainWindow->setWindowModified(true); +} + +SetQVariant::SetQVariant(QVariant *itarget, const QVariant &iold, const QVariant &inew) : + target(itarget), + old_val(iold), + new_val(inew) +{} + +void SetQVariant::undo() { + *target = old_val; +} + +void SetQVariant::redo() { + *target = new_val; +} diff --git a/project/undo.h b/project/undo.h index f7aae7626..e74d09a25 100644 --- a/project/undo.h +++ b/project/undo.h @@ -524,6 +524,18 @@ private: bool old_project_changed; }; +class SetDouble : public QUndoCommand { +public: + SetDouble(double* pointer, double new_value); + void undo(); + void redo(); +private: + double* p; + double oldval; + double newval; + bool old_project_changed; +}; + class SetString : public QUndoCommand { public: SetString(QString* pointer, QString new_value); @@ -606,4 +618,15 @@ public: void redo(); }; +class SetQVariant : public QUndoCommand { +public: + SetQVariant(QVariant* itarget, const QVariant& iold, const QVariant& inew); + void undo(); + void redo(); +private: + QVariant* target; + QVariant old_val; + QVariant new_val; +}; + #endif // UNDO_H diff --git a/ui/graphview.cpp b/ui/graphview.cpp index 4c26a081e..f76168677 100644 --- a/ui/graphview.cpp +++ b/ui/graphview.cpp @@ -173,8 +173,13 @@ void GraphView::mousePressEvent(QMouseEvent *event) { } selected_keys_old_vals.clear(); + selected_keys_old_doubles.clear(); for (int i=0;ikeyframe_times.at(selected_keys.at(i))); + + for (int j=0;jfield(selected_keys_fields.at(j))->keyframe_data.at(selected_keys.at(i)).toDouble()); + } } update(); @@ -191,6 +196,10 @@ void GraphView::mouseMoveEvent(QMouseEvent *event) { } else { for (int i=0;ikeyframe_times[selected_keys.at(i)] = selected_keys_old_vals.at(i) + (double(event->pos().x() - start_x)/zoom); + + for (int j=0;jfield(selected_keys_fields.at(j))->keyframe_data[selected_keys.at(i)] = selected_keys_old_doubles.at((i*selected_keys_fields.size())+j) + (double(start_y - event->pos().y())/zoom); + } } moved_keys = true; update_ui(false); @@ -199,15 +208,25 @@ void GraphView::mouseMoveEvent(QMouseEvent *event) { } void GraphView::mouseReleaseEvent(QMouseEvent *event) { - if (moved_keys) { + if (moved_keys && selected_keys.size() > 0) { + ComboAction* ca = new ComboAction(); QVector rows; QVector new_vals; + for (int i=0;ikeyframe_times.at(selected_keys.at(i))); + + for (int j=0;jappend(new SetQVariant(&row->field(selected_keys_fields.at(j))->keyframe_data[selected_keys.at(i)], + selected_keys_old_doubles.at((i*selected_keys_fields.size())+j), + row->field(selected_keys_fields.at(j))->keyframe_data.at(selected_keys.at(i)))); + } + //ca->append(new KeyframeSet(row, selected_keys.at(i), 0, false)); } - undo_stack.push(new KeyframeMove(rows, selected_keys, selected_keys_old_vals, new_vals)); + ca->append(new KeyframeMove(rows, selected_keys, selected_keys_old_vals, new_vals)); + undo_stack.push(ca); } moved_keys = false; mousedown = false; diff --git a/ui/graphview.h b/ui/graphview.h index 5706b48a6..363303632 100644 --- a/ui/graphview.h +++ b/ui/graphview.h @@ -41,6 +41,7 @@ private: QVector selected_keys; QVector selected_keys_fields; QVector selected_keys_old_vals; + QVector selected_keys_old_doubles; bool moved_keys;