From 7608e3ccb09b726e77121f5cabedd0935085027d Mon Sep 17 00:00:00 2001 From: Jayden Sipe Date: Thu, 12 Mar 2026 03:46:47 -0400 Subject: [PATCH] Support folding, groups and subgroups in `Remote Scene Inspector` --- editor/debugger/editor_debugger_tree.cpp | 15 +++++++++++++++ editor/debugger/editor_debugger_tree.h | 3 ++- editor/editor_node.cpp | 2 +- scene/debugger/scene_debugger_object.cpp | 2 +- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/editor/debugger/editor_debugger_tree.cpp b/editor/debugger/editor_debugger_tree.cpp index 141880d03ba..c80d6eb1661 100644 --- a/editor/debugger/editor_debugger_tree.cpp +++ b/editor/debugger/editor_debugger_tree.cpp @@ -34,6 +34,7 @@ #include "core/object/callable_mp.h" #include "core/object/class_db.h" #include "editor/debugger/editor_debugger_node.h" +#include "editor/docks/inspector_dock.h" #include "editor/docks/scene_tree_dock.h" #include "editor/editor_node.h" #include "editor/editor_string_names.h" @@ -419,6 +420,15 @@ void EditorDebuggerTree::select_nodes(const TypedArray &p_ids) { inspected_object_ids = p_ids; scrolling_to_item = true; + // If we have not previously selected any of these items, expand the inspector's properties for this item. + for (ObjectID id : p_ids) { + if (!selection_cache.has(id)) { + selection_cache.insert(id); + + InspectorDock::get_inspector_singleton()->expand_all_folding(); + } + } + if (!updating_scene_tree) { // Request a tree refresh. EditorDebuggerNode::get_singleton()->request_remote_tree(); @@ -474,6 +484,11 @@ Variant EditorDebuggerTree::get_drag_data(const Point2 &p_point) { return vformat("\"%s\"", path); } +void EditorDebuggerTree::set_new_session() { + new_session = true; + selection_cache.clear(); +} + void EditorDebuggerTree::update_icon_max_width() { add_theme_constant_override("icon_max_width", get_theme_constant("class_icon_size", EditorStringName(Editor))); } diff --git a/editor/debugger/editor_debugger_tree.h b/editor/debugger/editor_debugger_tree.h index 27327dbe96a..24277c2d4a4 100644 --- a/editor/debugger/editor_debugger_tree.h +++ b/editor/debugger/editor_debugger_tree.h @@ -67,6 +67,7 @@ private: bool selection_surpassed_limit = false; bool selection_uncollapse_all = false; HashSet unfold_cache; + HashSet selection_cache; PopupMenu *item_menu = nullptr; EditorFileDialog *file_dialog = nullptr; AcceptDialog *accept = nullptr; @@ -93,7 +94,7 @@ public: virtual Variant get_drag_data(const Point2 &p_point) override; - void set_new_session() { new_session = true; } + void set_new_session(); void update_icon_max_width(); String get_selected_path(); ObjectID get_selected_object(); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 739e12862b5..030e367fe34 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -3125,7 +3125,7 @@ void EditorNode::_edit_current(bool p_skip_foreign, bool p_skip_inspector_update } // Update the use folding setting and state. - bool disable_folding = bool(EDITOR_GET("interface/inspector/disable_folding")) || current_obj->is_class("EditorDebuggerRemoteObjects"); + bool disable_folding = EDITOR_GET("interface/inspector/disable_folding"); if (InspectorDock::get_inspector_singleton()->is_using_folding() == disable_folding) { InspectorDock::get_inspector_singleton()->set_use_folding(!disable_folding, false); } diff --git a/scene/debugger/scene_debugger_object.cpp b/scene/debugger/scene_debugger_object.cpp index 59cb8c178ad..ee1535f4a14 100644 --- a/scene/debugger/scene_debugger_object.cpp +++ b/scene/debugger/scene_debugger_object.cpp @@ -82,7 +82,7 @@ SceneDebuggerObject::SceneDebuggerObject(Object *p_obj) { E.hint_string = _parse_type_from_remote_object(m); } - if (E.usage & (PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CATEGORY)) { + if (E.usage & (PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_GROUP | PROPERTY_USAGE_SUBGROUP | PROPERTY_USAGE_CATEGORY)) { properties.push_back(SceneDebuggerProperty(E, m)); } }