summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--scene/main/node.cpp26
-rw-r--r--tests/scene/test_node.h17
2 files changed, 27 insertions, 16 deletions
diff --git a/scene/main/node.cpp b/scene/main/node.cpp
index ea89a719e8..a21866610c 100644
--- a/scene/main/node.cpp
+++ b/scene/main/node.cpp
@@ -1665,25 +1665,19 @@ TypedArray<Node> Node::find_children(const String &p_pattern, const String &p_ty
continue;
}
- if (!p_pattern.is_empty()) {
- if (!cptr[i]->data.name.operator String().match(p_pattern)) {
- continue;
- } else if (p_type.is_empty()) {
+ if (p_pattern.is_empty() || cptr[i]->data.name.operator String().match(p_pattern)) {
+ if (p_type.is_empty() || cptr[i]->is_class(p_type)) {
ret.append(cptr[i]);
- }
- }
+ } else if (cptr[i]->get_script_instance()) {
+ Ref<Script> scr = cptr[i]->get_script_instance()->get_script();
+ while (scr.is_valid()) {
+ if ((ScriptServer::is_global_class(p_type) && ScriptServer::get_global_class_path(p_type) == scr->get_path()) || p_type == scr->get_path()) {
+ ret.append(cptr[i]);
+ break;
+ }
- if (cptr[i]->is_class(p_type)) {
- ret.append(cptr[i]);
- } else if (cptr[i]->get_script_instance()) {
- Ref<Script> scr = cptr[i]->get_script_instance()->get_script();
- while (scr.is_valid()) {
- if ((ScriptServer::is_global_class(p_type) && ScriptServer::get_global_class_path(p_type) == scr->get_path()) || p_type == scr->get_path()) {
- ret.append(cptr[i]);
- break;
+ scr = scr->get_base_script();
}
-
- scr = scr->get_base_script();
}
}
diff --git a/tests/scene/test_node.h b/tests/scene/test_node.h
index 8b0655125d..b3362b02a8 100644
--- a/tests/scene/test_node.h
+++ b/tests/scene/test_node.h
@@ -308,6 +308,9 @@ TEST_CASE("[SceneTree][Node] Testing node operations with a more complex simple
Node *child = SceneTree::get_singleton()->get_root()->find_child("NestedNode", true, false);
CHECK_EQ(child, nullptr);
+ TypedArray<Node> children = SceneTree::get_singleton()->get_root()->find_children("NestedNode", "", true, false);
+ CHECK_EQ(children.size(), 0);
+
node1->set_name("Node1");
node2->set_name("Node2");
node1_1->set_name("NestedNode");
@@ -315,15 +318,29 @@ TEST_CASE("[SceneTree][Node] Testing node operations with a more complex simple
child = SceneTree::get_singleton()->get_root()->find_child("NestedNode", true, false);
CHECK_EQ(child, node1_1);
+ children = SceneTree::get_singleton()->get_root()->find_children("NestedNode", "", true, false);
+ CHECK_EQ(children.size(), 1);
+ CHECK_EQ(Object::cast_to<Node>(children[0]), node1_1);
+
// First node that matches with the name is node1.
child = SceneTree::get_singleton()->get_root()->find_child("Node?", true, false);
CHECK_EQ(child, node1);
+ children = SceneTree::get_singleton()->get_root()->find_children("Node?", "", true, false);
+ CHECK_EQ(children.size(), 2);
+ CHECK_EQ(Object::cast_to<Node>(children[0]), node1);
+ CHECK_EQ(Object::cast_to<Node>(children[1]), node2);
+
SceneTree::get_singleton()->get_root()->move_child(node2, 0);
// It should be node2, as it is now the first one in the tree.
child = SceneTree::get_singleton()->get_root()->find_child("Node?", true, false);
CHECK_EQ(child, node2);
+
+ children = SceneTree::get_singleton()->get_root()->find_children("Node?", "", true, false);
+ CHECK_EQ(children.size(), 2);
+ CHECK_EQ(Object::cast_to<Node>(children[0]), node2);
+ CHECK_EQ(Object::cast_to<Node>(children[1]), node1);
}
SUBCASE("Nodes should be accessible via their node path") {