diff --git a/project/undo.cpp b/project/undo.cpp index 71b474b7f..f5529fc69 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -1299,3 +1299,27 @@ void SetPointer::redo() { *p = new_data; mainWindow->setWindowModified(true); } + +MoveGizmo::MoveGizmo(Effect *e, EffectGizmo *g, int x_movement, int y_movement, double tc) : + effect(e), + gizmo(g), + x(x_movement), + y(y_movement), + timecode(tc), + done(true), + old_changed(mainWindow->isWindowModified()) +{} + +void MoveGizmo::undo() { + effect->gizmo_move(gizmo, -x, -y, timecode); + mainWindow->setWindowModified(old_changed); + done = false; +} + +void MoveGizmo::redo() { + if (!done) { + effect->gizmo_move(gizmo, x, y, timecode); + mainWindow->setWindowModified(true); + done = true; + } +} diff --git a/project/undo.h b/project/undo.h index e69c466ab..22261866c 100644 --- a/project/undo.h +++ b/project/undo.h @@ -9,6 +9,7 @@ class SourceTable; class EffectRow; class EffectField; class Transition; +class EffectGizmo; struct Clip; struct Sequence; struct Media; @@ -597,4 +598,19 @@ private: void* old_data; }; +class MoveGizmo : public QUndoCommand { +public: + MoveGizmo(Effect* e, EffectGizmo* g, int x_movement, int y_movement, double tc); + void undo(); + void redo(); +private: + Effect* effect; + EffectGizmo* gizmo; + int x; + int y; + double timecode; + bool done; + bool old_changed; +}; + #endif // UNDO_H diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index bb58ffd69..eb9152270 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -17,6 +17,7 @@ #include "debug.h" #include "io/math.h" #include "ui/collapsiblewidget.h" +#include "project/undo.h" #include #include @@ -175,6 +176,9 @@ void ViewerWidget::mousePressEvent(QMouseEvent* event) { drag_start_x = event->pos().x(); drag_start_y = event->pos().y(); + gizmo_x_mvmt = 0; + gizmo_y_mvmt = 0; + selected_gizmo = get_gizmo_from_mouse(event->pos().x(), event->pos().y()); } dragging = true; @@ -199,6 +203,9 @@ void ViewerWidget::mouseMoveEvent(QMouseEvent* event) { gizmos->gizmo_move(selected_gizmo, x_movement, y_movement, get_timecode(gizmos->parent_clip, gizmos->parent_clip->sequence->playhead)); + gizmo_x_mvmt += x_movement; + gizmo_y_mvmt += y_movement; + drag_start_x = event->pos().x(); drag_start_y = event->pos().y(); @@ -216,6 +223,15 @@ void ViewerWidget::mouseMoveEvent(QMouseEvent* event) { } void ViewerWidget::mouseReleaseEvent(QMouseEvent *event) { + if (selected_gizmo != NULL) { + undo_stack.push(new MoveGizmo( + gizmos, + selected_gizmo, + gizmo_x_mvmt, + gizmo_y_mvmt, + get_timecode(gizmos->parent_clip, gizmos->parent_clip->sequence->playhead) + )); + } dragging = false; } diff --git a/ui/viewerwidget.h b/ui/viewerwidget.h index 69e34b71a..38837cbaf 100644 --- a/ui/viewerwidget.h +++ b/ui/viewerwidget.h @@ -51,6 +51,8 @@ private: Effect* gizmos; int drag_start_x; int drag_start_y; + int gizmo_x_mvmt; + int gizmo_y_mvmt; EffectGizmo* selected_gizmo; EffectGizmo* get_gizmo_from_mouse(int x, int y); bool drawn_gizmos;