X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fdocument-undo.cpp;h=7556d2e8fed7df52a16ad5c00f551d8a006b62af;hb=84e5676034b77e63dbc43746cec0a8b48fd06f7c;hp=0462ff374a175fccd94e959c4958d1cda9e82a4c;hpb=0e87cf25885f81a6201f1226ca26690d2d553963;p=inkscape.git diff --git a/src/document-undo.cpp b/src/document-undo.cpp index 0462ff374..7556d2e8f 100644 --- a/src/document-undo.cpp +++ b/src/document-undo.cpp @@ -63,6 +63,7 @@ #include "inkscape.h" #include "debug/event-tracker.h" #include "debug/simple-event.h" +#include "debug/timestamp.h" #include "event.h" @@ -123,10 +124,42 @@ sp_document_done (SPDocument *doc, const unsigned int event_type, Glib::ustring } void -sp_document_reset_key (Inkscape::Application *inkscape, SPDesktop *desktop, GtkObject *base) +sp_document_reset_key (Inkscape::Application */*inkscape*/, SPDesktop */*desktop*/, GtkObject *base) { - SPDocument *doc = (SPDocument *) base; - doc->actionkey = NULL; + SPDocument *doc = (SPDocument *) base; + doc->actionkey = NULL; +} + +namespace { + +using Inkscape::Debug::Event; +using Inkscape::Debug::SimpleEvent; +using Inkscape::Util::share_static_string; +using Inkscape::Debug::timestamp; +using Inkscape::Verb; + +typedef SimpleEvent InteractionEvent; + +class CommitEvent : public InteractionEvent { +public: + + CommitEvent(SPDocument *doc, const gchar *key, const unsigned int type) + : InteractionEvent(share_static_string("commit")) + { + _addProperty(share_static_string("timestamp"), timestamp()); + gchar *serial = g_strdup_printf("%lu", doc->serial()); + _addProperty(share_static_string("document"), serial); + g_free(serial); + Verb *verb = Verb::get(type); + if (verb) { + _addProperty(share_static_string("context"), verb->get_id()); + } + if (key) { + _addProperty(share_static_string("merge-key"), key); + } + } +}; + } void @@ -137,6 +170,8 @@ sp_document_maybe_done (SPDocument *doc, const gchar *key, const unsigned int ev g_assert (doc->priv != NULL); g_assert (doc->priv->sensitive); + Inkscape::Debug::EventTracker tracker(doc, key, event_type); + doc->collectOrphans(); sp_document_ensure_up_to_date (doc); @@ -152,9 +187,8 @@ sp_document_maybe_done (SPDocument *doc, const gchar *key, const unsigned int ev } if (key && doc->actionkey && !strcmp (key, doc->actionkey) && doc->priv->undo) { - doc->priv->undo->data = - new Inkscape::Event(sp_repr_coalesce_log (((Inkscape::Event *) - doc->priv->undo->data)->event, log)); + ((Inkscape::Event *)doc->priv->undo->data)->event = + sp_repr_coalesce_log (((Inkscape::Event *)doc->priv->undo->data)->event, log); } else { Inkscape::Event *event = new Inkscape::Event(log, event_type, event_description); doc->priv->undo = g_slist_prepend (doc->priv->undo, event); @@ -192,22 +226,20 @@ sp_document_cancel (SPDocument *doc) sp_repr_begin_transaction (doc->rdoc); } -namespace { - -void finish_incomplete_transaction(SPDocument &doc) { +static void finish_incomplete_transaction(SPDocument &doc) { SPDocumentPrivate &priv=*doc.priv; Inkscape::XML::Event *log=sp_repr_commit_undoable(doc.rdoc); if (log || priv.partial) { g_warning ("Incomplete undo transaction:"); priv.partial = sp_repr_coalesce_log(priv.partial, log); sp_repr_debug_print_log(priv.partial); - priv.undo = g_slist_prepend(priv.undo, priv.partial); + Inkscape::Event *event = new Inkscape::Event(priv.partial); + priv.undo = g_slist_prepend(priv.undo, event); + priv.undoStackObservers.notifyUndoCommitEvent(event); priv.partial = NULL; } } -} - gboolean sp_document_undo (SPDocument *doc) { @@ -303,6 +335,9 @@ sp_document_redo (SPDocument *doc) void sp_document_clear_undo (SPDocument *doc) { + if (doc->priv->undo) + doc->priv->undoStackObservers.notifyClearUndoEvent(); + while (doc->priv->undo) { GSList *current; @@ -318,6 +353,9 @@ sp_document_clear_undo (SPDocument *doc) void sp_document_clear_redo (SPDocument *doc) { + if (doc->priv->redo) + doc->priv->undoStackObservers.notifyClearRedoEvent(); + while (doc->priv->redo) { GSList *current;