From 6611d24e74faaf19cdc74e8dcad839e997ba9e73 Mon Sep 17 00:00:00 2001 From: kobewi Date: Wed, 18 Aug 2021 13:27:33 +0200 Subject: [PATCH] Include locked nodes on selection list --- editor/plugins/canvas_item_editor_plugin.cpp | 44 +++++++++++---- editor/plugins/canvas_item_editor_plugin.h | 2 +- editor/plugins/spatial_editor_plugin.cpp | 57 +++++++++++++++----- editor/plugins/spatial_editor_plugin.h | 2 +- 4 files changed, 80 insertions(+), 25 deletions(-) diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 93441b47636..5946a568195 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -612,7 +612,7 @@ void CanvasItemEditor::_find_canvas_items_at_pos(const Point2 &p_pos, Node *p_no } } -void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items) { +void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items, bool p_allow_locked) { Node *scene = editor->get_edited_scene(); _find_canvas_items_at_pos(p_pos, scene, r_items); @@ -626,14 +626,16 @@ void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_Sel node = scene->get_deepest_editable_node(node); } - // Replace the node by the group if grouped CanvasItem *canvas_item = Object::cast_to(node); - while (node && node != scene->get_parent()) { - CanvasItem *canvas_item_tmp = Object::cast_to(node); - if (canvas_item_tmp && node->has_meta("_edit_group_")) { - canvas_item = canvas_item_tmp; + if (!p_allow_locked) { + // Replace the node by the group if grouped. + while (node && node != scene->get_parent()) { + CanvasItem *canvas_item_tmp = Object::cast_to(node); + if (canvas_item_tmp && node->has_meta("_edit_group_")) { + canvas_item = canvas_item_tmp; + } + node = node->get_parent(); } - node = node->get_parent(); } // Check if the canvas item is already in the list (for groups or scenes) @@ -646,7 +648,7 @@ void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_Sel } //Remove the item if invalid - if (!canvas_item || duplicate || (canvas_item != scene && canvas_item->get_owner() != scene && !scene->is_editable_instance(canvas_item->get_owner())) || _is_node_locked(canvas_item)) { + if (!canvas_item || duplicate || (canvas_item != scene && canvas_item->get_owner() != scene && !scene->is_editable_instance(canvas_item->get_owner())) || (!p_allow_locked && _is_node_locked(canvas_item))) { r_items.remove(i); i--; } else { @@ -2416,7 +2418,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref &p_event) { // Popup the selection menu list Point2 click = transform.affine_inverse().xform(b->get_position()); - _get_canvas_items_at_pos(click, selection_results); + _get_canvas_items_at_pos(click, selection_results, b->get_alt() && tool != TOOL_LIST_SELECT); if (selection_results.size() == 1) { CanvasItem *item = selection_results[0].item; @@ -2438,7 +2440,29 @@ bool CanvasItemEditor::_gui_input_select(const Ref &p_event) { Ref icon = EditorNode::get_singleton()->get_object_icon(item, "Node"); String node_path = "/" + root_name + "/" + root_path.rel_path_to(item->get_path()); - selection_menu->add_item(item->get_name()); + int locked = 0; + if (_is_node_locked(item)) { + locked = 1; + } else { + Node *scene = editor->get_edited_scene(); + Node *node = item; + + while (node && node != scene->get_parent()) { + CanvasItem *canvas_item_tmp = Object::cast_to(node); + if (canvas_item_tmp && node->has_meta("_edit_group_")) { + locked = 2; + } + node = node->get_parent(); + } + } + + String suffix = String(); + if (locked == 1) { + suffix = " (" + TTR("Locked") + ")"; + } else if (locked == 2) { + suffix = " (" + TTR("Grouped") + ")"; + } + selection_menu->add_item((String)item->get_name() + suffix); selection_menu->set_item_icon(i, icon); selection_menu->set_item_metadata(i, node_path); selection_menu->set_item_tooltip(i, String(item->get_name()) + "\nType: " + item->get_class() + "\nPath: " + node_path); diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index 32ebe1cad9d..c16e6545418 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -423,7 +423,7 @@ private: bool _is_node_locked(const Node *p_node); bool _is_node_movable(const Node *p_node, bool p_popup_warning = false); void _find_canvas_items_at_pos(const Point2 &p_pos, Node *p_node, Vector<_SelectResult> &r_items, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D()); - void _get_canvas_items_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items); + void _get_canvas_items_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items, bool p_allow_locked = false); void _get_bones_at_pos(const Point2 &p_pos, Vector<_SelectResult> &r_items); void _find_canvas_items_in_rect(const Rect2 &p_rect, Node *p_node, List *r_items, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D()); diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index c2bcdaa96d5..68ca1111254 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -428,7 +428,7 @@ void SpatialEditorViewport::_clear_selected() { editor_selection->clear(); } -void SpatialEditorViewport::_select_clicked(bool p_append, bool p_single) { +void SpatialEditorViewport::_select_clicked(bool p_append, bool p_single, bool p_allow_locked) { if (!clicked) { return; } @@ -439,16 +439,18 @@ void SpatialEditorViewport::_select_clicked(bool p_append, bool p_single) { return; } - // Replace the node by the group if grouped - while (node && node != editor->get_edited_scene()->get_parent()) { - Spatial *selected_tmp = Object::cast_to(node); - if (selected_tmp && node->has_meta("_edit_group_")) { - selected = selected_tmp; + if (!p_allow_locked) { + // Replace the node by the group if grouped. + while (node && node != editor->get_edited_scene()->get_parent()) { + Spatial *selected_tmp = Object::cast_to(node); + if (selected_tmp && node->has_meta("_edit_group_")) { + selected = selected_tmp; + } + node = node->get_parent(); } - node = node->get_parent(); } - if (!_is_node_locked(selected)) { + if (p_allow_locked || !_is_node_locked(selected)) { _select(selected, clicked_wants_append, true); } } @@ -1082,12 +1084,13 @@ void SpatialEditorViewport::_list_select(Ref b) { clicked_wants_append = b->get_shift(); + bool allow_locked = b->get_alt() && spatial_editor->get_tool_mode() != SpatialEditor::TOOL_MODE_LIST_SELECT; if (selection_results.size() == 1) { clicked = selection_results[0].item->get_instance_id(); selection_results.clear(); if (clicked) { - _select_clicked(clicked_wants_append, true); + _select_clicked(clicked_wants_append, true, allow_locked); clicked = 0; } @@ -1102,14 +1105,42 @@ void SpatialEditorViewport::_list_select(Ref b) { String node_path = "/" + root_name + "/" + root_path.rel_path_to(spat->get_path()); - selection_menu->add_item(spat->get_name()); + int locked = 0; + if (_is_node_locked(spat)) { + locked = 1; + } else { + Node *ed_scene = editor->get_edited_scene(); + Node *node = spat; + + while (node && node != ed_scene->get_parent()) { + Spatial *selected_tmp = Object::cast_to(node); + if (selected_tmp && node->has_meta("_edit_group_")) { + locked = 2; + } + node = node->get_parent(); + } + } + + if (!allow_locked && locked > 0) { + continue; + } + + String suffix = String(); + if (locked == 1) { + suffix = " (" + TTR("Locked") + ")"; + } else if (locked == 2) { + suffix = " (" + TTR("Grouped") + ")"; + } + selection_menu->add_item((String)spat->get_name() + suffix); selection_menu->set_item_icon(i, icon); selection_menu->set_item_metadata(i, node_path); selection_menu->set_item_tooltip(i, String(spat->get_name()) + "\nType: " + spat->get_class() + "\nPath: " + node_path); } - selection_menu->set_global_position(b->get_global_position()); - selection_menu->popup(); + if (selection_menu->get_item_count() > 0) { + selection_menu->set_global_position(b->get_global_position()); + selection_menu->popup(); + } } } @@ -3198,7 +3229,7 @@ void SpatialEditorViewport::_selection_result_pressed(int p_result) { clicked = selection_results[p_result].item->get_instance_id(); if (clicked) { - _select_clicked(clicked_wants_append, true); + _select_clicked(clicked_wants_append, true, spatial_editor->get_tool_mode() != SpatialEditor::TOOL_MODE_LIST_SELECT); clicked = 0; } } diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h index d5bcdc7e54d..76e6855c1ce 100644 --- a/editor/plugins/spatial_editor_plugin.h +++ b/editor/plugins/spatial_editor_plugin.h @@ -296,7 +296,7 @@ private: void _update_name(); void _compute_edit(const Point2 &p_point); void _clear_selected(); - void _select_clicked(bool p_append, bool p_single); + void _select_clicked(bool p_append, bool p_single, bool p_allow_locked = false); void _select(Node *p_node, bool p_append, bool p_single); ObjectID _select_ray(const Point2 &p_pos, bool p_append, bool &r_includes_current, int *r_gizmo_handle = nullptr, bool p_alt_select = false); void _find_items_at_pos(const Point2 &p_pos, bool &r_includes_current, Vector<_RayResult> &results, bool p_alt_select = false);