From c8552ad184f911211945ec61ad7cd8166ea1ec0b Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Fri, 22 Oct 2021 21:55:35 +0100 Subject: [PATCH] Make moving a marker undoable --- app/timeline/timelinemarker.cpp | 6 ++++++ app/timeline/timelinemarker.h | 1 + app/widget/marker/markerundo.cpp | 23 +++++++++++++++++++++++ app/widget/marker/markerundo.h | 19 +++++++++++++++++++ app/widget/timeruler/seekablewidget.cpp | 2 +- 5 files changed, 50 insertions(+), 1 deletion(-) diff --git a/app/timeline/timelinemarker.cpp b/app/timeline/timelinemarker.cpp index bece44e0f..18b7a19a7 100644 --- a/app/timeline/timelinemarker.cpp +++ b/app/timeline/timelinemarker.cpp @@ -46,6 +46,12 @@ void TimelineMarker::set_time(const TimeRange &time) emit TimeChanged(time_); } +void TimelineMarker::set_time_undo(TimeRange time) { + UndoCommand *command = new MarkerChangeTimeCommand(Core::instance()->GetActiveProject(), this, time); + + Core::instance()->undo_stack()->push(command); +} + const QString &TimelineMarker::name() const { return name_; diff --git a/app/timeline/timelinemarker.h b/app/timeline/timelinemarker.h index 70b3a53b2..71e651f37 100644 --- a/app/timeline/timelinemarker.h +++ b/app/timeline/timelinemarker.h @@ -52,6 +52,7 @@ public: public slots: void set_name_undo(QString name); + void set_time_undo(TimeRange time); signals: void TimeChanged(const TimeRange& time); diff --git a/app/widget/marker/markerundo.cpp b/app/widget/marker/markerundo.cpp index 17ff46df1..e75a0a68e 100644 --- a/app/widget/marker/markerundo.cpp +++ b/app/widget/marker/markerundo.cpp @@ -112,4 +112,27 @@ void MarkerChangeNameCommand::undo() marker_->set_name(old_name_); } +MarkerChangeTimeCommand::MarkerChangeTimeCommand(Project* project, TimelineMarker* marker, TimeRange time) : + project_(project), + marker_(marker), + old_time_(marker->time()), + new_time_(time) +{ +} + +Project* MarkerChangeTimeCommand::GetRelevantProject() const +{ + return project_; +} + +void MarkerChangeTimeCommand::redo() +{ + marker_->set_time(new_time_); +} + +void MarkerChangeTimeCommand::undo() +{ + marker_->set_time(old_time_); +} + } diff --git a/app/widget/marker/markerundo.h b/app/widget/marker/markerundo.h index 5dd4d4cbf..d5ef865bc 100644 --- a/app/widget/marker/markerundo.h +++ b/app/widget/marker/markerundo.h @@ -95,6 +95,25 @@ class MarkerChangeNameCommand : public UndoCommand { QString new_name_; }; +class MarkerChangeTimeCommand : public UndoCommand { + public: + MarkerChangeTimeCommand(Project* project, TimelineMarker* marker, TimeRange time); + + virtual Project* GetRelevantProject() const override; + + protected: + virtual void redo() override; + virtual void undo() override; + + private: + Project* project_; + TimelineMarker* marker_; + TimeRange old_time_; + TimeRange new_time_; + + +}; + } #endif // TIMELINEUNDOTRACK_H diff --git a/app/widget/timeruler/seekablewidget.cpp b/app/widget/timeruler/seekablewidget.cpp index b62d60414..da712cfc9 100644 --- a/app/widget/timeruler/seekablewidget.cpp +++ b/app/widget/timeruler/seekablewidget.cpp @@ -220,7 +220,7 @@ void SeekableWidget::addMarker(TimelineMarker* marker) connect(marker_widget, &Marker::NameChanged, marker, &TimelineMarker::set_name_undo); connect(marker, &TimelineMarker::NameChanged, marker_widget, &Marker::SetName); - connect(marker_widget, &Marker::TimeChanged, marker, &TimelineMarker::set_time); + connect(marker_widget, &Marker::TimeChanged, marker, &TimelineMarker::set_time_undo); connect(marker, &TimelineMarker::TimeChanged, marker_widget, &Marker::SetTime); marker_widget->move(TimeToScreen(marker->time().in())-2, text_height_);