X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Flayer-manager.cpp;h=4d92d37c846edf4030e495f9f0bdc24884b1222c;hb=915f222e72a35382120e42ff1d204a99b16644b6;hp=e2e40340f6dff1d4d94e3594eba369429aa21585;hpb=6a13f00062e752dfe3aecd06dbc6d57c5f62ba8c;p=inkscape.git diff --git a/src/layer-manager.cpp b/src/layer-manager.cpp index e2e40340f..4d92d37c8 100644 --- a/src/layer-manager.cpp +++ b/src/layer-manager.cpp @@ -30,9 +30,10 @@ using Inkscape::XML::Node; class LayerManager::LayerWatcher : public Inkscape::XML::NodeObserver { public: - LayerWatcher(LayerManager* mgr, SPObject* obj) : + LayerWatcher(LayerManager* mgr, SPObject* obj, sigc::connection c) : _mgr(mgr), _obj(obj), + _connection(c), _lockedAttr(g_quark_from_string("sodipodi:insensitive")), _labelAttr(g_quark_from_string("inkscape:label")) {} @@ -51,6 +52,7 @@ public: LayerManager* _mgr; SPObject* _obj; + sigc::connection _connection; GQuark _lockedAttr; GQuark _labelAttr; }; @@ -75,10 +77,13 @@ LayerManager::LayerManager(SPDesktop *desktop) void LayerManager::setCurrentLayer( SPObject* obj ) { - _desktop->setCurrentLayer( obj ); + //g_return_if_fail( _desktop->currentRoot() ); + if ( _desktop->currentRoot() ) { + _desktop->setCurrentLayer( obj ); - if ( prefs_get_int_attribute_limited("options.selection", "layerdeselect", 1, 0, 1) ) { - sp_desktop_selection( _desktop )->clear(); + if ( prefs_get_int_attribute_limited("options.selection", "layerdeselect", 1, 0, 1) ) { + sp_desktop_selection( _desktop )->clear(); + } } } @@ -143,12 +148,6 @@ void LayerManager::_setDocument(SPDocument *document) { _rebuild(); } - -void LayerManager::_objectModifiedCB( SPObject* obj, guint flags, LayerManager* mgr ) -{ - mgr->_objectModified( obj, flags ); -} - void LayerManager::_objectModified( SPObject* obj, guint flags ) { _details_changed_signal.emit( obj ); @@ -163,6 +162,7 @@ void LayerManager::_rebuild() { if ( node ) { node->removeObserver(*one); } + one->_connection.disconnect(); } } @@ -182,15 +182,16 @@ void LayerManager::_rebuild() { // Such may have been the cause of bug 1339397. // See http://sourceforge.net/tracker/index.php?func=detail&aid=1339397&group_id=93438&atid=604306 + SPObject const *higher = curr; while ( higher && (SP_OBJECT_PARENT(higher) != root) ) { higher = SP_OBJECT_PARENT(higher); } Node* node = higher ? SP_OBJECT_REPR(higher) : 0; if ( node && node->parent() ) { - g_signal_connect( G_OBJECT(curr), "modified", G_CALLBACK( _objectModifiedCB ), this ); + sigc::connection connection = curr->connectModified(sigc::mem_fun(*this, &LayerManager::_objectModified)); - LayerWatcher* eye = new LayerWatcher(this, curr); + LayerWatcher *eye = new LayerWatcher(this, curr, connection); _watchers.push_back( eye ); SP_OBJECT_REPR(curr)->addObserver(*eye);