mirror of
				https://github.com/godotengine/godot.git
				synced 2025-11-03 23:21:15 +00:00 
			
		
		
		
	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,14 +626,16 @@ 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);
 | 
				
			||||||
		while (node && node != scene->get_parent()) {
 | 
							if (!p_allow_locked) {
 | 
				
			||||||
			CanvasItem *canvas_item_tmp = Object::cast_to<CanvasItem>(node);
 | 
								// Replace the node by the group if grouped.
 | 
				
			||||||
			if (canvas_item_tmp && node->has_meta("_edit_group_")) {
 | 
								while (node && node != scene->get_parent()) {
 | 
				
			||||||
				canvas_item = canvas_item_tmp;
 | 
									CanvasItem *canvas_item_tmp = Object::cast_to<CanvasItem>(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)
 | 
							// 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
 | 
							//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,16 +439,18 @@ void SpatialEditorViewport::_select_clicked(bool p_append, bool p_single) {
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Replace the node by the group if grouped
 | 
						if (!p_allow_locked) {
 | 
				
			||||||
	while (node && node != editor->get_edited_scene()->get_parent()) {
 | 
							// Replace the node by the group if grouped.
 | 
				
			||||||
		Spatial *selected_tmp = Object::cast_to<Spatial>(node);
 | 
							while (node && node != editor->get_edited_scene()->get_parent()) {
 | 
				
			||||||
		if (selected_tmp && node->has_meta("_edit_group_")) {
 | 
								Spatial *selected_tmp = Object::cast_to<Spatial>(node);
 | 
				
			||||||
			selected = selected_tmp;
 | 
								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);
 | 
							_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,14 +1105,42 @@ 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);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		selection_menu->set_global_position(b->get_global_position());
 | 
							if (selection_menu->get_item_count() > 0) {
 | 
				
			||||||
		selection_menu->popup();
 | 
								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();
 | 
						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…
	
	Add table
		Add a link
		
	
		Reference in a new issue