From 84e87f0e8a649847285b42d43fcf9c64a9615653 Mon Sep 17 00:00:00 2001 From: ehofman Date: Tue, 28 Jun 2005 11:19:09 +0000 Subject: [PATCH] Due to a misunderstanding of what removeChild() actually does, some used it to detach a subtree from the main tree. The previous patch broke that behaviour so a new function call detchChild() is now added. --- simgear/props/props.cxx | 38 +++++++++++++++++++++++++++++++------- simgear/props/props.hxx | 11 +++++++++-- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/simgear/props/props.cxx b/simgear/props/props.cxx index 2e14a643..927fdd95 100644 --- a/simgear/props/props.cxx +++ b/simgear/props/props.cxx @@ -913,13 +913,39 @@ SGPropertyNode::getChildren (const char * name) const } +/** + * Detach a child node from the tree and return a guarded pointer to it. + */ +SGPropertyNode_ptr +SGPropertyNode::detachChild (const char * name, int index, bool keep) +{ + SGPropertyNode_ptr ret; + int pos = find_child(name, index, _children); + if (pos >= 0) { + vector::iterator it = _children.begin(); + it += pos; + SGPropertyNode_ptr node = _children[pos]; + _children.erase(it); + if (keep) { + _removedChildren.push_back(node); + } + if (_path_cache) + _path_cache->erase(name); // EMH - TODO: Take "index" into account! + node->setAttribute(REMOVED, true); + node->clearValue(); + ret = node; + fireChildRemoved(node); + } + return ret; +} + + /** * Remove a child node, and all children that aren't referenced. - * "keep" does only apply to the outmost item. Returns "true" if - * not all nodes could be removed. + * Returns "true" if not all nodes could be deleted. */ bool -SGPropertyNode::removeChild (const char * name, int index, bool keep) +SGPropertyNode::removeChild (const char * name, int index) { bool dirty = false; int pos = find_child(name, index, _children); @@ -933,9 +959,6 @@ SGPropertyNode::removeChild (const char * name, int index, bool keep) if (node->isTied() || node->_count != 1 || node->nChildren()) dirty = true; else { - if (keep) - _removedChildren.push_back(node); - if (_path_cache) _path_cache->erase(name); // EMH - TODO: Take "index" into account! @@ -948,9 +971,10 @@ SGPropertyNode::removeChild (const char * name, int index, bool keep) return dirty; } + /** * Remove all children nodes, or all with a given name. Returns - * "true" if not all nodes could be removed. + * "true" if not all nodes could be deleted. */ bool SGPropertyNode::removeChildren(const char *name) diff --git a/simgear/props/props.hxx b/simgear/props/props.hxx index 75da1a0c..9a3e4a7e 100644 --- a/simgear/props/props.hxx +++ b/simgear/props/props.hxx @@ -707,10 +707,17 @@ public: /** - * Remove a child node (returns true if at least one node had to remain, + * Detach a child node from the tree and return guarded pointr to it. + */ + SGPropertyNode_ptr detachChild (const char * name, int index = 0, + bool keep = true); + + + /** + * Remove a child node. Returns "true" if at least one node had to remain, * because it was tied, aliased, or refcounted through SGPropertyNode_ptr. */ - bool removeChild (const char * name, int index = 0, bool keep = true); + bool removeChild (const char * name, int index = 0); /** -- 2.39.5