diff options
| author | Jon A. Cruz <jon@joncruz.org> | 2006-05-26 07:10:40 +0000 |
|---|---|---|
| committer | joncruz <joncruz@users.sourceforge.net> | 2006-05-26 07:10:40 +0000 |
| commit | 3652663552d7c59e1f208c00bfdb28f492af1cbe (patch) | |
| tree | 6f1e189cdba54494968b7ad96c96dc57889bc683 /src/layer-manager.cpp | |
| parent | Additional translation string cleanup for bug #1490928 (diff) | |
| download | inkscape-3652663552d7c59e1f208c00bfdb28f492af1cbe.tar.gz inkscape-3652663552d7c59e1f208c00bfdb28f492af1cbe.zip | |
Cleaned up propagation of status changes.
(bzr r1018)
Diffstat (limited to 'src/layer-manager.cpp')
| -rw-r--r-- | src/layer-manager.cpp | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/src/layer-manager.cpp b/src/layer-manager.cpp index ab2dff107..840d12380 100644 --- a/src/layer-manager.cpp +++ b/src/layer-manager.cpp @@ -17,9 +17,41 @@ #include "ui/view/view.h" #include "sp-object.h" #include "xml/node.h" +#include "xml/node-observer.h" namespace Inkscape { + +using Inkscape::XML::Node; + +class LayerManager::LayerWatcher : public Inkscape::XML::NodeObserver { +public: + LayerWatcher(LayerManager* mgr, SPObject* obj) : + _mgr(mgr), + _obj(obj), + _lockedAttr(g_quark_from_string("sodipodi:insensitive")), + _labelAttr(g_quark_from_string("inkscape:label")) + {} + + virtual void notifyChildAdded( Node &node, Node &child, Node *prev ) {} + virtual void notifyChildRemoved( Node &node, Node &child, Node *prev ) {} + virtual void notifyChildOrderChanged( Node &node, Node &child, Node *old_prev, Node *new_prev ) {} + virtual void notifyContentChanged( Node &node, Util::ptr_shared<char> old_content, Util::ptr_shared<char> new_content ) {} + virtual void notifyAttributeChanged( Node &node, GQuark name, Util::ptr_shared<char> old_value, Util::ptr_shared<char> new_value ) { + if ( name == _lockedAttr || name == _labelAttr ) { + if ( _mgr && _obj ) { + _mgr->_objectModified( _obj, 0 ); + } + } + } + + LayerManager* _mgr; + SPObject* _obj; + GQuark _lockedAttr; + GQuark _labelAttr; +}; + + LayerManager::LayerManager(SPDesktop *desktop) : _desktop(desktop), _document(NULL) { @@ -59,7 +91,19 @@ void LayerManager::_objectModified( SPObject* obj, guint flags ) } void LayerManager::_rebuild() { + while ( !_watchers.empty() ) { + LayerWatcher* one = _watchers.back(); + _watchers.pop_back(); + if ( one->_obj ) { + Node* node = SP_OBJECT_REPR(one->_obj); + if ( node ) { + node->removeObserver(*one); + } + } + } + _clear(); + GSList const *layers=sp_document_get_resource_list(_document, "layer"); SPObject *root=_desktop->currentRoot(); if ( root ) { @@ -78,10 +122,14 @@ void LayerManager::_rebuild() { while ( higher && (SP_OBJECT_PARENT(higher) != root) ) { higher = SP_OBJECT_PARENT(higher); } - Inkscape::XML::Node* node = higher ? SP_OBJECT_REPR(higher) : 0; + Node* node = higher ? SP_OBJECT_REPR(higher) : 0; if ( node && node->parent() ) { g_signal_connect( G_OBJECT(curr), "modified", G_CALLBACK( _objectModifiedCB ), this ); + LayerWatcher* eye = new LayerWatcher(this, curr); + _watchers.push_back( eye ); + SP_OBJECT_REPR(curr)->addObserver(*eye); + _addOne(curr); } } |
