Code

fix guide dragging
[inkscape.git] / src / widgets / layer-selector.cpp
index b95005cd9830c65e6ce1f48db5b969d190beb2eb..10b497cacacb8b730d65d5afd261f6f41370c06f 100644 (file)
@@ -28,7 +28,9 @@
 #include "desktop.h"
 #include "document.h"
 #include "dialogs/layer-properties.h"
+#include "layer-manager.h"
 #include "xml/node-event-vector.h"
+#include "verbs.h"
 
 namespace Inkscape {
 namespace Widgets {
@@ -74,24 +76,24 @@ public:
     }
 
 private:
-    Gtk::Widget *_a; 
+    Gtk::Widget *_a;
     Gtk::Widget *_b;
     bool _state;
 };
 
 }
 
-/** LayerSelector constructor.  Creates lock and hide buttons, 
+/** LayerSelector constructor.  Creates lock and hide buttons,
  *  initalizes the layer dropdown selector with a label renderer,
  *  and hooks up signal for setting the desktop layer when the
  *  selector is changed.
- */ 
+ */
 LayerSelector::LayerSelector(SPDesktop *desktop)
 : _desktop(NULL), _layer(NULL)
 {
     AlternateIcons *label;
 
-    label = Gtk::manage(new AlternateIcons(Inkscape::ICON_SIZE_MENU, "visible", "hidden"));
+    label = Gtk::manage(new AlternateIcons(Inkscape::ICON_SIZE_DECORATION, "visible", "hidden"));
     _visibility_toggle.add(*label);
     _visibility_toggle.signal_toggled().connect(
         sigc::compose(
@@ -111,7 +113,7 @@ LayerSelector::LayerSelector(SPDesktop *desktop)
     _tooltips.set_tip(_visibility_toggle, _("Toggle current layer visibility"));
     pack_start(_visibility_toggle, Gtk::PACK_EXPAND_PADDING);
 
-    label = Gtk::manage(new AlternateIcons(Inkscape::ICON_SIZE_MENU, "lock_unlocked", "width_height_lock"));
+    label = Gtk::manage(new AlternateIcons(Inkscape::ICON_SIZE_DECORATION, "lock_unlocked", "width_height_lock"));
     _lock_toggle.add(*label);
     _lock_toggle.signal_toggled().connect(
         sigc::compose(
@@ -148,7 +150,7 @@ LayerSelector::LayerSelector(SPDesktop *desktop)
     setDesktop(desktop);
 }
 
-/**  Destructor - disconnects signal handler 
+/**  Destructor - disconnects signal handler
  */
 LayerSelector::~LayerSelector() {
     setDesktop(NULL);
@@ -157,7 +159,7 @@ LayerSelector::~LayerSelector() {
 
 namespace {
 
-/** Helper function - detaches desktop from selector 
+/** Helper function - detaches desktop from selector
  */
 bool detach(LayerSelector *selector) {
     selector->setDesktop(NULL);
@@ -223,7 +225,7 @@ private:
 
 }
 
-/** Selects the given layer in the dropdown selector.  
+/** Selects the given layer in the dropdown selector.
  */
 void LayerSelector::_selectLayer(SPObject *layer) {
     using Inkscape::Util::List;
@@ -290,11 +292,16 @@ void LayerSelector::_setDesktopLayer() {
     SPObject *layer=_selector.get_active()->get_value(_model_columns.object);
     if ( _desktop && layer ) {
         _layer_changed_connection.block();
-        _desktop->setCurrentLayer(layer);
+
+        _desktop->layer_manager->setCurrentLayer(layer);
+
         _layer_changed_connection.unblock();
-        SP_DT_SELECTION(_desktop)->clear();
+
         _selectLayer(_desktop->currentLayer());
     }
+    if (_desktop && _desktop->canvas) {
+        gtk_widget_grab_focus (GTK_WIDGET(_desktop->canvas));
+    }
 }
 
 /** Creates rows in the _layer_model data structure for each item
@@ -354,9 +361,9 @@ struct Callbacks {
     sigc::slot<void> update_list;
 };
 
-void attribute_changed(Inkscape::XML::Node *repr, gchar const *name,
-                       gchar const *old_value, gchar const *new_value,
-                       bool is_interactive, void *data) 
+void attribute_changed(Inkscape::XML::Node */*repr*/, gchar const *name,
+                       gchar const */*old_value*/, gchar const */*new_value*/,
+                       bool /*is_interactive*/, void *data)
 {
     if ( !std::strcmp(name, "inkscape:groupmode") ) {
         reinterpret_cast<Callbacks *>(data)->update_list();
@@ -365,22 +372,22 @@ void attribute_changed(Inkscape::XML::Node *repr, gchar const *name,
     }
 }
 
-void node_added(Inkscape::XML::Node *parent, Inkscape::XML::Node *child, Inkscape::XML::Node *ref, void *data) {
+void node_added(Inkscape::XML::Node */*parent*/, Inkscape::XML::Node *child, Inkscape::XML::Node */*ref*/, void *data) {
     gchar const *mode=child->attribute("inkscape:groupmode");
     if ( mode && !std::strcmp(mode, "layer") ) {
         reinterpret_cast<Callbacks *>(data)->update_list();
     }
 }
 
-void node_removed(Inkscape::XML::Node *parent, Inkscape::XML::Node *child, Inkscape::XML::Node *ref, void *data) {
+void node_removed(Inkscape::XML::Node */*parent*/, Inkscape::XML::Node *child, Inkscape::XML::Node */*ref*/, void *data) {
     gchar const *mode=child->attribute("inkscape:groupmode");
     if ( mode && !std::strcmp(mode, "layer") ) {
         reinterpret_cast<Callbacks *>(data)->update_list();
     }
 }
 
-void node_reordered(Inkscape::XML::Node *parent, Inkscape::XML::Node *child,
-                    Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref,
+void node_reordered(Inkscape::XML::Node */*parent*/, Inkscape::XML::Node *child,
+                    Inkscape::XML::Node */*old_ref*/, Inkscape::XML::Node */*new_ref*/,
                     void *data)
 {
     gchar const *mode=child->attribute("inkscape:groupmode");
@@ -418,6 +425,18 @@ void LayerSelector::_protectUpdate(sigc::slot<void> slot) {
     _visibility_toggled_connection.block(true);
     _lock_toggled_connection.block(true);
     slot();
+
+    SPObject *layer = _desktop ? _desktop->currentLayer() : 0;
+    if ( layer ) {
+        bool wantedValue = ( SP_IS_ITEM(layer) ? SP_ITEM(layer)->isLocked() : false );
+        if ( _lock_toggle.get_active() != wantedValue ) {
+            _lock_toggle.set_active( wantedValue );
+        }
+        wantedValue = ( SP_IS_ITEM(layer) ? SP_ITEM(layer)->isHidden() : false );
+        if ( _visibility_toggle.get_active() != wantedValue ) {
+            _visibility_toggle.set_active( wantedValue );
+        }
+    }
     _visibility_toggled_connection.block(visibility_blocked);
     _lock_toggled_connection.block(lock_blocked);
 }
@@ -501,7 +520,7 @@ void LayerSelector::_destroyEntry(Gtk::ListStore::iterator const &row) {
     delete callbacks;
 }
 
-/** Formats the label for a given layer row 
+/** Formats the label for a given layer row
  */
 void LayerSelector::_prepareLabelRenderer(
     Gtk::TreeModel::const_iterator const &row
@@ -545,7 +564,7 @@ void LayerSelector::_prepareLabelRenderer(
             label = _("(root)");
         }
 
-        gchar *text = g_markup_printf_escaped(format, label); 
+        gchar *text = g_markup_printf_escaped(format, label);
         _label_renderer.property_markup() = text;
         g_free(text);
         g_free(format);
@@ -562,14 +581,16 @@ void LayerSelector::_prepareLabelRenderer(
 void LayerSelector::_lockLayer(bool lock) {
     if ( _layer && SP_IS_ITEM(_layer) ) {
         SP_ITEM(_layer)->setLocked(lock);
-        sp_document_maybe_done(SP_DT_DOCUMENT(_desktop), "LayerSelector:lock");
+        sp_document_done(sp_desktop_document(_desktop), SP_VERB_NONE,
+                         lock? _("Lock layer") : _("Unlock layer"));
     }
 }
 
 void LayerSelector::_hideLayer(bool hide) {
     if ( _layer && SP_IS_ITEM(_layer) ) {
         SP_ITEM(_layer)->setHidden(hide);
-        sp_document_maybe_done(SP_DT_DOCUMENT(_desktop), "LayerSelector:hide");
+        sp_document_done(sp_desktop_document(_desktop), SP_VERB_NONE,
+                         hide? _("Hide layer") : _("Unhide layer"));
     }
 }