From 265d3bfecbec14917ebb262ce5ea58bbaf1d48a2 Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Sat, 27 May 2006 04:26:51 +0000 Subject: Prevent layer name duplication (bzr r1024) --- src/layer-manager.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'src/layer-manager.cpp') diff --git a/src/layer-manager.cpp b/src/layer-manager.cpp index 840d12380..81e8698b0 100644 --- a/src/layer-manager.cpp +++ b/src/layer-manager.cpp @@ -7,6 +7,7 @@ * Released under GNU GPL, read the file 'COPYING' for more information */ +#include #include #include #include "gc-managed.h" @@ -68,6 +69,57 @@ LayerManager::LayerManager(SPDesktop *desktop) _setDocument(desktop->doc()); } + +void LayerManager::renameLayer( SPObject* obj, gchar const *label ) +{ + Glib::ustring incoming( label ? label : "" ); + Glib::ustring result(incoming); + Glib::ustring base(incoming); + guint startNum = 1; + + size_t 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(val); + } + g_free(numpart); + } + } + + std::set 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(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; + + g_free(suffix); + } + + obj->setLabel( result.c_str() ); +} + + + void LayerManager::_setDocument(SPDocument *document) { if (_document) { _resource_connection.disconnect(); -- cgit v1.2.3