X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fevent-log.cpp;h=82de44696b7b8b29356fac0fce0d0b22d8a6a219;hb=c4b828ca1807524249c2793e18be249cf2a7660d;hp=08fb45f9b79422a0bd1c0248def448f790e33a44;hpb=068e269d6d0391bdf69963f651be776f3fcb4dd5;p=inkscape.git diff --git a/src/event-log.cpp b/src/event-log.cpp index 08fb45f9b..82de44696 100644 --- a/src/event-log.cpp +++ b/src/event-log.cpp @@ -2,7 +2,7 @@ * Author: * Gustav Broberg * - * Copyright (c) 2006 Authors + * Copyright (c) 2006, 2007 Authors * * Released under GNU GPL, read the file 'COPYING' for more information */ @@ -13,6 +13,9 @@ #include "event-log.h" #include "inkscape.h" #include "util/ucompose.hpp" +#include "document.h" +#include "xml/repr.h" +#include "sp-object.h" namespace Inkscape { @@ -29,7 +32,7 @@ EventLog::EventLog(SPDocument* document) : { // add initial pseudo event Gtk::TreeRow curr_row = *(_event_list_store->append()); - _curr_event = _last_event = curr_row; + _curr_event = _last_saved = _last_event = curr_row; curr_row[_columns.description] = _("[Unchanged]"); curr_row[_columns.type] = SP_VERB_FILE_NEW; @@ -42,6 +45,9 @@ EventLog::notifyUndoEvent(Event* log) { if ( !_notifications_blocked ) { + // make sure the supplied event matches the next undoable event + g_return_if_fail ( _getUndoEvent() && (*(_getUndoEvent()))[_columns.event] == log ); + // if we're on the first child event... if ( _curr_event->parent() && _curr_event == _curr_event->parent()->children().begin() ) @@ -69,6 +75,8 @@ EventLog::notifyUndoEvent(Event* log) } } + checkForVirginity(); + // update the view if (_connected) { (*_callback_connections)[CALLB_SELECTION_CHANGE].block(); @@ -93,6 +101,9 @@ EventLog::notifyRedoEvent(Event* log) { if ( !_notifications_blocked ) { + // make sure the supplied event matches the next redoable event + g_return_if_fail ( _getRedoEvent() && (*(_getRedoEvent()))[_columns.event] == log ); + // if we're on a parent event... if ( !_curr_event->children().empty() ) { @@ -126,6 +137,8 @@ EventLog::notifyRedoEvent(Event* log) } } + checkForVirginity(); + // update the view if (_connected) { Gtk::TreePath curr_path = _event_list_store->get_path(_curr_event); @@ -149,34 +162,7 @@ EventLog::notifyRedoEvent(Event* log) void EventLog::notifyUndoCommitEvent(Event* log) { - // If we're not at the last event in list then erase the previously undone events - if ( _last_event != _curr_event ) { - - _last_event = _curr_event; - - if ( !_last_event->children().empty() ) { - _last_event = _last_event->children().begin(); - } else { - ++_last_event; - } - - while ( _last_event != _event_list_store->children().end() ) { - - if (_last_event->parent()) { - while ( _last_event != _last_event->parent()->children().end() ) { - _last_event = _event_list_store->erase(_last_event); - } - _last_event = _last_event->parent(); - - (*_last_event)[_columns.child_count] = _last_event->children().size() + 1; - - ++_last_event; - } else { - _last_event = _event_list_store->erase(_last_event); - } - - } - } + _clearRedo(); const unsigned int event_type = log->type; @@ -207,9 +193,12 @@ EventLog::notifyUndoCommitEvent(Event* log) _curr_event = _last_event = curr_row; + curr_row[_columns.event] = log; curr_row[_columns.type] = event_type; curr_row[_columns.description] = log->description; + checkForVirginity(); + // update the view if (_connected) { Gtk::TreePath curr_path = _event_list_store->get_path(_curr_event); @@ -228,6 +217,20 @@ EventLog::notifyUndoCommitEvent(Event* log) updateUndoVerbs(); } +void +EventLog::notifyClearUndoEvent() +{ + _clearUndo(); + updateUndoVerbs(); +} + +void +EventLog::notifyClearRedoEvent() +{ + _clearRedo(); + updateUndoVerbs(); +} + void EventLog::connectWithDialog(Gtk::TreeView *event_list_view, CallbackMap *callback_connections) { @@ -317,8 +320,57 @@ EventLog::_getRedoEvent() const return redo_event; } +void +EventLog::_clearUndo() +{ + // TODO: Implement when needed } +void +EventLog::_clearRedo() +{ + if ( _last_event != _curr_event ) { + + _last_event = _curr_event; + + if ( !_last_event->children().empty() ) { + _last_event = _last_event->children().begin(); + } else { + ++_last_event; + } + + while ( _last_event != _event_list_store->children().end() ) { + + if (_last_event->parent()) { + while ( _last_event != _last_event->parent()->children().end() ) { + _last_event = _event_list_store->erase(_last_event); + } + _last_event = _last_event->parent(); + + (*_last_event)[_columns.child_count] = _last_event->children().size() + 1; + + ++_last_event; + } else { + _last_event = _event_list_store->erase(_last_event); + } + + } + + } +} + +/* mark document as untouched if we reach a state where the document was previously saved */ +void +EventLog::checkForVirginity() { + g_return_if_fail (_document); + if (_curr_event == _last_saved) { + _document->setModifiedSinceSave(false); + } +} + +} // namespace Inkscape + + /* Local Variables: mode:c++