/*** Olive - Non-Linear Video Editor Copyright (C) 2022 Olive Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ***/ #include "undostack.h" #include namespace olive { const int UndoStack::kMaxUndoCommands = 200; UndoStack::UndoStack() { undo_action_ = new QAction(); connect(undo_action_, &QAction::triggered, this, &UndoStack::undo); redo_action_ = new QAction(); connect(redo_action_, &QAction::triggered, this, &UndoStack::redo); UpdateActions(); } UndoStack::~UndoStack() { clear(); delete undo_action_; delete redo_action_; } void UndoStack::pushIfHasChildren(MultiUndoCommand *command) { if (command->child_count() > 0) { push(command); } else { delete command; } } void UndoStack::push(UndoCommand *command) { command->redo_and_set_modified(); commands_.push_back(command); if (commands_.size() > kMaxUndoCommands) { delete commands_.front(); commands_.pop_front(); } if (CanRedo()) { for (auto it=undone_commands_.cbegin(); it!=undone_commands_.cend(); it++) { delete (*it); } undone_commands_.clear(); } UpdateActions(); } void UndoStack::undo() { if (CanUndo()) { // Undo most recently done command commands_.back()->undo_and_set_modified(); // Place at the front of the "undone commands" list undone_commands_.push_front(commands_.back()); // Remove undone command from the commands list commands_.pop_back(); // Update actions UpdateActions(); } } void UndoStack::redo() { if (CanRedo()) { // Redo most recently undone command undone_commands_.front()->redo_and_set_modified(); // Place at the back of the done commands list commands_.push_back(undone_commands_.front()); // Remove done command from undone list undone_commands_.pop_front(); // Update actions UpdateActions(); } } void UndoStack::clear() { for (auto it=commands_.cbegin(); it!=commands_.cend(); it++) { delete (*it); } commands_.clear(); } void UndoStack::UpdateActions() { undo_action_->setEnabled(CanUndo()); redo_action_->setEnabled(CanRedo()); undo_action_->setText(QCoreApplication::translate("UndoStack", "Undo %1").arg(CanUndo() ? commands_.back()->name() : QString())); redo_action_->setText(QCoreApplication::translate("UndoStack", "Redo %1").arg(CanRedo() ? undone_commands_.front()->name() : QString())); } }