#include "externals.hh" #include "c-undo.hh" /*= A_UndoAction ===============================================================*/ A_UndoAction::~A_UndoAction( ) {} /*= T_UndoManager ==============================================================*/ T_UndoManager::T_UndoManager( ) noexcept { while ( actions_.size( ) < MaxUndo ) { actions_.addNew( ); } } void T_UndoManager::undo( ) noexcept { if ( pos_ > 0 ) { pos_ --; actions_[ ( start_ + pos_ ) % MaxUndo ]->undo( ); } } void T_UndoManager::redo( ) noexcept { if ( pos_ < count_ ) { actions_[ ( start_ + pos_ ) % MaxUndo ]->redo( ); pos_ ++; } } A_UndoAction& T_UndoManager::addAction( P_UndoAction action ) noexcept { assert( action ); while ( pos_ < count_ ) { count_ --; actions_[ ( start_ + count_ ) % MaxUndo ].clear( ); } const auto ai{ count_ == MaxUndo ? start_ : ( ( start_ + pos_ ) % MaxUndo ) }; if ( count_ == MaxUndo ) { start_ = ( start_ + 1 ) % MaxUndo; } else { count_ ++; pos_ ++; } actions_[ ai ] = std::move( action ); return *actions_[ ai ]; }