Code

Add a zoom correction option to preferences (used when zooming to 1:1 etc. to display...
[inkscape.git] / src / ui / dialog / undo-history.cpp
index 13f6bff261423f9c26269c2f3a85ba3ee1764720..f2f51a780094239aea95b29abef5494ef168279a 100644 (file)
@@ -22,6 +22,7 @@
 #include "inkscape.h"
 #include "ui/icons.h"
 #include "verbs.h"
+#include "desktop-handles.h"
 
 #include "undo-history.h"
 
@@ -31,7 +32,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 +51,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 +72,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,30 +85,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),
-      _document (SP_ACTIVE_DOCUMENT),
-      _event_log (_document ? &_document->getEventLog() : 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();
@@ -145,7 +173,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));
 
@@ -155,27 +183,27 @@ 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()
 {
 
     EventLog::const_iterator selected = _event_list_selection->get_selected();
 
     /* If no event is selected in the view, find the right one and select it. This happens whenever
-     *  a branch we're currently in is collapsed.
+     * a branch we're currently in is collapsed.
      */
     if (!selected) {
 
@@ -198,7 +226,7 @@ UndoHistory::_onListSelectionChange()
         } else {  // this should not happen
             _event_list_selection->select(curr_event);
         }
-        
+
     } else {
 
         EventLog::const_iterator last_selected = _event_log->getCurrEvent();
@@ -207,7 +235,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();
@@ -215,13 +243,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() &&
@@ -238,7 +266,8 @@ 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.
 
@@ -262,30 +291,29 @@ UndoHistory::_onListSelectionChange()
                     }
                 }
             }
-            _event_log->blockNotifications(false);        
-        
+            _event_log->blockNotifications(false);
+
         }
 
         _event_log->setCurrEvent(selected);
+        _event_log->updateUndoVerbs();
     }
 
 }
 
 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();