Code

Patch by Tavmjong for 451588
[inkscape.git] / src / layer-manager.cpp
index 2edc26de4104c41648ca251c43a188403c27d8ef..8c45c7e53642fdebabb75b930ce24efb09909ab2 100644 (file)
 #include "desktop.h"
 #include "desktop-handles.h"
 #include "layer-manager.h"
-#include "prefs-utils.h"
+#include "preferences.h"
 #include "ui/view/view.h"
 #include "selection.h"
 #include "sp-object.h"
 #include "sp-item-group.h"
 #include "xml/node.h"
 #include "xml/node-observer.h"
+#include "util/format.h"
 // #include "debug/event-tracker.h"
 // #include "debug/simple-event.h"
 
@@ -82,13 +83,20 @@ Util::ptr_shared<char> stringify_obj(SPObject const &obj) {
 
 typedef Debug::SimpleEvent<Debug::Event::OTHER> DebugLayer;
 
+class DebugLayerNote : public DebugLayer {
+public:
+    DebugLayerNote(Util::ptr_shared<char> descr)
+        : DebugLayer(Util::share_static_string("layer-note"))
+    {
+        _addProperty("descr", descr);
+    }
+};
 
 class DebugLayerRebuild : public DebugLayer {
 public:
     DebugLayerRebuild()
         : DebugLayer(Util::share_static_string("rebuild-layers"))
     {
-        _addProperty("simple", Util::share_static_string("foo"));
     }
 };
 
@@ -110,7 +118,7 @@ public:
 };
 
 
-}
+} // end of namespace
 */
 
 LayerManager::LayerManager(SPDesktop *desktop)
@@ -142,55 +150,60 @@ void LayerManager::setCurrentLayer( SPObject* obj )
     if ( _desktop->currentRoot() ) {
         _desktop->setCurrentLayer( obj );
 
-        if ( prefs_get_int_attribute_limited("options.selection", "layerdeselect", 1, 0, 1) ) {
+        Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+        if (prefs->getBool("/options/selection/layerdeselect", true)) {
             sp_desktop_selection( _desktop )->clear();
         }
     }
 }
 
-void LayerManager::renameLayer( SPObject* obj, gchar const *label )
+void LayerManager::renameLayer( SPObject* obj, gchar const *label, bool uniquify )
 {
     Glib::ustring incoming( label ? label : "" );
     Glib::ustring result(incoming);
     Glib::ustring base(incoming);
     guint startNum = 1;
 
-    Glib::ustring::size_type pos = base.rfind('#');
-    if ( pos != Glib::ustring::npos ) {
-        gchar* numpart = g_strdup(base.substr(pos+1).c_str());
-        if ( numpart ) {
-            gchar* endPtr = 0;
-            guint64 val = g_ascii_strtoull( numpart, &endPtr, 10);
-            if ( ((val > 0) || (endPtr != numpart)) && (val < 65536) ) {
-                base.erase( pos );
-                result = base;
-                startNum = static_cast<int>(val);
+    if (uniquify) {
+
+        Glib::ustring::size_type pos = base.rfind('#');
+        if ( pos != Glib::ustring::npos ) {
+            gchar* numpart = g_strdup(base.substr(pos+1).c_str());
+            if ( numpart ) {
+                gchar* endPtr = 0;
+                guint64 val = g_ascii_strtoull( numpart, &endPtr, 10);
+                if ( ((val > 0) || (endPtr != numpart)) && (val < 65536) ) {
+                    base.erase( pos );
+                    result = base;
+                    startNum = static_cast<int>(val);
+                }
+                g_free(numpart);
             }
-            g_free(numpart);
         }
-    }
 
-    std::set<Glib::ustring> currentNames;
-    GSList const *layers=sp_document_get_resource_list(_document, "layer");
-    SPObject *root=_desktop->currentRoot();
-    if ( root ) {
-        for ( GSList const *iter=layers ; iter ; iter = iter->next ) {
-            SPObject *layer=static_cast<SPObject *>(iter->data);
-            if ( layer != obj ) {
-                currentNames.insert( layer->label() ? Glib::ustring(layer->label()) : Glib::ustring() );
+        std::set<Glib::ustring> currentNames;
+        GSList const *layers=sp_document_get_resource_list(_document, "layer");
+        SPObject *root=_desktop->currentRoot();
+        if ( root ) {
+            for ( GSList const *iter=layers ; iter ; iter = iter->next ) {
+                SPObject *layer=static_cast<SPObject *>(iter->data);
+                if ( layer != obj ) {
+                    currentNames.insert( layer->label() ? Glib::ustring(layer->label()) : Glib::ustring() );
+                }
             }
         }
-    }
 
-    // Not sure if we need to cap it, but we'll just be paranoid for the moment
-    // Intentionally unsigned
-    guint endNum = startNum + 3000;
-    for ( guint i = startNum; (i < endNum) && (currentNames.find(result) != currentNames.end()); i++ ) {
-        gchar* suffix = g_strdup_printf("#%d", i);
-        result = base;
-        result += suffix;
+        // Not sure if we need to cap it, but we'll just be paranoid for the moment
+        // Intentionally unsigned
+        guint endNum = startNum + 3000;
+        for ( guint i = startNum; (i < endNum) && (currentNames.find(result) != currentNames.end()); i++ ) {
+            gchar* suffix = g_strdup_printf("#%d", i);
+            result = base;
+            result += suffix;
+
+            g_free(suffix);
+        }
 
-        g_free(suffix);
     }
 
     obj->setLabel( result.c_str() );
@@ -243,6 +256,7 @@ void LayerManager::_rebuild() {
 
         for ( GSList const *iter = layers; iter; iter = iter->next ) {
             SPObject *layer = static_cast<SPObject *>(iter->data);
+//             Debug::EventTracker<DebugLayerNote> tracker(Util::format("Examining %s", layer->label()));
             bool needsAdd = false;
             std::set<SPGroup*> additional;
 
@@ -254,10 +268,17 @@ void LayerManager::_rebuild() {
                         if ( group->layerMode() == SPGroup::LAYER ) {
                             // If we have a layer-group as the one or a parent, ensure it is listed as a valid layer.
                             needsAdd &= ( g_slist_find(const_cast<GSList *>(layers), curr) != NULL );
+                            if ( (!(group->repr)) || (!(group->repr->parent())) ) {
+                                needsAdd = false;
+                            }
                         } else {
                             // If a non-layer group is a parent of layer groups, then show it also as a layer.
                             // TODO add the magic Inkscape group mode?
-                            additional.insert(group);
+                            if ( group->repr && group->repr->parent() ) {
+                                additional.insert(group);
+                            } else {
+                                needsAdd = false;
+                            }
                         }
                     }
                 }
@@ -267,7 +288,9 @@ void LayerManager::_rebuild() {
                     layersToAdd.insert(SP_GROUP(layer));
                 }
                 for ( std::set<SPGroup*>::iterator it = additional.begin(); it != additional.end(); ++it ) {
-                    layersToAdd.insert(*it);
+                    if ( !includes(*it) ) {
+                        layersToAdd.insert(*it);
+                    }
                 }
             }
         }