summaryrefslogtreecommitdiffstats
path: root/editor/gui/scene_tree_editor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'editor/gui/scene_tree_editor.cpp')
-rw-r--r--editor/gui/scene_tree_editor.cpp34
1 files changed, 33 insertions, 1 deletions
diff --git a/editor/gui/scene_tree_editor.cpp b/editor/gui/scene_tree_editor.cpp
index 835f953603..221061f9f7 100644
--- a/editor/gui/scene_tree_editor.cpp
+++ b/editor/gui/scene_tree_editor.cpp
@@ -897,6 +897,14 @@ void SceneTreeEditor::_cell_multi_selected(Object *p_object, int p_cell, bool p_
}
}
+void SceneTreeEditor::_tree_scroll_to_item(ObjectID p_item_id) {
+ ERR_FAIL_NULL(tree);
+ TreeItem *item = Object::cast_to<TreeItem>(ObjectDB::get_instance(p_item_id));
+ if (item) {
+ tree->scroll_to_item(item, true);
+ }
+}
+
void SceneTreeEditor::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
@@ -925,6 +933,28 @@ void SceneTreeEditor::_notification(int p_what) {
_update_tree();
} break;
+
+ case NOTIFICATION_VISIBILITY_CHANGED: {
+ if (is_visible()) {
+ TreeItem *item = nullptr;
+ if (selected) {
+ // Scroll to selected node.
+ item = _find(tree->get_root(), selected->get_path());
+ } else if (marked.size() == 1) {
+ // Scroll to a single marked node.
+ Node *marked_node = *marked.begin();
+ if (marked_node) {
+ item = _find(tree->get_root(), marked_node->get_path());
+ }
+ }
+
+ if (item) {
+ // Must wait until tree is properly sized before scrolling.
+ ObjectID item_id = item->get_instance_id();
+ callable_mp(this, &SceneTreeEditor::_tree_scroll_to_item).call_deferred(item_id);
+ }
+ }
+ } break;
}
}
@@ -1567,7 +1597,9 @@ SceneTreeEditor::~SceneTreeEditor() {
/******** DIALOG *********/
-void SceneTreeDialog::popup_scenetree_dialog() {
+void SceneTreeDialog::popup_scenetree_dialog(Node *p_selected_node, Node *p_marked_node, bool p_marked_node_selectable, bool p_marked_node_children_selectable) {
+ get_scene_tree()->set_marked(p_marked_node, p_marked_node_selectable, p_marked_node_children_selectable);
+ get_scene_tree()->set_selected(p_selected_node);
popup_centered_clamped(Size2(350, 700) * EDSCALE);
}