00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
#include "undo.h"
00025
00027
00028
00029
void StackBase::push( Command *c )
00030 {
00031 mCommandStack.push( c );
00032 emit changed();
00033 }
00034
00035
bool StackBase::isEmpty()
00036 {
00037
return mCommandStack.isEmpty();
00038 }
00039
00040 Command *StackBase::top()
00041 {
00042
return mCommandStack.top();
00043 }
00044
00045
void StackBase::clear()
00046 {
00047 mCommandStack.clear();
00048 emit changed();
00049 }
00050
00051 Command *
StackBase::pop()
00052 {
00053 Command *c = mCommandStack.pop();
00054
if ( c )
00055 emit changed();
00056
00057
return c;
00058 }
00059
00061
00062
00063 UndoStack* UndoStack::instance_ = 0;
00064
00065 UndoStack::UndoStack()
00066 :
StackBase()
00067 {
00068
00069 }
00070
00071 UndoStack* UndoStack::instance()
00072 {
00073
if ( !instance_ )
00074 instance_ =
new UndoStack();
00075
return instance_;
00076 }
00077
00078
void UndoStack::undo()
00079 {
00080
if ( isEmpty() )
00081
return;
00082
00083 Command *command =
pop();
00084
if ( !command->undo() )
00085 push( command );
00086
else
00087 RedoStack::instance()->push( command );
00088 }
00089
00091
00092
00093 RedoStack* RedoStack::instance_ = 0;
00094
00095 RedoStack::RedoStack()
00096 {
00097 mCommandStack.setAutoDelete(
true );
00098 }
00099
00100 RedoStack* RedoStack::instance()
00101 {
00102
if ( !instance_ )
00103 instance_ =
new RedoStack();
00104
return instance_;
00105 }
00106
00107
void RedoStack::redo()
00108 {
00109 Command *command;
00110
if ( isEmpty() )
00111
return;
00112
00113 command =
pop();
00114
if ( !command->redo() )
00115 push( command );
00116
else
00117 UndoStack::instance()->push( command );
00118 }
00119
00120
#include "undo.moc"