54 lines
1 KiB
C++
54 lines
1 KiB
C++
#include "externals.hh"
|
|
#include "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 ];
|
|
}
|