Melchior FRANZ:
The attached patch makes remove_child() available as removeChild(pos, keep). That's consistent with getChild. Only renamed remove_child to removeChild and added a check for validity of the pos argument. removeChildren() will be used in input.cxx, and a lot in the upcoming dynamic new_gui dialogs, which are aiming at replacing the hard-coded dialogs. I'll discuss them on the list once the infrastructure is in place. (The <hide> gui property was one part of it.)
This commit is contained in:
+45
-15
@@ -911,6 +911,32 @@ SGPropertyNode::getChildren (const char * name) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Revove child by position.
|
||||||
|
*/
|
||||||
|
SGPropertyNode_ptr
|
||||||
|
SGPropertyNode::removeChild (int pos, bool keep)
|
||||||
|
{
|
||||||
|
SGPropertyNode_ptr node;
|
||||||
|
if (pos < 0 || pos > _children.size() - 1)
|
||||||
|
return node;
|
||||||
|
|
||||||
|
vector<SGPropertyNode_ptr>::iterator it = _children.begin();
|
||||||
|
it += pos;
|
||||||
|
node = _children[pos];
|
||||||
|
_children.erase(it);
|
||||||
|
if (keep) {
|
||||||
|
_removedChildren.push_back(node);
|
||||||
|
}
|
||||||
|
if (_path_cache)
|
||||||
|
_path_cache->erase(node->getName()); // EMH - TODO: Take "index" into account!
|
||||||
|
node->setAttribute(REMOVED, true);
|
||||||
|
node->clearValue();
|
||||||
|
fireChildRemoved(node);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove a child node
|
* Remove a child node
|
||||||
*/
|
*/
|
||||||
@@ -919,25 +945,29 @@ SGPropertyNode::removeChild (const char * name, int index, bool keep)
|
|||||||
{
|
{
|
||||||
SGPropertyNode_ptr ret;
|
SGPropertyNode_ptr ret;
|
||||||
int pos = find_child(name, index, _children);
|
int pos = find_child(name, index, _children);
|
||||||
if (pos >= 0) {
|
if (pos >= 0)
|
||||||
vector<SGPropertyNode_ptr>::iterator it = _children.begin();
|
ret = removeChild(pos, keep);
|
||||||
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove all children with the specified name.
|
||||||
|
*/
|
||||||
|
vector<SGPropertyNode_ptr>
|
||||||
|
SGPropertyNode::removeChildren (const char * name, bool keep)
|
||||||
|
{
|
||||||
|
vector<SGPropertyNode_ptr> children;
|
||||||
|
|
||||||
|
for (int pos = _children.size() - 1; pos >= 0; pos--)
|
||||||
|
if (compare_strings(_children[pos]->getName(), name))
|
||||||
|
children.push_back(removeChild(pos, keep));
|
||||||
|
|
||||||
|
sort(children.begin(), children.end(), CompareIndices());
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
SGPropertyNode::getDisplayName (bool simplify) const
|
SGPropertyNode::getDisplayName (bool simplify) const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -706,12 +706,24 @@ public:
|
|||||||
vector<SGPropertyNode_ptr> getChildren (const char * name) const;
|
vector<SGPropertyNode_ptr> getChildren (const char * name) const;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove child by position.
|
||||||
|
*/
|
||||||
|
SGPropertyNode_ptr removeChild (int pos, bool keep = true);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove a child node
|
* Remove a child node
|
||||||
*/
|
*/
|
||||||
SGPropertyNode_ptr removeChild (const char * name, int index = 0,
|
SGPropertyNode_ptr removeChild (const char * name, int index = 0,
|
||||||
bool keep = true);
|
bool keep = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove all children with the specified name.
|
||||||
|
*/
|
||||||
|
vector<SGPropertyNode_ptr> removeChildren (const char * name,
|
||||||
|
bool keep = true);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Alias support.
|
// Alias support.
|
||||||
|
|||||||
Reference in New Issue
Block a user