}
-int MainUndo::undo()
+UndoStackItem *MainUndo::next_undo()
{
- UndoStackItem *current = undo_stack->current;
- char after_description[BCTEXTLEN];
- after_description[0] = 0;
+ return undo_stack->get_current_undo();
+}
- mwindow->undo_commercial();
+UndoStackItem *MainUndo::next_redo()
+{
+ return undo_stack->get_current_redo();
+}
-//printf("MainUndo::undo 1\n");
-//dump();
+int MainUndo::undo_load_flags()
+{
+ UndoStackItem *item = next_undo();
+ return item ? item->get_flags() : 0;
+}
-// Rewind to an after entry
- if(current && !(undo_stack->number_of(current) % 2))
- {
- current = PREVIOUS;
- }
+int MainUndo::redo_load_flags()
+{
+ UndoStackItem *item = next_redo();
+ return item ? item->get_flags() : 0;
+}
-// Rewind to a before entry
- if(current && (undo_stack->number_of(current) % 2))
- {
- strcpy(after_description, current->get_description());
- current = PREVIOUS;
- }
+int MainUndo::undo()
+{
+ mwindow->undo_commercial();
+
+ UndoStackItem *current = next_undo();
// Now have an even number
- if(current)
- {
+ if( current ) {
undo_stack->current = current;
// Set the redo text to the current description
- if(mwindow->gui)
- mwindow->gui->mainmenu->redo->update_caption(
- after_description);
-
+ if( mwindow->gui ) {
+ UndoStackItem *next = NEXT;
+ mwindow->gui->mainmenu->redo->
+ update_caption(next ? next->get_description() : "");
+ }
FileXML file;
char *current_data = current->get_data();
- if(current_data)
- {
+ if( current_data ) {
file.read_from_string(current_data);
load_from_undo(&file, current->get_flags());
//printf("MainUndo::undo %d %s\n", __LINE__, current->get_filename());
mwindow->set_filename(current->get_filename());
delete [] current_data;
-// move current entry back one step
- undo_stack->pull();
-
-
- if(mwindow->gui)
- {
+ if( mwindow->gui ) {
// Now update the menu with the after entry
- current = PREVIOUS;
-// Must be a previous entry to perform undo
- if(current)
- mwindow->gui->mainmenu->undo->update_caption(
- current->get_description());
- else
- mwindow->gui->mainmenu->undo->update_caption("");
+ UndoStackItem *prev = PREVIOUS;
+ mwindow->gui->mainmenu->undo->
+ update_caption(prev ? prev->get_description() : "");
}
}
}
-
-//dump();
reset_creators();
mwindow->reset_caches();
return 0;
}
+
int MainUndo::redo()
{
- UndoStackItem *current = undo_stack->current;
-//printf("MainUndo::redo 1\n");
-//dump();
-
-// Get 1st entry
- if(!current) current = undo_stack->first;
-
-// Advance to a before entry
- if(current && (undo_stack->number_of(current) % 2))
- {
- current = NEXT;
- }
-
-// Advance to an after entry
- if(current && !(undo_stack->number_of(current) % 2))
- {
- current = NEXT;
- }
-
- if(current)
- {
- FileXML file;
- char *current_data = current->get_data();
+ UndoStackItem *current = next_redo();
+ if( current ) {
undo_stack->current = current;
-
- if(current_data)
- {
+ char *current_data = current->get_data();
+ if( current_data ) {
+ FileXML file;
mwindow->set_filename(current->get_filename());
file.read_from_string(current_data);
load_from_undo(&file, current->get_flags());
delete [] current_data;
- if(mwindow->gui)
- {
+ if( mwindow->gui ) {
// Update menu
- mwindow->gui->mainmenu->undo->update_caption(current->get_description());
-
+ mwindow->gui->mainmenu->undo->
+ update_caption(current->get_description());
// Get next after entry
- current = NEXT;
- if(current)
- current = NEXT;
-
- if(current)
- mwindow->gui->mainmenu->redo->update_caption(current->get_description());
- else
- mwindow->gui->mainmenu->redo->update_caption("");
+ if( (current=NEXT) ) current = NEXT;
+ mwindow->gui->mainmenu->redo->
+ update_caption(current ? current->get_description() : "");
}
}
}
MainUndo(MWindow *mwindow);
~MainUndo();
-
-
-
// For tweeking operations:
// If a pair of update_undo_before and update_undo_after are called
// within a certain time limit and the creator is nonzero and equal,
int undo();
int redo();
+// load_flags for the next undo/redo stack item
+ int undo_load_flags();
+ int redo_load_flags();
void dump(FILE *fp=stdout);
private:
// Entry point for all update commands
// compression more efficient.
// So even numbers are before and odd numbers are after
UndoStack *undo_stack;
-
-
-
+ UndoStackItem *next_undo();
+ UndoStackItem *next_redo();
// loads undo from the stringfile to the project
int load_undo_before(FileXML *file, uint32_t load_flags);
{
}
+UndoStackItem *UndoStack::get_current_undo()
+{
+ UndoStackItem *item = current;
+ if( item && !(number_of(item) % 2) ) item = item->previous;
+ if( item && (number_of(item) % 2) ) item = item->previous;
+ return item;
+}
+
+UndoStackItem *UndoStack::get_current_redo()
+{
+ UndoStackItem *item = current ? current : first;
+ if( item && (number_of(item) % 2) ) item = item->next;
+ if( item && !(number_of(item) % 2) ) item = item->next;
+ return item;
+}
+
+
UndoStackItem* UndoStack::push()
{
// current is only 0 if before first undo
return current;
}
-void UndoStack::pull()
-{
- if(current) current = PREVIOUS;
-}
-
UndoStackItem* UndoStack::pull_next()
{
// use first entry if none