/*** Olive - Non-Linear Video Editor Copyright (C) 2022 Olive Team Modifications Copyright (C) 2025 mikesolar 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 . ***/ #ifndef OAK_TIMELINEUNDOTRACK_H #define OAK_TIMELINEUNDOTRACK_H #include "node/output/track/track.h" namespace olive { class TrackRippleRemoveBlockCommand : public UndoCommand { public: TrackRippleRemoveBlockCommand(Track *track, Block *block) : track_(track) , block_(block) { } virtual Project *get_relevant_project() const override { return track_->project(); } protected: virtual void redo() override { before_ = block_->previous(); track_->ripple_remove_block(block_); } virtual void undo() override { track_->insert_block_after(block_, before_); } private: Track *track_; Block *block_; Block *before_; }; class TrackPrependBlockCommand : public UndoCommand { public: TrackPrependBlockCommand(Track *track, Block *block) : track_(track) , block_(block) { } virtual Project *get_relevant_project() const override { return track_->project(); } protected: virtual void redo() override { track_->prepend_block(block_); } virtual void undo() override { track_->ripple_remove_block(block_); } private: Track *track_; Block *block_; }; class TrackInsertBlockAfterCommand : public UndoCommand { public: TrackInsertBlockAfterCommand(Track *track, Block *block, Block *before) : track_(track) , block_(block) , before_(before) { } virtual Project *get_relevant_project() const override { return block_->project(); } protected: virtual void redo() override { track_->insert_block_after(block_, before_); } virtual void undo() override { track_->ripple_remove_block(block_); } private: Track *track_; Block *block_; Block *before_; }; /** * @brief Replaces Block `old` with Block `replace` * * Both blocks must have equal lengths. */ class TrackReplaceBlockCommand : public UndoCommand { public: TrackReplaceBlockCommand(Track *track, Block *old, Block *replace) : track_(track) , old_(old) , replace_(replace) { } virtual Project *get_relevant_project() const override { return track_->project(); } protected: virtual void redo() override { track_->replace_block(old_, replace_); } virtual void undo() override { track_->replace_block(replace_, old_); } private: Track *track_; Block *old_; Block *replace_; }; } #endif // OAK_TIMELINEUNDOTRACK_H