Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/editor/scene/scene_tree_editor.h
21102 views
1
/**************************************************************************/
2
/* scene_tree_editor.h */
3
/**************************************************************************/
4
/* This file is part of: */
5
/* GODOT ENGINE */
6
/* https://godotengine.org */
7
/**************************************************************************/
8
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10
/* */
11
/* Permission is hereby granted, free of charge, to any person obtaining */
12
/* a copy of this software and associated documentation files (the */
13
/* "Software"), to deal in the Software without restriction, including */
14
/* without limitation the rights to use, copy, modify, merge, publish, */
15
/* distribute, sublicense, and/or sell copies of the Software, and to */
16
/* permit persons to whom the Software is furnished to do so, subject to */
17
/* the following conditions: */
18
/* */
19
/* The above copyright notice and this permission notice shall be */
20
/* included in all copies or substantial portions of the Software. */
21
/* */
22
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29
/**************************************************************************/
30
31
#pragma once
32
33
#include "scene/gui/dialogs.h"
34
#include "scene/gui/tree.h"
35
36
class CheckBox;
37
class CheckButton;
38
class EditorSelection;
39
class FilterLineEdit;
40
class Label;
41
class TextureRect;
42
class Timer;
43
44
class SceneTreeEditor : public Control {
45
GDCLASS(SceneTreeEditor, Control);
46
47
EditorSelection *editor_selection = nullptr;
48
49
enum SceneTreeEditorButton {
50
BUTTON_SUBSCENE = 0,
51
BUTTON_VISIBILITY = 1,
52
BUTTON_SCRIPT = 2,
53
BUTTON_LOCK = 3,
54
BUTTON_GROUP = 4,
55
BUTTON_WARNING = 5,
56
BUTTON_SIGNALS = 6,
57
BUTTON_GROUPS = 7,
58
BUTTON_PIN = 8,
59
BUTTON_UNIQUE = 9,
60
};
61
62
struct CachedNode {
63
Node *node = nullptr;
64
TreeItem *item = nullptr;
65
int index = -1;
66
bool dirty = true;
67
bool has_moved_children = false;
68
bool removed = false;
69
70
// Store the iterator for faster removal. This is safe as
71
// HashMap never moves elements.
72
HashMap<Node *, CachedNode>::Iterator cache_iterator;
73
// This is safe because it gets compared to a uint8_t.
74
uint16_t delete_serial = UINT16_MAX;
75
76
// To know whether to update children or not.
77
bool can_process = false;
78
79
CachedNode() = delete; // Always an error.
80
CachedNode(Node *p_node, TreeItem *p_item) :
81
node(p_node), item(p_item) {}
82
};
83
84
struct NodeCache {
85
~NodeCache() {
86
clear();
87
}
88
89
NodeCache(SceneTreeEditor *p_editor) :
90
editor(p_editor) {}
91
92
HashMap<Node *, CachedNode>::Iterator add(Node *p_node, TreeItem *p_item);
93
HashMap<Node *, CachedNode>::Iterator get(Node *p_node, bool p_deleted_ok = true);
94
bool has(Node *p_node);
95
void remove(Node *p_node, bool p_recursive = false);
96
void mark_dirty(Node *p_node, bool p_parents = true);
97
void mark_children_dirty(Node *p_node, bool p_recursive = false);
98
99
void delete_pending();
100
void clear();
101
102
SceneTreeEditor *editor;
103
HashMap<Node *, CachedNode> cache;
104
HashSet<CachedNode *> to_delete;
105
ObjectID current_scene_id;
106
Node *current_pinned_node = nullptr;
107
bool current_has_pin = false;
108
bool force_update = false;
109
uint8_t delete_serial = 0;
110
};
111
112
NodeCache node_cache;
113
114
Tree *tree = nullptr;
115
Node *selected = nullptr;
116
117
String filter;
118
String filter_term_warning;
119
bool show_all_nodes = false;
120
121
AcceptDialog *error = nullptr;
122
AcceptDialog *warning = nullptr;
123
124
ConfirmationDialog *revoke_dialog = nullptr;
125
Label *revoke_dialog_label = nullptr;
126
CheckBox *ask_before_revoke_checkbox = nullptr;
127
Node *revoke_node = nullptr;
128
129
bool auto_expand_selected = true;
130
bool hide_filtered_out_parents = false;
131
bool accessibility_warnings = false;
132
bool connect_to_script_mode = false;
133
bool connecting_signal = false;
134
bool update_when_invisible = true;
135
136
int blocked;
137
138
void _compute_hash(Node *p_node, uint64_t &hash);
139
void _reset();
140
PackedStringArray _get_node_configuration_warnings(Node *p_node);
141
PackedStringArray _get_node_accessibility_configuration_warnings(Node *p_node);
142
143
void _update_node_path(Node *p_node, bool p_recursive = true);
144
void _update_node_subtree(Node *p_node, TreeItem *p_parent, bool p_force = false);
145
void _update_node(Node *p_node, TreeItem *p_item, bool p_part_of_subscene);
146
void _update_if_clean();
147
148
void _test_update_tree();
149
bool _update_filter(TreeItem *p_parent = nullptr, bool p_scroll_to_selected = false);
150
bool _update_filter_helper(TreeItem *p_parent, bool p_scroll_to_selected, TreeItem *&r_last_selected);
151
bool _node_matches_class_term(const Node *p_item_node, const String &p_term);
152
bool _item_matches_all_terms(TreeItem *p_item, const PackedStringArray &p_terms);
153
void _tree_changed();
154
void _tree_process_mode_changed();
155
156
void _move_node_children(HashMap<Node *, CachedNode>::Iterator &p_I);
157
void _move_node_item(TreeItem *p_parent, HashMap<Node *, CachedNode>::Iterator &p_I, TreeItem *p_correct_prev = nullptr);
158
159
void _node_child_order_changed(Node *p_node);
160
void _node_editor_state_changed(Node *p_node);
161
void _node_added(Node *p_node);
162
void _node_removed(Node *p_node);
163
void _node_renamed(Node *p_node);
164
165
TreeItem *_find(TreeItem *p_node, const NodePath &p_path);
166
void _notification(int p_what);
167
void _selected_changed();
168
void _deselect_items();
169
170
void _cell_collapsed(Object *p_obj);
171
172
uint64_t last_hash;
173
174
bool can_rename;
175
bool can_open_instance;
176
bool updating_tree = false;
177
bool show_enabled_subscene = false;
178
bool is_scene_tree_dock = false;
179
180
void _edited();
181
void _renamed(TreeItem *p_item, TreeItem *p_batch_item, Node *p_node = nullptr);
182
183
HashSet<Node *> marked;
184
bool marked_selectable = false;
185
bool marked_children_selectable = false;
186
bool display_foreign = false;
187
bool tree_dirty = true;
188
bool pending_test_update = false;
189
bool pending_selection_update = false;
190
Timer *update_node_tooltip_delay = nullptr;
191
192
static void _bind_methods();
193
194
void _cell_button_pressed(Object *p_item, int p_column, int p_id, MouseButton p_button);
195
void _toggle_visible(Node *p_node);
196
void _cell_multi_selected(Object *p_object, int p_cell, bool p_selected);
197
void _process_selection_update();
198
void _update_selection(TreeItem *item);
199
void _node_script_changed(Node *p_node);
200
void _node_visibility_changed(Node *p_node);
201
void _update_visibility_color(Node *p_node, TreeItem *p_item);
202
void _set_item_custom_color(TreeItem *p_item, Color p_color);
203
void _update_node_tooltip(Node *p_node, TreeItem *p_item);
204
void _queue_update_node_tooltip(Node *p_node, TreeItem *p_item);
205
void _tree_scroll_to_item(ObjectID p_item_id);
206
207
void _selection_changed();
208
Node *get_scene_node() const;
209
210
Variant get_drag_data_fw(const Point2 &p_point, Control *p_from);
211
bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
212
void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
213
214
void _empty_clicked(const Vector2 &p_pos, MouseButton p_button);
215
void _rmb_select(const Vector2 &p_pos, MouseButton p_button = MouseButton::RIGHT);
216
217
void _warning_changed(Node *p_for_node);
218
void _update_marking_list(const HashSet<Node *> &p_marked);
219
220
Timer *update_timer = nullptr;
221
222
LocalVector<StringName> *script_types;
223
bool _is_script_type(const StringName &p_type) const;
224
225
Vector<StringName> valid_types;
226
227
void _update_ask_before_revoking_unique_name();
228
void _revoke_unique_name();
229
230
public:
231
// Public for use with callable_mp.
232
void _update_tree(bool p_scroll_to_selected = false);
233
234
void rename_node(Node *p_node, const String &p_name, TreeItem *p_item = nullptr);
235
236
void set_filter(const String &p_filter);
237
String get_filter() const;
238
String get_filter_term_warning();
239
void set_show_all_nodes(bool p_show_all_nodes);
240
241
void set_as_scene_tree_dock();
242
void set_display_foreign_nodes(bool p_display);
243
244
void set_marked(const HashSet<Node *> &p_marked, bool p_selectable = true, bool p_children_selectable = true);
245
void set_marked(Node *p_marked, bool p_selectable = true, bool p_children_selectable = true);
246
void set_selected(Node *p_node, bool p_emit_selected = true);
247
Node *get_selected();
248
void set_can_rename(bool p_can_rename) { can_rename = p_can_rename; }
249
void set_editor_selection(EditorSelection *p_selection);
250
251
void set_show_enabled_subscene(bool p_show) { show_enabled_subscene = p_show; }
252
void set_valid_types(const Vector<StringName> &p_valid);
253
void clear_cache();
254
255
inline void update_tree() { _update_tree(); }
256
257
void set_auto_expand_selected(bool p_auto, bool p_update_settings);
258
void set_hide_filtered_out_parents(bool p_hide, bool p_update_settings);
259
void set_accessibility_warnings(bool p_enable, bool p_update_settings);
260
void set_connect_to_script_mode(bool p_enable);
261
void set_connecting_signal(bool p_enable);
262
void set_update_when_invisible(bool p_enable);
263
264
Tree *get_scene_tree() { return tree; }
265
266
void update_warning();
267
268
SceneTreeEditor(bool p_label = true, bool p_can_rename = false, bool p_can_open_instance = false);
269
~SceneTreeEditor();
270
};
271
272
class SceneTreeDialog : public ConfirmationDialog {
273
GDCLASS(SceneTreeDialog, ConfirmationDialog);
274
275
VBoxContainer *content = nullptr;
276
SceneTreeEditor *tree = nullptr;
277
FilterLineEdit *filter = nullptr;
278
CheckButton *show_all_nodes = nullptr;
279
LocalVector<TextureRect *> valid_type_icons;
280
HBoxContainer *allowed_types_hbox = nullptr;
281
282
void _select();
283
void _cancel();
284
void _selected_changed();
285
void _filter_changed(const String &p_filter);
286
void _show_all_nodes_changed(bool p_button_pressed);
287
288
protected:
289
void _update_valid_type_icons();
290
void _notification(int p_what);
291
static void _bind_methods();
292
293
public:
294
void popup_scenetree_dialog(Node *p_selected_node = nullptr, Node *p_marked_node = nullptr, bool p_marked_node_selectable = true, bool p_marked_node_children_selectable = true);
295
void set_valid_types(const Vector<StringName> &p_valid);
296
297
SceneTreeEditor *get_scene_tree() { return tree; }
298
LineEdit *get_filter_line_edit();
299
300
SceneTreeDialog();
301
};
302
303