]> git.mxchange.org Git - flightgear.git/commitdiff
Canvas: Don't crash on removing child hierarchie from map
authorThomas Geymayer <tomgey@gmail.com>
Tue, 18 Sep 2012 21:21:50 +0000 (23:21 +0200)
committerThomas Geymayer <tomgey@gmail.com>
Tue, 18 Sep 2012 21:21:50 +0000 (23:21 +0200)
Currently if a SGPropertyNode is removed from the property tree
only for this single node a childRemoved event is triggered. So
if we just check for a specific child to be removed, we will never
be notified. This commit manually triggers the event recursively
for all children but this should probably go directly into simgear.

src/Canvas/property_based_mgr.cxx
src/Canvas/property_helper.cxx
src/Canvas/property_helper.hxx

index d02e7ed6fb535d32f06cb848239e0908a5d16ac0..148c96e3204790ca217a7822743b2fde46556a80 100644 (file)
@@ -83,7 +83,9 @@ void PropertyBasedMgr::childAdded( SGPropertyNode * parent,
 void PropertyBasedMgr::childRemoved( SGPropertyNode * parent,
                                      SGPropertyNode * child )
 {
-  if( parent != _props || child->getNameString() != _name_elements )
+  if( parent != _props )
+    return canvas::triggerRemoveRecursive(child);
+  else if( child->getNameString() != _name_elements )
     return;
 
   size_t index = child->getIndex();
index ce5add9dd70301595b5bb44c39ae0269948b8479..3579ad6e1fcae980de87cd18ef68b588555f7d4b 100644 (file)
@@ -144,4 +144,15 @@ namespace canvas
     for( int i = 0; i < node->nChildren(); ++i )
       triggerChangeRecursive( node->getChild(i) );
   }
+
+  //----------------------------------------------------------------------------
+  void triggerRemoveRecursive(SGPropertyNode* node)
+  {
+    for( int i = 0; i < node->nChildren(); ++i )
+    {
+      SGPropertyNode* child = node->getChild(i);
+      node->fireChildRemoved( child );
+      triggerRemoveRecursive( child );
+    }
+  }
 }
index a92c0466660d7da4979ae9aa3047c9a7c5deb46a..92e556afcfd617b7d90214d0d64af325103386e6 100644 (file)
@@ -98,6 +98,12 @@ namespace canvas
    */
   void triggerChangeRecursive(SGPropertyNode* node);
 
+  /**
+   * Trigger a childRemoved event for every child of node (Unlimited depth) and
+   * node itself.
+   */
+  void triggerRemoveRecursive(SGPropertyNode* node);
+
 } // namespace canvas
 
 #endif /* PROPERTY_HELPER_HXX_ */