Merge pull request #22115 from akerudesu/find-parent

Added find_parent method to node class
This commit is contained in:
Max Hilbrunner 2018-09-22 17:15:38 +02:00 committed by GitHub
commit d878c828b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 0 deletions

View File

@ -266,6 +266,15 @@
Returns the parent node of the current node, or an empty [code]Node[/code] if the node lacks a parent. Returns the parent node of the current node, or an empty [code]Node[/code] if the node lacks a parent.
</description> </description>
</method> </method>
<method name="find_parent" qualifiers="const">
<return type="Node">
</return>
<argument index="0" name="mask" type="String">
</argument>
<description>
Finds the first parent of the current node whose name matches [code]mask[/code] as in [method String.match] (i.e. case sensitive, but '*' matches zero or more characters and '?' matches any single character except '.'). Note that it does not match against the full path, just against individual node names.
</description>
</method>
<method name="get_path" qualifiers="const"> <method name="get_path" qualifiers="const">
<return type="NodePath"> <return type="NodePath">
</return> </return>

View File

@ -1348,6 +1348,19 @@ Node *Node::get_parent() const {
return data.parent; return data.parent;
} }
Node *Node::find_parent(const String &p_mask) const {
Node *p = data.parent;
while (p) {
if (p->data.name.operator String().match(p_mask))
return p;
p = p->data.parent;
}
return NULL;
}
bool Node::is_a_parent_of(const Node *p_node) const { bool Node::is_a_parent_of(const Node *p_node) const {
ERR_FAIL_NULL_V(p_node, false); ERR_FAIL_NULL_V(p_node, false);
@ -2629,6 +2642,7 @@ void Node::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_node", "path"), &Node::get_node); ClassDB::bind_method(D_METHOD("get_node", "path"), &Node::get_node);
ClassDB::bind_method(D_METHOD("get_parent"), &Node::get_parent); ClassDB::bind_method(D_METHOD("get_parent"), &Node::get_parent);
ClassDB::bind_method(D_METHOD("find_node", "mask", "recursive", "owned"), &Node::find_node, DEFVAL(true), DEFVAL(true)); ClassDB::bind_method(D_METHOD("find_node", "mask", "recursive", "owned"), &Node::find_node, DEFVAL(true), DEFVAL(true));
ClassDB::bind_method(D_METHOD("find_parent", "mask"), &Node::find_parent);
ClassDB::bind_method(D_METHOD("has_node_and_resource", "path"), &Node::has_node_and_resource); ClassDB::bind_method(D_METHOD("has_node_and_resource", "path"), &Node::has_node_and_resource);
ClassDB::bind_method(D_METHOD("get_node_and_resource", "path"), &Node::_get_node_and_resource); ClassDB::bind_method(D_METHOD("get_node_and_resource", "path"), &Node::_get_node_and_resource);

View File

@ -257,6 +257,8 @@ public:
Node *get_node_and_resource(const NodePath &p_path, RES &r_res, Vector<StringName> &r_leftover_subpath, bool p_last_is_property = true) const; Node *get_node_and_resource(const NodePath &p_path, RES &r_res, Vector<StringName> &r_leftover_subpath, bool p_last_is_property = true) const;
Node *get_parent() const; Node *get_parent() const;
Node *find_parent(const String &p_mask) const;
_FORCE_INLINE_ SceneTree *get_tree() const { _FORCE_INLINE_ SceneTree *get_tree() const {
ERR_FAIL_COND_V(!data.tree, NULL); ERR_FAIL_COND_V(!data.tree, NULL);
return data.tree; return data.tree;