summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--scene/gui/tree.h3
-rw-r--r--tests/scene/test_tree.h24
2 files changed, 27 insertions, 0 deletions
diff --git a/scene/gui/tree.h b/scene/gui/tree.h
index 9b1541f4b9..4518708685 100644
--- a/scene/gui/tree.h
+++ b/scene/gui/tree.h
@@ -178,6 +178,9 @@ private:
if (parent->first_child == this) {
parent->first_child = next;
}
+ if (parent->last_child == this) {
+ parent->last_child = prev;
+ }
}
}
diff --git a/tests/scene/test_tree.h b/tests/scene/test_tree.h
index 41ef39d621..e19f8311e2 100644
--- a/tests/scene/test_tree.h
+++ b/tests/scene/test_tree.h
@@ -108,6 +108,30 @@ TEST_CASE("[SceneTree][Tree]") {
memdelete(tree);
}
+ // https://github.com/godotengine/godot/issues/96205
+ SUBCASE("[Tree] Get last item after removal.") {
+ Tree *tree = memnew(Tree);
+ TreeItem *root = tree->create_item();
+
+ TreeItem *child1 = tree->create_item(root);
+ TreeItem *child2 = tree->create_item(root);
+
+ CHECK_EQ(root->get_child_count(), 2);
+ CHECK_EQ(tree->get_last_item(), child2);
+
+ root->remove_child(child2);
+
+ CHECK_EQ(root->get_child_count(), 1);
+ CHECK_EQ(tree->get_last_item(), child1);
+
+ root->add_child(child2);
+
+ CHECK_EQ(root->get_child_count(), 2);
+ CHECK_EQ(tree->get_last_item(), child2);
+
+ memdelete(tree);
+ }
+
SUBCASE("[Tree] Previous and Next items.") {
Tree *tree = memnew(Tree);
TreeItem *root = tree->create_item();