From 31859e56d2cef32cccab3b61717e9b7004f5d1a1 Mon Sep 17 00:00:00 2001 From: cilix42 Date: Tue, 13 Nov 2007 14:27:44 +0000 Subject: [PATCH] Partial fix for bug #1824387 [Still asks to save after complete undo] --- src/event-log.cpp | 24 +++++++++++++++++++++++- src/event-log.h | 5 +++++ src/file.cpp | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/event-log.cpp b/src/event-log.cpp index 4ee65f3f8..4c2ef9c7a 100644 --- a/src/event-log.cpp +++ b/src/event-log.cpp @@ -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; @@ -72,6 +75,8 @@ EventLog::notifyUndoEvent(Event* log) } } + checkForVirginity(); + // update the view if (_connected) { (*_callback_connections)[CALLB_SELECTION_CHANGE].block(); @@ -132,6 +137,8 @@ EventLog::notifyRedoEvent(Event* log) } } + checkForVirginity(); + // update the view if (_connected) { Gtk::TreePath curr_path = _event_list_store->get_path(_curr_event); @@ -190,6 +197,8 @@ EventLog::notifyUndoCommitEvent(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); @@ -350,6 +359,19 @@ EventLog::_clearRedo() } } +/* 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) { + Inkscape::XML::Node *repr = sp_document_repr_root(_document); + bool saved = sp_document_get_undo_sensitive(_document); + sp_document_set_undo_sensitive(_document, false); + repr->setAttribute("sodipodi:modified", NULL); + sp_document_set_undo_sensitive(_document, saved); + } +} + } // namespace Inkscape diff --git a/src/event-log.h b/src/event-log.h index 33faa57f6..9fcd01e1c 100644 --- a/src/event-log.h +++ b/src/event-log.h @@ -87,6 +87,7 @@ public: void setCurrEvent(iterator event) { _curr_event = event; } void setCurrEventParent(iterator event) { _curr_event_parent = event; } void blockNotifications(bool status=true) { _notifications_blocked = status; } + void rememberFileSave() { _last_saved = _curr_event; } /* * Callback types for TreeView changes. @@ -126,6 +127,8 @@ private: iterator _last_event; //< end position in _event_list_store iterator _curr_event_parent; //< parent to current event, if any + iterator _last_saved; //< position where last document save occurred + bool _notifications_blocked; //< if notifications should be handled // Map of connections used to temporary block/unblock callbacks in a TreeView @@ -141,6 +144,8 @@ private: void _clearUndo(); //< erase all previously commited events void _clearRedo(); //< erase all previously undone events + void checkForVirginity(); //< marks the document as untouched if undo/redo reaches a previously saved state + // noncopyable, nonassignable EventLog(EventLog const &other); EventLog& operator=(EventLog const &other); diff --git a/src/file.cpp b/src/file.cpp index 346f17891..748a288e5 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -538,6 +538,7 @@ file_save(Gtk::Window &parentWindow, SPDocument *doc, const Glib::ustring &uri, return sp_file_save_dialog(parentWindow, doc); } + SP_ACTIVE_DESKTOP->event_log->rememberFileSave(); SP_ACTIVE_DESKTOP->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Document saved.")); return true; } -- 2.30.2