From 0700b807a22fbb93f3534d59fe47f02bcf00b7b5 Mon Sep 17 00:00:00 2001 From: Aaron Franke Date: Sun, 17 Dec 2023 11:26:41 -0600 Subject: [PATCH] Allow node visibility to work with custom user-provided node types --- editor/gui/scene_tree_editor.cpp | 87 ++++++++++---------------------- 1 file changed, 26 insertions(+), 61 deletions(-) diff --git a/editor/gui/scene_tree_editor.cpp b/editor/gui/scene_tree_editor.cpp index c74d9fc3d457..248678662ca8 100644 --- a/editor/gui/scene_tree_editor.cpp +++ b/editor/gui/scene_tree_editor.cpp @@ -103,15 +103,12 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i undo_redo->commit_action(); } else if (p_id == BUTTON_LOCK) { undo_redo->create_action(TTR("Unlock Node")); - - if (n->is_class("CanvasItem") || n->is_class("Node3D")) { - undo_redo->add_do_method(n, "remove_meta", "_edit_lock_"); - undo_redo->add_undo_method(n, "set_meta", "_edit_lock_", true); - undo_redo->add_do_method(this, "_update_tree"); - undo_redo->add_undo_method(this, "_update_tree"); - undo_redo->add_do_method(this, "emit_signal", "node_changed"); - undo_redo->add_undo_method(this, "emit_signal", "node_changed"); - } + undo_redo->add_do_method(n, "remove_meta", "_edit_lock_"); + undo_redo->add_undo_method(n, "set_meta", "_edit_lock_", true); + undo_redo->add_do_method(this, "_update_tree"); + undo_redo->add_undo_method(this, "_update_tree"); + undo_redo->add_do_method(this, "emit_signal", "node_changed"); + undo_redo->add_undo_method(this, "emit_signal", "node_changed"); undo_redo->commit_action(); } else if (p_id == BUTTON_PIN) { if (n->is_class("AnimationMixer")) { @@ -400,60 +397,28 @@ void SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) { item->set_button_color(0, item->get_button_count(0) - 1, button_color); } - if (p_node->is_class("CanvasItem")) { - if (p_node->has_meta("_edit_lock_")) { - item->add_button(0, get_editor_theme_icon(SNAME("Lock")), BUTTON_LOCK, false, TTR("Node is locked.\nClick to unlock it.")); - } - - if (p_node->has_meta("_edit_group_")) { - item->add_button(0, get_editor_theme_icon(SNAME("Group")), BUTTON_GROUP, false, TTR("Children are not selectable.\nClick to make them selectable.")); - } - - bool v = p_node->call("is_visible"); - if (v) { + if (p_node->has_method("is_visible") && p_node->has_method("set_visible") && p_node->has_signal("visibility_changed")) { + bool is_visible = p_node->call("is_visible"); + if (is_visible) { item->add_button(0, get_editor_theme_icon(SNAME("GuiVisibilityVisible")), BUTTON_VISIBILITY, false, TTR("Toggle Visibility")); } else { item->add_button(0, get_editor_theme_icon(SNAME("GuiVisibilityHidden")), BUTTON_VISIBILITY, false, TTR("Toggle Visibility")); } - - if (!p_node->is_connected("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed))) { - p_node->connect("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed).bind(p_node)); + const Callable vis_changed = callable_mp(this, &SceneTreeEditor::_node_visibility_changed); + if (!p_node->is_connected("visibility_changed", vis_changed)) { + p_node->connect("visibility_changed", vis_changed.bind(p_node)); } - _update_visibility_color(p_node, item); - } else if (p_node->is_class("CanvasLayer") || p_node->is_class("Window")) { - bool v = p_node->call("is_visible"); - if (v) { - item->add_button(0, get_editor_theme_icon(SNAME("GuiVisibilityVisible")), BUTTON_VISIBILITY, false, TTR("Toggle Visibility")); - } else { - item->add_button(0, get_editor_theme_icon(SNAME("GuiVisibilityHidden")), BUTTON_VISIBILITY, false, TTR("Toggle Visibility")); - } - - if (!p_node->is_connected("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed))) { - p_node->connect("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed).bind(p_node)); - } - } else if (p_node->is_class("Node3D")) { - if (p_node->has_meta("_edit_lock_")) { - item->add_button(0, get_editor_theme_icon(SNAME("Lock")), BUTTON_LOCK, false, TTR("Node is locked.\nClick to unlock it.")); - } - - if (p_node->has_meta("_edit_group_")) { - item->add_button(0, get_editor_theme_icon(SNAME("Group")), BUTTON_GROUP, false, TTR("Children are not selectable.\nClick to make them selectable.")); - } - - bool v = p_node->call("is_visible"); - if (v) { - item->add_button(0, get_editor_theme_icon(SNAME("GuiVisibilityVisible")), BUTTON_VISIBILITY, false, TTR("Toggle Visibility")); - } else { - item->add_button(0, get_editor_theme_icon(SNAME("GuiVisibilityHidden")), BUTTON_VISIBILITY, false, TTR("Toggle Visibility")); - } + } - if (!p_node->is_connected("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed))) { - p_node->connect("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed).bind(p_node)); - } + if (p_node->has_meta("_edit_lock_")) { + item->add_button(0, get_editor_theme_icon(SNAME("Lock")), BUTTON_LOCK, false, TTR("Node is locked.\nClick to unlock it.")); + } + if (p_node->has_meta("_edit_group_")) { + item->add_button(0, get_editor_theme_icon(SNAME("Group")), BUTTON_GROUP, false, TTR("Children are not selectable.\nClick to make them selectable.")); + } - _update_visibility_color(p_node, item); - } else if (p_node->is_class("AnimationMixer")) { + if (p_node->is_class("AnimationMixer")) { bool is_pinned = AnimationPlayerEditor::get_singleton()->get_editing_node() == p_node && AnimationPlayerEditor::get_singleton()->is_pinned(); if (is_pinned) { @@ -564,11 +529,11 @@ void SceneTreeEditor::_node_visibility_changed(Node *p_node) { bool node_visible = false; - if (p_node->is_class("CanvasItem") || p_node->is_class("CanvasLayer") || p_node->is_class("Window")) { - node_visible = p_node->call("is_visible"); - CanvasItemEditor::get_singleton()->get_viewport_control()->queue_redraw(); - } else if (p_node->is_class("Node3D")) { + if (p_node->has_method("is_visible")) { node_visible = p_node->call("is_visible"); + if (p_node->is_class("CanvasItem") || p_node->is_class("CanvasLayer") || p_node->is_class("Window")) { + CanvasItemEditor::get_singleton()->get_viewport_control()->queue_redraw(); + } } if (node_visible) { @@ -581,7 +546,7 @@ void SceneTreeEditor::_node_visibility_changed(Node *p_node) { } void SceneTreeEditor::_update_visibility_color(Node *p_node, TreeItem *p_item) { - if (p_node->is_class("CanvasItem") || p_node->is_class("Node3D")) { + if (p_node->has_method("is_visible_in_tree")) { Color color(1, 1, 1, 1); bool visible_on_screen = p_node->call("is_visible_in_tree"); if (!visible_on_screen) { @@ -615,7 +580,7 @@ void SceneTreeEditor::_node_removed(Node *p_node) { p_node->disconnect("script_changed", callable_mp(this, &SceneTreeEditor::_node_script_changed)); } - if (p_node->is_class("Node3D") || p_node->is_class("CanvasItem") || p_node->is_class("CanvasLayer") || p_node->is_class("Window")) { + if (p_node->has_signal("visibility_changed")) { if (p_node->is_connected("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed))) { p_node->disconnect("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed)); }