diff --git a/app/widget/marker/markerundo.cpp b/app/widget/marker/markerundo.cpp index ba338b031..8a78efcb0 100644 --- a/app/widget/marker/markerundo.cpp +++ b/app/widget/marker/markerundo.cpp @@ -66,4 +66,27 @@ void MarkerRemoveCommand::undo() marker_list_->AddMarker(range_, name_, color_); } +MarkerChangeColorCommand::MarkerChangeColorCommand(Project *project, TimelineMarker *marker, int new_color) : + project_(project), + marker_(marker), + old_color_(marker->color()), + new_color_(new_color) +{ +} + +Project* MarkerChangeColorCommand::GetRelevantProject() const +{ + return project_; +} + +void MarkerChangeColorCommand::redo() +{ + marker_->set_color(new_color_); +} + +void MarkerChangeColorCommand::undo() +{ + marker_->set_color(old_color_); +} + } diff --git a/app/widget/marker/markerundo.h b/app/widget/marker/markerundo.h index 5390b8ead..370723b8a 100644 --- a/app/widget/marker/markerundo.h +++ b/app/widget/marker/markerundo.h @@ -61,6 +61,23 @@ class MarkerRemoveCommand : public UndoCommand { int color_; }; +class MarkerChangeColorCommand : public UndoCommand { + public: + MarkerChangeColorCommand(Project* project, TimelineMarker* marker, int new_color); + + virtual Project* GetRelevantProject() const override; + + protected: + virtual void redo() override; + virtual void undo() override; + + private: + Project* project_; + TimelineMarker* marker_; + int old_color_; + int new_color_; +}; + } #endif // TIMELINEUNDOTRACK_H diff --git a/app/widget/timeruler/seekablewidget.cpp b/app/widget/timeruler/seekablewidget.cpp index fe803c408..77b04cd7b 100644 --- a/app/widget/timeruler/seekablewidget.cpp +++ b/app/widget/timeruler/seekablewidget.cpp @@ -232,9 +232,13 @@ void SeekableWidget::removeMarker(TimelineMarker *marker) void SeekableWidget::SetMarkerColor(int c) { + MultiUndoCommand *command = new MultiUndoCommand(); + foreach(TimelineMarker* marker, GetActiveTimelineMarkers()) { - marker->set_color(c); + command->add_child(new MarkerChangeColorCommand(Core::instance()->GetActiveProject(), marker, c)); } + + Core::instance()->undo_stack()->pushIfHasChildren(command); } void SeekableWidget::updateMarkerPositions()