Include locked nodes on selection list
This commit is contained in:
parent
ddfaf20f62
commit
6611d24e74
4 changed files with 80 additions and 25 deletions
|
@ -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();
|
Node *scene = editor->get_edited_scene();
|
||||||
|
|
||||||
_find_canvas_items_at_pos(p_pos, scene, r_items);
|
_find_canvas_items_at_pos(p_pos, scene, r_items);
|
||||||
|
@ -626,8 +626,9 @@ void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_Sel
|
||||||
node = scene->get_deepest_editable_node(node);
|
node = scene->get_deepest_editable_node(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Replace the node by the group if grouped
|
|
||||||
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(node);
|
CanvasItem *canvas_item = Object::cast_to<CanvasItem>(node);
|
||||||
|
if (!p_allow_locked) {
|
||||||
|
// Replace the node by the group if grouped.
|
||||||
while (node && node != scene->get_parent()) {
|
while (node && node != scene->get_parent()) {
|
||||||
CanvasItem *canvas_item_tmp = Object::cast_to<CanvasItem>(node);
|
CanvasItem *canvas_item_tmp = Object::cast_to<CanvasItem>(node);
|
||||||
if (canvas_item_tmp && node->has_meta("_edit_group_")) {
|
if (canvas_item_tmp && node->has_meta("_edit_group_")) {
|
||||||
|
@ -635,6 +636,7 @@ void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_Sel
|
||||||
}
|
}
|
||||||
node = node->get_parent();
|
node = node->get_parent();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Check if the canvas item is already in the list (for groups or scenes)
|
// Check if the canvas item is already in the list (for groups or scenes)
|
||||||
bool duplicate = false;
|
bool duplicate = false;
|
||||||
|
@ -646,7 +648,7 @@ void CanvasItemEditor::_get_canvas_items_at_pos(const Point2 &p_pos, Vector<_Sel
|
||||||
}
|
}
|
||||||
|
|
||||||
//Remove the item if invalid
|
//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);
|
r_items.remove(i);
|
||||||
i--;
|
i--;
|
||||||
} else {
|
} else {
|
||||||
|
@ -2416,7 +2418,7 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
|
||||||
// Popup the selection menu list
|
// Popup the selection menu list
|
||||||
Point2 click = transform.affine_inverse().xform(b->get_position());
|
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) {
|
if (selection_results.size() == 1) {
|
||||||
CanvasItem *item = selection_results[0].item;
|
CanvasItem *item = selection_results[0].item;
|
||||||
|
@ -2438,7 +2440,29 @@ bool CanvasItemEditor::_gui_input_select(const Ref<InputEvent> &p_event) {
|
||||||
Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(item, "Node");
|
Ref<Texture> icon = EditorNode::get_singleton()->get_object_icon(item, "Node");
|
||||||
String node_path = "/" + root_name + "/" + root_path.rel_path_to(item->get_path());
|
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<CanvasItem>(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_icon(i, icon);
|
||||||
selection_menu->set_item_metadata(i, node_path);
|
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);
|
selection_menu->set_item_tooltip(i, String(item->get_name()) + "\nType: " + item->get_class() + "\nPath: " + node_path);
|
||||||
|
|
|
@ -423,7 +423,7 @@ private:
|
||||||
bool _is_node_locked(const Node *p_node);
|
bool _is_node_locked(const Node *p_node);
|
||||||
bool _is_node_movable(const Node *p_node, bool p_popup_warning = false);
|
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 _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 _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<CanvasItem *> *r_items, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D());
|
void _find_canvas_items_in_rect(const Rect2 &p_rect, Node *p_node, List<CanvasItem *> *r_items, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D());
|
||||||
|
|
|
@ -428,7 +428,7 @@ void SpatialEditorViewport::_clear_selected() {
|
||||||
editor_selection->clear();
|
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) {
|
if (!clicked) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -439,7 +439,8 @@ void SpatialEditorViewport::_select_clicked(bool p_append, bool p_single) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Replace the node by the group if grouped
|
if (!p_allow_locked) {
|
||||||
|
// Replace the node by the group if grouped.
|
||||||
while (node && node != editor->get_edited_scene()->get_parent()) {
|
while (node && node != editor->get_edited_scene()->get_parent()) {
|
||||||
Spatial *selected_tmp = Object::cast_to<Spatial>(node);
|
Spatial *selected_tmp = Object::cast_to<Spatial>(node);
|
||||||
if (selected_tmp && node->has_meta("_edit_group_")) {
|
if (selected_tmp && node->has_meta("_edit_group_")) {
|
||||||
|
@ -447,8 +448,9 @@ void SpatialEditorViewport::_select_clicked(bool p_append, bool p_single) {
|
||||||
}
|
}
|
||||||
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);
|
_select(selected, clicked_wants_append, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1082,12 +1084,13 @@ void SpatialEditorViewport::_list_select(Ref<InputEventMouseButton> b) {
|
||||||
|
|
||||||
clicked_wants_append = b->get_shift();
|
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) {
|
if (selection_results.size() == 1) {
|
||||||
clicked = selection_results[0].item->get_instance_id();
|
clicked = selection_results[0].item->get_instance_id();
|
||||||
selection_results.clear();
|
selection_results.clear();
|
||||||
|
|
||||||
if (clicked) {
|
if (clicked) {
|
||||||
_select_clicked(clicked_wants_append, true);
|
_select_clicked(clicked_wants_append, true, allow_locked);
|
||||||
clicked = 0;
|
clicked = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1102,16 +1105,44 @@ void SpatialEditorViewport::_list_select(Ref<InputEventMouseButton> b) {
|
||||||
|
|
||||||
String node_path = "/" + root_name + "/" + root_path.rel_path_to(spat->get_path());
|
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<Spatial>(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_icon(i, icon);
|
||||||
selection_menu->set_item_metadata(i, node_path);
|
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_item_tooltip(i, String(spat->get_name()) + "\nType: " + spat->get_class() + "\nPath: " + node_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (selection_menu->get_item_count() > 0) {
|
||||||
selection_menu->set_global_position(b->get_global_position());
|
selection_menu->set_global_position(b->get_global_position());
|
||||||
selection_menu->popup();
|
selection_menu->popup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
|
void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) {
|
||||||
if (previewing) {
|
if (previewing) {
|
||||||
|
@ -3198,7 +3229,7 @@ void SpatialEditorViewport::_selection_result_pressed(int p_result) {
|
||||||
clicked = selection_results[p_result].item->get_instance_id();
|
clicked = selection_results[p_result].item->get_instance_id();
|
||||||
|
|
||||||
if (clicked) {
|
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;
|
clicked = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -296,7 +296,7 @@ private:
|
||||||
void _update_name();
|
void _update_name();
|
||||||
void _compute_edit(const Point2 &p_point);
|
void _compute_edit(const Point2 &p_point);
|
||||||
void _clear_selected();
|
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);
|
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);
|
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);
|
void _find_items_at_pos(const Point2 &p_pos, bool &r_includes_current, Vector<_RayResult> &results, bool p_alt_select = false);
|
||||||
|
|
Loading…
Reference in a new issue