Code

Cleanup of device internal handling and API.
[inkscape.git] / src / ui / dialog / undo-history.cpp
index 5cfba60f60dfd6a3e4fbd0315f847927be8695e7..8017af8031140b8253aca36474807434679f9279 100644 (file)
@@ -1,11 +1,10 @@
-/**
- * \brief Undo History dialog
- *
- * Author:
+/** @file
+ * @brief Undo History dialog - implementation
+ */
+/* Author:
  *   Gustav Broberg <broberg@kth.se>
  *
  * Copyright (C) 2006 Authors
- *
  * Released under GNU GPL.  Read the file 'COPYING' for more information.
  */
 
@@ -20,8 +19,8 @@
 
 #include "document.h"
 #include "inkscape.h"
-#include "ui/icons.h"
 #include "verbs.h"
+#include "desktop-handles.h"
 
 #include "undo-history.h"
 
@@ -31,7 +30,7 @@ namespace Dialog {
 
 /* Rendering functions for custom cell renderers */
 
-void 
+void
 CellRendererSPIcon::render_vfunc(const Glib::RefPtr<Gdk::Drawable>& window,
                                  Gtk::Widget& widget,
                                  const Gdk::Rectangle& background_area,
@@ -50,13 +49,13 @@ CellRendererSPIcon::render_vfunc(const Glib::RefPtr<Gdk::Drawable>& window,
 
         if (icon) {
 
-            // check icon type (inkscape, gtk, none) 
-            if ( SP_IS_ICON(icon->gobj()) ) { 
+            // check icon type (inkscape, gtk, none)
+            if ( SP_IS_ICON(icon->gobj()) ) {
                 SPIcon* sp_icon = SP_ICON(icon->gobj());
                 sp_icon_fetch_pixbuf(sp_icon);
                 _property_icon = Glib::wrap(sp_icon->pb, true);
             } else if ( GTK_IS_IMAGE(icon->gobj()) ) {
-                _property_icon = Gtk::Invisible().render_icon(Gtk::StockID(image), 
+                _property_icon = Gtk::Invisible().render_icon(Gtk::StockID(image),
                                                               Gtk::ICON_SIZE_MENU);
             } else {
                 delete icon;
@@ -71,7 +70,7 @@ CellRendererSPIcon::render_vfunc(const Glib::RefPtr<Gdk::Drawable>& window,
         property_pixbuf() = _icon_cache[_property_event_type];
     }
 
-    Gtk::CellRendererPixbuf::render_vfunc(window, widget, background_area, 
+    Gtk::CellRendererPixbuf::render_vfunc(window, widget, background_area,
                                           cell_area, expose_area, flags);
 }
 
@@ -84,31 +83,57 @@ CellRendererInt::render_vfunc(const Glib::RefPtr<Gdk::Drawable>& window,
                               const Gdk::Rectangle& expose_area,
                               Gtk::CellRendererState flags)
 {
-   if( _filter(_property_number) ) {
+    if( _filter(_property_number) ) {
         std::ostringstream s;
         s << _property_number << std::flush;
         property_text() = s.str();
-        Gtk::CellRendererText::render_vfunc(window, widget, background_area, 
+        Gtk::CellRendererText::render_vfunc(window, widget, background_area,
                                             cell_area, expose_area, flags);
-   }
+    }
 }
 
 const CellRendererInt::Filter& CellRendererInt::no_filter = CellRendererInt::NoFilter();
 
+UndoHistory& UndoHistory::getInstance()
+{
+    return *new UndoHistory();
+}
+
+void
+UndoHistory::setDesktop(SPDesktop* desktop)
+{
+    Panel::setDesktop(desktop);
+
+    if (!desktop) return;
+
+    _document = sp_desktop_document(desktop);
+
+    _event_log = desktop->event_log;
+
+    _callback_connections[EventLog::CALLB_SELECTION_CHANGE].block();
+
+    _event_list_store = _event_log->getEventListStore();
+    _event_list_view.set_model(_event_list_store);
+    _event_list_selection = _event_list_view.get_selection();
+
+    _event_log->connectWithDialog(&_event_list_view, &_callback_connections);
+    _event_list_view.scroll_to_row(_event_list_store->get_path(_event_list_selection->get_selected()));
+
+    _callback_connections[EventLog::CALLB_SELECTION_CHANGE].block(false);
+}
 
 UndoHistory::UndoHistory()
-    : Dialog ("dialogs.undo-history", SP_VERB_DIALOG_UNDO_HISTORY),
-      _desktop (SP_ACTIVE_DESKTOP),
-      _document (SP_ACTIVE_DOCUMENT),
-      _event_log (_desktop ? _desktop->event_log : NULL),
+    : UI::Widget::Panel ("", "/dialogs/undo-history", SP_VERB_DIALOG_UNDO_HISTORY),
+      _document (sp_desktop_document(getDesktop())),
+      _event_log (getDesktop() ? getDesktop()->event_log : NULL),
       _columns (_event_log ? &_event_log->getColumns() : NULL),
       _event_list_selection (_event_list_view.get_selection())
-{ 
-    if( !_document || !_event_log || !_columns ) return;
+{
+    if ( !_document || !_event_log || !_columns ) return;
 
-    set_size_request(300, 400);
+    set_size_request(300, 95);
 
-    get_vbox()->pack_start(_scrolled_window);
+    _getContents()->pack_start(_scrolled_window);
     _scrolled_window.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
 
     _event_list_store = _event_log->getEventListStore();
@@ -146,7 +171,7 @@ UndoHistory::UndoHistory()
 
     _scrolled_window.add(_event_list_view);
 
-    // connect callbacks
+    // connect EventLog callbacks
     _callback_connections[EventLog::CALLB_SELECTION_CHANGE] =
         _event_list_selection->signal_changed().connect(sigc::mem_fun(*this, &Inkscape::UI::Dialog::UndoHistory::_onListSelectionChange));
 
@@ -156,20 +181,20 @@ UndoHistory::UndoHistory()
     _callback_connections[EventLog::CALLB_COLLAPSE] =
         _event_list_view.signal_row_collapsed().connect(sigc::mem_fun(*this, &Inkscape::UI::Dialog::UndoHistory::_onCollapseEvent));
 
-    // connect with the event log
+    // connect with the EventLog
     _event_log->connectWithDialog(&_event_list_view, &_callback_connections);
 
-    _event_list_view.scroll_to_row(_event_list_store->get_path(_event_list_selection->get_selected()));
-
     show_all_children();
 
+    // scroll to the selected row
+    _event_list_view.set_cursor(_event_list_store->get_path(_event_log->getCurrEvent()));
 }
 
 UndoHistory::~UndoHistory()
 {
 }
 
-void 
+void
 UndoHistory::_onListSelectionChange()
 {
 
@@ -199,7 +224,7 @@ UndoHistory::_onListSelectionChange()
         } else {  // this should not happen
             _event_list_selection->select(curr_event);
         }
-        
+
     } else {
 
         EventLog::const_iterator last_selected = _event_log->getCurrEvent();
@@ -208,7 +233,7 @@ UndoHistory::_onListSelectionChange()
          * of that parent's branch.
          */
 
-        if ( !selected->children().empty() && 
+        if ( !selected->children().empty() &&
              !_event_list_view.row_expanded(_event_list_store->get_path(selected)) )
         {
             selected = selected->children().end();
@@ -216,13 +241,13 @@ UndoHistory::_onListSelectionChange()
         }
 
         // An event before the current one has been selected. Undo to the selected event.
-        if ( _event_list_store->get_path(selected) < 
-             _event_list_store->get_path(last_selected) ) 
+        if ( _event_list_store->get_path(selected) <
+             _event_list_store->get_path(last_selected) )
         {
             _event_log->blockNotifications();
 
             while ( selected != last_selected ) {
-                
+
                 sp_document_undo(_document);
 
                 if ( last_selected->parent() &&
@@ -239,7 +264,7 @@ UndoHistory::_onListSelectionChange()
                     }
                 }
             }
-            _event_log->blockNotifications(false);        
+            _event_log->blockNotifications(false);
             _event_log->updateUndoVerbs();
 
         } else { // An event after the current one has been selected. Redo to the selected event.
@@ -264,8 +289,8 @@ UndoHistory::_onListSelectionChange()
                     }
                 }
             }
-            _event_log->blockNotifications(false);        
-        
+            _event_log->blockNotifications(false);
+
         }
 
         _event_log->setCurrEvent(selected);
@@ -275,20 +300,18 @@ UndoHistory::_onListSelectionChange()
 }
 
 void
-UndoHistory::_onExpandEvent(const Gtk::TreeModel::iterator &iter, const Gtk::TreeModel::Path &path)
+UndoHistory::_onExpandEvent(const Gtk::TreeModel::iterator &iter, const Gtk::TreeModel::Path &/*path*/)
 {
-    if ( iter == _event_list_selection->get_selected() )
-    {
+    if ( iter == _event_list_selection->get_selected() ) {
         _event_list_selection->select(_event_log->getCurrEvent());
     }
 }
 
 void
-UndoHistory::_onCollapseEvent(const Gtk::TreeModel::iterator &iter, const Gtk::TreeModel::Path &path)
+UndoHistory::_onCollapseEvent(const Gtk::TreeModel::iterator &iter, const Gtk::TreeModel::Path &/*path*/)
 {
     // Collapsing a branch we're currently in is equal to stepping to the last event in that branch
-    if ( iter == _event_log->getCurrEvent() )
-    {
+    if ( iter == _event_log->getCurrEvent() ) {
         EventLog::const_iterator curr_event_parent = _event_log->getCurrEvent();
         EventLog::const_iterator curr_event = curr_event_parent->children().begin();
         EventLog::const_iterator last = curr_event_parent->children().end();