| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  scene_tree_editor.h                                                  */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2021-01-01 20:13:46 +01:00
										 |  |  | /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md).   */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #ifndef SCENE_TREE_EDITOR_H
 | 
					
						
							|  |  |  | #define SCENE_TREE_EDITOR_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-07 19:33:38 -03:00
										 |  |  | #include "core/object/undo_redo.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | #include "editor_data.h"
 | 
					
						
							|  |  |  | #include "editor_settings.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #include "scene/gui/button.h"
 | 
					
						
							|  |  |  | #include "scene/gui/dialogs.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | #include "scene/gui/tree.h"
 | 
					
						
							| 
									
										
										
										
											2019-08-10 07:28:17 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | class SceneTreeEditor : public Control { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	GDCLASS(SceneTreeEditor, Control); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	EditorSelection *editor_selection; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-25 16:40:58 +02:00
										 |  |  | 	enum SceneTreeEditorButton { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		BUTTON_SUBSCENE = 0, | 
					
						
							|  |  |  | 		BUTTON_VISIBILITY = 1, | 
					
						
							|  |  |  | 		BUTTON_SCRIPT = 2, | 
					
						
							|  |  |  | 		BUTTON_LOCK = 3, | 
					
						
							|  |  |  | 		BUTTON_GROUP = 4, | 
					
						
							|  |  |  | 		BUTTON_WARNING = 5, | 
					
						
							|  |  |  | 		BUTTON_SIGNALS = 6, | 
					
						
							|  |  |  | 		BUTTON_GROUPS = 7, | 
					
						
							| 
									
										
										
										
											2018-06-07 12:46:14 -03:00
										 |  |  | 		BUTTON_PIN = 8, | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Tree *tree; | 
					
						
							|  |  |  | 	Node *selected; | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 	ObjectID instance_node; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-16 12:23:40 -03:00
										 |  |  | 	String filter; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | 	AcceptDialog *error; | 
					
						
							| 
									
										
										
										
											2016-05-17 18:27:15 -03:00
										 |  |  | 	AcceptDialog *warning; | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-11 23:21:48 -03:00
										 |  |  | 	bool connect_to_script_mode; | 
					
						
							| 
									
										
										
										
											2019-06-05 23:13:57 -03:00
										 |  |  | 	bool connecting_signal; | 
					
						
							| 
									
										
										
										
											2019-04-11 23:21:48 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	int blocked; | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void _compute_hash(Node *p_node, uint64_t &hash); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-08 01:19:46 +01:00
										 |  |  | 	bool _add_nodes(Node *p_node, TreeItem *p_parent, bool p_scroll_to_selected = false); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void _test_update_tree(); | 
					
						
							| 
									
										
										
										
											2021-02-08 01:19:46 +01:00
										 |  |  | 	void _update_tree(bool p_scroll_to_selected = false); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void _tree_changed(); | 
					
						
							| 
									
										
										
										
											2021-02-18 15:52:29 -03:00
										 |  |  | 	void _tree_process_mode_changed(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void _node_removed(Node *p_node); | 
					
						
							| 
									
										
										
										
											2019-05-24 15:27:22 +02:00
										 |  |  | 	void _node_renamed(Node *p_node); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	TreeItem *_find(TreeItem *p_node, const NodePath &p_path); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void _notification(int p_what); | 
					
						
							|  |  |  | 	void _selected_changed(); | 
					
						
							| 
									
										
										
										
											2017-11-26 14:49:21 +03:00
										 |  |  | 	void _deselect_items(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void _rename_node(ObjectID p_node, const String &p_name); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	void _cell_collapsed(Object *p_obj); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	uint64_t last_hash; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bool can_rename; | 
					
						
							|  |  |  | 	bool can_open_instance; | 
					
						
							|  |  |  | 	bool updating_tree; | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 	bool show_enabled_subscene; | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void _renamed(); | 
					
						
							|  |  |  | 	UndoRedo *undo_redo; | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Set<Node *> marked; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	bool marked_selectable; | 
					
						
							|  |  |  | 	bool marked_children_selectable; | 
					
						
							|  |  |  | 	bool display_foreign; | 
					
						
							|  |  |  | 	bool tree_dirty; | 
					
						
							|  |  |  | 	bool pending_test_update; | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 	static void _bind_methods(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void _cell_button_pressed(Object *p_item, int p_column, int p_id); | 
					
						
							| 
									
										
										
										
											2018-01-01 16:05:00 +08:00
										 |  |  | 	void _toggle_visible(Node *p_node); | 
					
						
							| 
									
										
										
										
											2017-08-12 12:52:50 -04:00
										 |  |  | 	void _cell_multi_selected(Object *p_object, int p_cell, bool p_selected); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void _update_selection(TreeItem *item); | 
					
						
							|  |  |  | 	void _node_script_changed(Node *p_node); | 
					
						
							|  |  |  | 	void _node_visibility_changed(Node *p_node); | 
					
						
							| 
									
										
										
										
											2016-12-28 22:12:08 +09:00
										 |  |  | 	void _update_visibility_color(Node *p_node, TreeItem *p_item); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void _node_replace_owner(Node *p_base, Node *p_node, Node *p_root); | 
					
						
							| 
									
										
										
										
											2016-05-15 23:41:48 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void _selection_changed(); | 
					
						
							|  |  |  | 	Node *get_scene_node(); | 
					
						
							| 
									
										
										
										
											2016-05-11 11:46:08 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Variant get_drag_data_fw(const Point2 &p_point, Control *p_from); | 
					
						
							|  |  |  | 	bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; | 
					
						
							|  |  |  | 	void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); | 
					
						
							| 
									
										
										
										
											2016-05-11 11:46:08 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void _rmb_select(const Vector2 &p_pos); | 
					
						
							| 
									
										
										
										
											2016-05-15 23:41:48 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void _warning_changed(Node *p_for_node); | 
					
						
							| 
									
										
										
										
											2016-05-17 18:27:15 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Timer *update_timer; | 
					
						
							| 
									
										
										
										
											2016-05-17 18:27:15 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-27 16:32:41 +02:00
										 |  |  | 	List<StringName> *script_types; | 
					
						
							|  |  |  | 	bool _is_script_type(const StringName &p_type) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-27 20:50:25 -03:00
										 |  |  | 	Vector<StringName> valid_types; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void set_filter(const String &p_filter); | 
					
						
							| 
									
										
										
										
											2016-05-16 12:23:40 -03:00
										 |  |  | 	String get_filter() const; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void set_undo_redo(UndoRedo *p_undo_redo) { undo_redo = p_undo_redo; }; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void set_display_foreign_nodes(bool p_display); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void set_marked(const Set<Node *> &p_marked, bool p_selectable = false, bool p_children_selectable = true); | 
					
						
							|  |  |  | 	void set_marked(Node *p_marked, bool p_selectable = false, bool p_children_selectable = true); | 
					
						
							|  |  |  | 	void set_selected(Node *p_node, bool p_emit_selected = true); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	Node *get_selected(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void set_can_rename(bool p_can_rename) { can_rename = p_can_rename; } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	void set_editor_selection(EditorSelection *p_selection); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void set_show_enabled_subscene(bool p_show) { show_enabled_subscene = p_show; } | 
					
						
							| 
									
										
										
										
											2018-06-27 20:50:25 -03:00
										 |  |  | 	void set_valid_types(const Vector<StringName> &p_valid); | 
					
						
							| 
									
										
										
										
											2014-09-02 23:13:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-19 16:46:52 -03:00
										 |  |  | 	void update_tree() { _update_tree(); } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-11 23:21:48 -03:00
										 |  |  | 	void set_connect_to_script_mode(bool p_enable); | 
					
						
							| 
									
										
										
										
											2019-06-05 23:13:57 -03:00
										 |  |  | 	void set_connecting_signal(bool p_enable); | 
					
						
							| 
									
										
										
										
											2019-04-11 23:21:48 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Tree *get_scene_tree() { return tree; } | 
					
						
							| 
									
										
										
										
											2015-06-22 00:03:19 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-27 12:43:49 -03:00
										 |  |  | 	void update_warning(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	SceneTreeEditor(bool p_label = true, bool p_can_rename = false, bool p_can_open_instance = false); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	~SceneTreeEditor(); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SceneTreeDialog : public ConfirmationDialog { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	GDCLASS(SceneTreeDialog, ConfirmationDialog); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SceneTreeEditor *tree; | 
					
						
							| 
									
										
										
										
											2017-01-14 12:26:56 +01:00
										 |  |  | 	//Button *select;
 | 
					
						
							|  |  |  | 	//Button *cancel;
 | 
					
						
							| 
									
										
										
										
											2019-07-06 22:39:34 +05:30
										 |  |  | 	LineEdit *filter; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	void update_tree(); | 
					
						
							|  |  |  | 	void _select(); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 	void _cancel(); | 
					
						
							| 
									
										
										
										
											2019-07-06 22:39:34 +05:30
										 |  |  | 	void _filter_changed(const String &p_filter); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  | 	void _notification(int p_what); | 
					
						
							|  |  |  | 	static void _bind_methods(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2020-07-11 18:45:19 +02:00
										 |  |  | 	void popup_scenetree_dialog(); | 
					
						
							| 
									
										
										
										
											2015-06-22 00:03:19 -03:00
										 |  |  | 	SceneTreeEditor *get_scene_tree() { return tree; } | 
					
						
							| 
									
										
										
										
											2021-03-12 16:40:17 +01:00
										 |  |  | 	LineEdit *get_filter_line_edit() { return filter; } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	SceneTreeDialog(); | 
					
						
							|  |  |  | 	~SceneTreeDialog(); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |