diff options
Diffstat (limited to 'scene/gui/tree.cpp')
-rw-r--r-- | scene/gui/tree.cpp | 991 |
1 files changed, 398 insertions, 593 deletions
diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index 653ac74164..7b9db7c081 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -30,7 +30,7 @@ #include "tree.h" -#include "core/input/input_filter.h" +#include "core/input/input.h" #include "core/math/math_funcs.h" #include "core/os/keyboard.h" #include "core/os/os.h" @@ -47,9 +47,9 @@ #include <limits.h> void TreeItem::move_to_top() { - - if (!parent || parent->children == this) + if (!parent || parent->children == this) { return; //already on top + } TreeItem *prev = get_prev(); prev->next = next; next = parent->children; @@ -57,13 +57,15 @@ void TreeItem::move_to_top() { } void TreeItem::move_to_bottom() { - if (!parent || !next) + if (!parent || !next) { return; + } TreeItem *prev = get_prev(); TreeItem *last = next; - while (last->next) + while (last->next) { last = last->next; + } if (prev) { prev->next = next; @@ -71,58 +73,52 @@ void TreeItem::move_to_bottom() { parent->children = next; } last->next = this; - next = NULL; + next = nullptr; } Size2 TreeItem::Cell::get_icon_size() const { - - if (icon.is_null()) + if (icon.is_null()) { return Size2(); - if (icon_region == Rect2i()) + } + if (icon_region == Rect2i()) { return icon->get_size(); - else + } else { return icon_region.size; + } } void TreeItem::Cell::draw_icon(const RID &p_where, const Point2 &p_pos, const Size2 &p_size, const Color &p_color) const { - - if (icon.is_null()) + if (icon.is_null()) { return; + } Size2i dsize = (p_size == Size2()) ? icon->get_size() : p_size; if (icon_region == Rect2i()) { - icon->draw_rect_region(p_where, Rect2(p_pos, dsize), Rect2(Point2(), icon->get_size()), p_color); } else { - icon->draw_rect_region(p_where, Rect2(p_pos, dsize), icon_region, p_color); } } void TreeItem::_changed_notify(int p_cell) { - tree->item_changed(p_cell, this); } void TreeItem::_changed_notify() { - tree->item_changed(-1, this); } void TreeItem::_cell_selected(int p_cell) { - tree->item_selected(p_cell, this); } void TreeItem::_cell_deselected(int p_cell) { - tree->item_deselected(p_cell, this); } /* cell mode */ void TreeItem::set_cell_mode(int p_column, TreeCellMode p_mode) { - ERR_FAIL_INDEX(p_column, cells.size()); Cell &c = cells.write[p_column]; c.mode = p_mode; @@ -138,32 +134,27 @@ void TreeItem::set_cell_mode(int p_column, TreeCellMode p_mode) { } TreeItem::TreeCellMode TreeItem::get_cell_mode(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), TreeItem::CELL_MODE_STRING); return cells[p_column].mode; } /* check mode */ void TreeItem::set_checked(int p_column, bool p_checked) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].checked = p_checked; _changed_notify(p_column); } bool TreeItem::is_checked(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); return cells[p_column].checked; } void TreeItem::set_text(int p_column, String p_text) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].text = p_text; if (cells[p_column].mode == TreeItem::CELL_MODE_RANGE) { - Vector<String> strings = p_text.split(","); cells.write[p_column].min = INT_MAX; cells.write[p_column].max = INT_MIN; @@ -181,13 +172,11 @@ void TreeItem::set_text(int p_column, String p_text) { } String TreeItem::get_text(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), ""); return cells[p_column].text; } void TreeItem::set_suffix(int p_column, String p_suffix) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].suffix = p_suffix; @@ -195,91 +184,82 @@ void TreeItem::set_suffix(int p_column, String p_suffix) { } String TreeItem::get_suffix(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), ""); return cells[p_column].suffix; } void TreeItem::set_icon(int p_column, const Ref<Texture2D> &p_icon) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].icon = p_icon; _changed_notify(p_column); } Ref<Texture2D> TreeItem::get_icon(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), Ref<Texture2D>()); return cells[p_column].icon; } void TreeItem::set_icon_region(int p_column, const Rect2 &p_icon_region) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].icon_region = p_icon_region; _changed_notify(p_column); } Rect2 TreeItem::get_icon_region(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), Rect2()); return cells[p_column].icon_region; } void TreeItem::set_icon_modulate(int p_column, const Color &p_modulate) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].icon_color = p_modulate; _changed_notify(p_column); } Color TreeItem::get_icon_modulate(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), Color()); return cells[p_column].icon_color; } void TreeItem::set_icon_max_width(int p_column, int p_max) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].icon_max_w = p_max; _changed_notify(p_column); } int TreeItem::get_icon_max_width(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), 0); return cells[p_column].icon_max_w; } /* range works for mode number or mode combo */ void TreeItem::set_range(int p_column, double p_value) { - ERR_FAIL_INDEX(p_column, cells.size()); - if (cells[p_column].step > 0) + if (cells[p_column].step > 0) { p_value = Math::stepify(p_value, cells[p_column].step); - if (p_value < cells[p_column].min) + } + if (p_value < cells[p_column].min) { p_value = cells[p_column].min; - if (p_value > cells[p_column].max) + } + if (p_value > cells[p_column].max) { p_value = cells[p_column].max; + } cells.write[p_column].val = p_value; _changed_notify(p_column); } double TreeItem::get_range(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), 0); return cells[p_column].val; } bool TreeItem::is_range_exponential(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); return cells[p_column].expr; } -void TreeItem::set_range_config(int p_column, double p_min, double p_max, double p_step, bool p_exp) { +void TreeItem::set_range_config(int p_column, double p_min, double p_max, double p_step, bool p_exp) { ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].min = p_min; cells.write[p_column].max = p_max; @@ -289,7 +269,6 @@ void TreeItem::set_range_config(int p_column, double p_min, double p_max, double } void TreeItem::get_range_config(int p_column, double &r_min, double &r_max, double &r_step) const { - ERR_FAIL_INDEX(p_column, cells.size()); r_min = cells[p_column].min; r_max = cells[p_column].max; @@ -297,20 +276,17 @@ void TreeItem::get_range_config(int p_column, double &r_min, double &r_max, doub } void TreeItem::set_metadata(int p_column, const Variant &p_meta) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].meta = p_meta; } Variant TreeItem::get_metadata(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), Variant()); return cells[p_column].meta; } void TreeItem::set_custom_draw(int p_column, Object *p_object, const StringName &p_callback) { - ERR_FAIL_INDEX(p_column, cells.size()); ERR_FAIL_NULL(p_object); @@ -319,25 +295,21 @@ void TreeItem::set_custom_draw(int p_column, Object *p_object, const StringName } void TreeItem::set_collapsed(bool p_collapsed) { - - if (collapsed == p_collapsed || !tree) + if (collapsed == p_collapsed || !tree) { return; + } collapsed = p_collapsed; TreeItem *ci = tree->selected_item; if (ci) { - while (ci && ci != this) { - ci = ci->parent; } if (ci) { // collapsing cursor/selected, move it! if (tree->select_mode == Tree::SELECT_MULTI) { - tree->selected_item = this; emit_signal("cell_selected"); } else { - select(tree->selected_col); } @@ -350,7 +322,6 @@ void TreeItem::set_collapsed(bool p_collapsed) { } bool TreeItem::is_collapsed() { - return collapsed; } @@ -364,43 +335,39 @@ int TreeItem::get_custom_minimum_height() const { } TreeItem *TreeItem::get_next() { - return next; } TreeItem *TreeItem::get_prev() { - - if (!parent || parent->children == this) - return NULL; + if (!parent || parent->children == this) { + return nullptr; + } TreeItem *prev = parent->children; - while (prev && prev->next != this) + while (prev && prev->next != this) { prev = prev->next; + } return prev; } TreeItem *TreeItem::get_parent() { - return parent; } TreeItem *TreeItem::get_children() { - return children; } TreeItem *TreeItem::get_prev_visible(bool p_wrap) { - TreeItem *current = this; TreeItem *prev = current->get_prev(); if (!prev) { - current = current->parent; if (current == tree->root && tree->hide_root) { - return NULL; + return nullptr; } else if (!current) { if (p_wrap) { current = this; @@ -410,18 +377,18 @@ TreeItem *TreeItem::get_prev_visible(bool p_wrap) { temp = temp->get_next_visible(); } } else { - return NULL; + return nullptr; } } } else { - current = prev; while (!current->collapsed && current->children) { //go to the very end current = current->children; - while (current->next) + while (current->next) { current = current->next; + } } } @@ -429,28 +396,24 @@ TreeItem *TreeItem::get_prev_visible(bool p_wrap) { } TreeItem *TreeItem::get_next_visible(bool p_wrap) { - TreeItem *current = this; if (!current->collapsed && current->children) { - current = current->children; } else if (current->next) { - current = current->next; } else { - while (current && !current->next) { - current = current->parent; } if (!current) { - if (p_wrap) + if (p_wrap) { return tree->root; - else - return NULL; + } else { + return nullptr; + } } else { current = current->next; } @@ -460,19 +423,16 @@ TreeItem *TreeItem::get_next_visible(bool p_wrap) { } void TreeItem::remove_child(TreeItem *p_item) { - ERR_FAIL_NULL(p_item); TreeItem **c = &children; while (*c) { - if ((*c) == p_item) { - TreeItem *aux = *c; *c = (*c)->next; - aux->parent = NULL; + aux->parent = nullptr; return; } @@ -483,55 +443,51 @@ void TreeItem::remove_child(TreeItem *p_item) { } void TreeItem::set_selectable(int p_column, bool p_selectable) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].selectable = p_selectable; } bool TreeItem::is_selectable(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); return cells[p_column].selectable; } bool TreeItem::is_selected(int p_column) { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); return cells[p_column].selectable && cells[p_column].selected; } void TreeItem::set_as_cursor(int p_column) { - ERR_FAIL_INDEX(p_column, cells.size()); - if (!tree) + if (!tree) { return; - if (tree->select_mode != Tree::SELECT_MULTI) + } + if (tree->select_mode != Tree::SELECT_MULTI) { return; + } tree->selected_item = this; tree->selected_col = p_column; tree->update(); } void TreeItem::select(int p_column) { - ERR_FAIL_INDEX(p_column, cells.size()); _cell_selected(p_column); } void TreeItem::deselect(int p_column) { - ERR_FAIL_INDEX(p_column, cells.size()); _cell_deselected(p_column); } void TreeItem::add_button(int p_column, const Ref<Texture2D> &p_button, int p_id, bool p_disabled, const String &p_tooltip) { - ERR_FAIL_INDEX(p_column, cells.size()); ERR_FAIL_COND(!p_button.is_valid()); TreeItem::Cell::Button button; button.texture = p_button; - if (p_id < 0) + if (p_id < 0) { p_id = cells[p_column].buttons.size(); + } button.id = p_id; button.disabled = p_disabled; button.tooltip = p_tooltip; @@ -540,27 +496,29 @@ void TreeItem::add_button(int p_column, const Ref<Texture2D> &p_button, int p_id } int TreeItem::get_button_count(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), -1); return cells[p_column].buttons.size(); } + Ref<Texture2D> TreeItem::get_button(int p_column, int p_idx) const { ERR_FAIL_INDEX_V(p_column, cells.size(), Ref<Texture2D>()); ERR_FAIL_INDEX_V(p_idx, cells[p_column].buttons.size(), Ref<Texture2D>()); return cells[p_column].buttons[p_idx].texture; } + String TreeItem::get_button_tooltip(int p_column, int p_idx) const { ERR_FAIL_INDEX_V(p_column, cells.size(), String()); ERR_FAIL_INDEX_V(p_idx, cells[p_column].buttons.size(), String()); return cells[p_column].buttons[p_idx].tooltip; } + int TreeItem::get_button_id(int p_column, int p_idx) const { ERR_FAIL_INDEX_V(p_column, cells.size(), -1); ERR_FAIL_INDEX_V(p_idx, cells[p_column].buttons.size(), -1); return cells[p_column].buttons[p_idx].id; } -void TreeItem::erase_button(int p_column, int p_idx) { +void TreeItem::erase_button(int p_column, int p_idx) { ERR_FAIL_INDEX(p_column, cells.size()); ERR_FAIL_INDEX(p_idx, cells[p_column].buttons.size()); cells.write[p_column].buttons.remove(p_idx); @@ -568,19 +526,17 @@ void TreeItem::erase_button(int p_column, int p_idx) { } int TreeItem::get_button_by_id(int p_column, int p_id) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), -1); for (int i = 0; i < cells[p_column].buttons.size(); i++) { - - if (cells[p_column].buttons[i].id == p_id) + if (cells[p_column].buttons[i].id == p_id) { return i; + } } return -1; } void TreeItem::set_button(int p_column, int p_idx, const Ref<Texture2D> &p_button) { - ERR_FAIL_COND(p_button.is_null()); ERR_FAIL_INDEX(p_column, cells.size()); ERR_FAIL_INDEX(p_idx, cells[p_column].buttons.size()); @@ -589,7 +545,6 @@ void TreeItem::set_button(int p_column, int p_idx, const Ref<Texture2D> &p_butto } void TreeItem::set_button_color(int p_column, int p_idx, const Color &p_color) { - ERR_FAIL_INDEX(p_column, cells.size()); ERR_FAIL_INDEX(p_idx, cells[p_column].buttons.size()); cells.write[p_column].buttons.write[p_idx].color = p_color; @@ -597,7 +552,6 @@ void TreeItem::set_button_color(int p_column, int p_idx, const Color &p_color) { } void TreeItem::set_button_disabled(int p_column, int p_idx, bool p_disabled) { - ERR_FAIL_INDEX(p_column, cells.size()); ERR_FAIL_INDEX(p_idx, cells[p_column].buttons.size()); @@ -606,7 +560,6 @@ void TreeItem::set_button_disabled(int p_column, int p_idx, bool p_disabled) { } bool TreeItem::is_button_disabled(int p_column, int p_idx) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); ERR_FAIL_INDEX_V(p_idx, cells[p_column].buttons.size(), false); @@ -614,34 +567,32 @@ bool TreeItem::is_button_disabled(int p_column, int p_idx) const { } void TreeItem::set_editable(int p_column, bool p_editable) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].editable = p_editable; _changed_notify(p_column); } bool TreeItem::is_editable(int p_column) { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); return cells[p_column].editable; } void TreeItem::set_custom_color(int p_column, const Color &p_color) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].custom_color = true; cells.write[p_column].color = p_color; _changed_notify(p_column); } -Color TreeItem::get_custom_color(int p_column) const { +Color TreeItem::get_custom_color(int p_column) const { ERR_FAIL_INDEX_V(p_column, cells.size(), Color()); - if (!cells[p_column].custom_color) + if (!cells[p_column].custom_color) { return Color(); + } return cells[p_column].color; } -void TreeItem::clear_custom_color(int p_column) { +void TreeItem::clear_custom_color(int p_column) { ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].custom_color = false; cells.write[p_column].color = Color(); @@ -649,19 +600,16 @@ void TreeItem::clear_custom_color(int p_column) { } void TreeItem::set_tooltip(int p_column, const String &p_tooltip) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].tooltip = p_tooltip; } String TreeItem::get_tooltip(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), ""); return cells[p_column].tooltip; } void TreeItem::set_custom_bg_color(int p_column, const Color &p_color, bool p_bg_outline) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].custom_bg_color = true; cells.write[p_column].custom_bg_outline = p_bg_outline; @@ -670,7 +618,6 @@ void TreeItem::set_custom_bg_color(int p_column, const Color &p_color, bool p_bg } void TreeItem::clear_custom_bg_color(int p_column) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].custom_bg_color = false; cells.write[p_column].bg_color = Color(); @@ -678,21 +625,19 @@ void TreeItem::clear_custom_bg_color(int p_column) { } Color TreeItem::get_custom_bg_color(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), Color()); - if (!cells[p_column].custom_bg_color) + if (!cells[p_column].custom_bg_color) { return Color(); + } return cells[p_column].bg_color; } void TreeItem::set_custom_as_button(int p_column, bool p_button) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].custom_button = p_button; } bool TreeItem::is_custom_set_as_button(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); return cells[p_column].custom_button; } @@ -709,20 +654,17 @@ TreeItem::TextAlign TreeItem::get_text_align(int p_column) const { } void TreeItem::set_expand_right(int p_column, bool p_enable) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].expand_right = p_enable; _changed_notify(p_column); } bool TreeItem::get_expand_right(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); return cells[p_column].expand_right; } void TreeItem::set_disable_folding(bool p_disable) { - disable_folding = p_disable; _changed_notify(0); } @@ -732,7 +674,6 @@ bool TreeItem::is_folding_disabled() const { } Variant TreeItem::_call_recursive_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - if (p_argcount < 1) { r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; r_error.argument = 0; @@ -769,7 +710,6 @@ void TreeItem::call_recursive(const StringName &p_method, const Variant **p_args } void TreeItem::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_cell_mode", "column", "mode"), &TreeItem::set_cell_mode); ClassDB::bind_method(D_METHOD("get_cell_mode", "column"), &TreeItem::get_cell_mode); @@ -779,6 +719,9 @@ void TreeItem::_bind_methods() { ClassDB::bind_method(D_METHOD("set_text", "column", "text"), &TreeItem::set_text); ClassDB::bind_method(D_METHOD("get_text", "column"), &TreeItem::get_text); + ClassDB::bind_method(D_METHOD("set_suffix", "column", "text"), &TreeItem::set_suffix); + ClassDB::bind_method(D_METHOD("get_suffix", "column"), &TreeItem::get_suffix); + ClassDB::bind_method(D_METHOD("set_icon", "column", "texture"), &TreeItem::set_icon); ClassDB::bind_method(D_METHOD("get_icon", "column"), &TreeItem::get_icon); @@ -884,63 +827,62 @@ void TreeItem::_bind_methods() { } void TreeItem::clear_children() { - TreeItem *c = children; while (c) { - TreeItem *aux = c; c = c->get_next(); - aux->parent = 0; // so it won't try to recursively autoremove from me in here + aux->parent = nullptr; // so it won't try to recursively autoremove from me in here memdelete(aux); } - children = 0; + children = nullptr; }; TreeItem::TreeItem(Tree *p_tree) { - tree = p_tree; collapsed = false; disable_folding = false; custom_min_height = 0; - parent = 0; // parent item - next = 0; // next in list - children = 0; //child items + parent = nullptr; // parent item + next = nullptr; // next in list + children = nullptr; //child items } TreeItem::~TreeItem() { - clear_children(); - if (parent) + if (parent) { parent->remove_child(this); + } if (tree && tree->root == this) { - - tree->root = 0; + tree->root = nullptr; } if (tree && tree->popup_edited_item == this) { - tree->popup_edited_item = NULL; + tree->popup_edited_item = nullptr; tree->pressing_for_editor = false; } if (tree && tree->cache.hover_item == this) { - tree->cache.hover_item = NULL; + tree->cache.hover_item = nullptr; } - if (tree && tree->selected_item == this) - tree->selected_item = NULL; + if (tree && tree->selected_item == this) { + tree->selected_item = nullptr; + } - if (tree && tree->drop_mode_over == this) - tree->drop_mode_over = NULL; + if (tree && tree->drop_mode_over == this) { + tree->drop_mode_over = nullptr; + } - if (tree && tree->single_select_defer == this) - tree->single_select_defer = NULL; + if (tree && tree->single_select_defer == this) { + tree->single_select_defer = nullptr; + } if (tree && tree->edited_item == this) { - tree->edited_item = NULL; + tree->edited_item = nullptr; tree->pressing_for_editor = false; } } @@ -953,7 +895,6 @@ TreeItem::~TreeItem() { /**********************************************/ void Tree::update_cache() { - cache.font = get_theme_font("font"); cache.tb_font = get_theme_font("title_button_font"); cache.bg = get_theme_stylebox("bg"); @@ -998,45 +939,42 @@ void Tree::update_cache() { } int Tree::compute_item_height(TreeItem *p_item) const { - - if (p_item == root && hide_root) + if (p_item == root && hide_root) { return 0; + } ERR_FAIL_COND_V(cache.font.is_null(), 0); int height = cache.font->get_height(); for (int i = 0; i < columns.size(); i++) { - for (int j = 0; j < p_item->cells[i].buttons.size(); j++) { - Size2i s; // = cache.button_pressed->get_minimum_size(); s += p_item->cells[i].buttons[j].texture->get_size(); - if (s.height > height) + if (s.height > height) { height = s.height; + } } switch (p_item->cells[i].mode) { - case TreeItem::CELL_MODE_CHECK: { - int check_icon_h = cache.checked->get_height(); - if (height < check_icon_h) + if (height < check_icon_h) { height = check_icon_h; + } [[fallthrough]]; } case TreeItem::CELL_MODE_STRING: case TreeItem::CELL_MODE_CUSTOM: case TreeItem::CELL_MODE_ICON: { - Ref<Texture2D> icon = p_item->cells[i].icon; if (!icon.is_null()) { - Size2i s = p_item->cells[i].get_icon_size(); if (p_item->cells[i].icon_max_w > 0 && s.width > p_item->cells[i].icon_max_w) { s.height = s.height * p_item->cells[i].icon_max_w / s.width; } - if (s.height > height) + if (s.height > height) { height = s.height; + } } if (p_item->cells[i].mode == TreeItem::CELL_MODE_CUSTOM && p_item->cells[i].custom_button) { height += cache.custom_button->get_minimum_size().height; @@ -1048,8 +986,9 @@ int Tree::compute_item_height(TreeItem *p_item) const { } } int item_min_height = p_item->get_custom_minimum_height(); - if (height < item_min_height) + if (height < item_min_height) { height = item_min_height; + } height += cache.vseparation; @@ -1057,7 +996,6 @@ int Tree::compute_item_height(TreeItem *p_item) const { } int Tree::get_item_height(TreeItem *p_item) const { - int height = compute_item_height(p_item); height += cache.vseparation; @@ -1066,7 +1004,6 @@ int Tree::get_item_height(TreeItem *p_item) const { TreeItem *c = p_item->children; while (c) { - height += get_item_height(c); c = c->next; @@ -1077,14 +1014,14 @@ int Tree::get_item_height(TreeItem *p_item) const { } void Tree::draw_item_rect(const TreeItem::Cell &p_cell, const Rect2i &p_rect, const Color &p_color, const Color &p_icon_color) { - ERR_FAIL_COND(cache.font.is_null()); Rect2i rect = p_rect; Ref<Font> font = cache.font; String text = p_cell.text; - if (p_cell.suffix != String()) + if (p_cell.suffix != String()) { text += " " + p_cell.suffix; + } int w = 0; if (!p_cell.icon.is_null()) { @@ -1127,9 +1064,9 @@ void Tree::draw_item_rect(const TreeItem::Cell &p_cell, const Rect2i &p_rect, co } int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 &p_draw_size, TreeItem *p_item) { - - if (p_pos.y - cache.offset.y > (p_draw_size.height)) + if (p_pos.y - cache.offset.y > (p_draw_size.height)) { return -1; //draw no more! + } RID ci = get_canvas_item(); @@ -1145,7 +1082,6 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 bool skip = (p_item == root && hide_root); if (!skip && (p_pos.y + label_h - cache.offset.y) > 0) { - //draw separation. //if (p_item->get_parent()!=root || !hide_root) @@ -1157,7 +1093,6 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 int ofs = p_pos.x + ((p_item->disable_folding || hide_folding) ? cache.hseparation : cache.item_margin); int skip2 = 0; for (int i = 0; i < columns.size(); i++) { - if (skip2) { skip2--; continue; @@ -1166,22 +1101,18 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 int w = get_column_width(i); if (i == 0) { - w -= ofs; if (w <= 0) { - ofs = get_column_width(0); continue; } } else { - ofs += cache.hseparation; w -= cache.hseparation; } if (p_item->cells[i].expand_right) { - int plus = 1; while (i + plus < columns.size() && !p_item->cells[i + plus].editable && p_item->cells[i + plus].mode == TreeItem::CELL_MODE_STRING && p_item->cells[i + plus].text == "" && p_item->cells[i + plus].icon.is_null()) { w += get_column_width(i + plus); @@ -1194,8 +1125,9 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 for (int j = p_item->cells[i].buttons.size() - 1; j >= 0; j--) { Ref<Texture2D> b = p_item->cells[i].buttons[j].texture; Size2 s = b->get_size() + cache.button_pressed->get_minimum_size(); - if (s.height < label_h) + if (s.height < label_h) { s.height = label_h; + } Point2i o = Point2i(ofs + w - s.width, p_pos.y) - cache.offset + p_draw_ofs; @@ -1220,19 +1152,19 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } if (cache.draw_guides) { - VisualServer::get_singleton()->canvas_item_add_line(ci, Point2i(cell_rect.position.x, cell_rect.position.y + cell_rect.size.height), cell_rect.position + cell_rect.size, cache.guide_color, 1); + RenderingServer::get_singleton()->canvas_item_add_line(ci, Point2i(cell_rect.position.x, cell_rect.position.y + cell_rect.size.height), cell_rect.position + cell_rect.size, cache.guide_color, 1); } if (i == 0) { - if (p_item->cells[0].selected && select_mode == SELECT_ROW) { Rect2i row_rect = Rect2i(Point2i(cache.bg->get_margin(MARGIN_LEFT), item_rect.position.y), Size2i(get_size().width - cache.bg->get_minimum_size().width, item_rect.size.y)); //Rect2 r = Rect2i(row_rect.pos,row_rect.size); //r.grow(cache.selected->get_margin(MARGIN_LEFT)); - if (has_focus()) + if (has_focus()) { cache.selected_focus->draw(ci, row_rect); - else + } else { cache.selected->draw(ci, row_rect); + } } } @@ -1256,7 +1188,6 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } if (p_item->cells[i].custom_bg_color) { - Rect2 r = cell_rect; if (i == 0) { r.position.x = p_draw_ofs.x; @@ -1266,30 +1197,29 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 r.size.x += cache.hseparation; } if (p_item->cells[i].custom_bg_outline) { - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x, r.position.y, r.size.x, 1), p_item->cells[i].bg_color); - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x, r.position.y + r.size.y - 1, r.size.x, 1), p_item->cells[i].bg_color); - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x, r.position.y, 1, r.size.y), p_item->cells[i].bg_color); - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x + r.size.x - 1, r.position.y, 1, r.size.y), p_item->cells[i].bg_color); + RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x, r.position.y, r.size.x, 1), p_item->cells[i].bg_color); + RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x, r.position.y + r.size.y - 1, r.size.x, 1), p_item->cells[i].bg_color); + RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x, r.position.y, 1, r.size.y), p_item->cells[i].bg_color); + RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x + r.size.x - 1, r.position.y, 1, r.size.y), p_item->cells[i].bg_color); } else { - VisualServer::get_singleton()->canvas_item_add_rect(ci, r, p_item->cells[i].bg_color); + RenderingServer::get_singleton()->canvas_item_add_rect(ci, r, p_item->cells[i].bg_color); } } if (drop_mode_flags && drop_mode_over == p_item) { - Rect2 r = cell_rect; if (drop_mode_section == -1 || drop_mode_section == 0) { - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x, r.position.y, r.size.x, 1), cache.drop_position_color); + RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x, r.position.y, r.size.x, 1), cache.drop_position_color); } if (drop_mode_section == 0) { - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x, r.position.y, 1, r.size.y), cache.drop_position_color); - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x + r.size.x - 1, r.position.y, 1, r.size.y), cache.drop_position_color); + RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x, r.position.y, 1, r.size.y), cache.drop_position_color); + RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x + r.size.x - 1, r.position.y, 1, r.size.y), cache.drop_position_color); } if (drop_mode_section == 1 || drop_mode_section == 0) { - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x, r.position.y + r.size.y, r.size.x, 1), cache.drop_position_color); + RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x, r.position.y + r.size.y, r.size.x, 1), cache.drop_position_color); } } @@ -1300,13 +1230,10 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 text_pos.y += Math::floor((item_rect.size.y - font->get_height()) / 2) + font_ascent; switch (p_item->cells[i].mode) { - case TreeItem::CELL_MODE_STRING: { - draw_item_rect(p_item->cells[i], item_rect, col, icon_col); } break; case TreeItem::CELL_MODE_CHECK: { - Ref<Texture2D> checked = cache.checked; Ref<Texture2D> unchecked = cache.unchecked; Point2i check_ofs = item_rect.position; @@ -1330,9 +1257,9 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } break; case TreeItem::CELL_MODE_RANGE: { if (p_item->cells[i].text != "") { - - if (!p_item->cells[i].editable) + if (!p_item->cells[i].editable) { break; + } int option = (int)p_item->cells[i].val; @@ -1349,8 +1276,9 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } } - if (p_item->cells[i].suffix != String()) + if (p_item->cells[i].suffix != String()) { s += " " + p_item->cells[i].suffix; + } Ref<Texture2D> downarrow = cache.select_arrow; @@ -1362,18 +1290,19 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 downarrow->draw(ci, arrow_pos); } else { - Ref<Texture2D> updown = cache.updown; String valtext = String::num(p_item->cells[i].val, Math::range_step_decimals(p_item->cells[i].step)); - if (p_item->cells[i].suffix != String()) + if (p_item->cells[i].suffix != String()) { valtext += " " + p_item->cells[i].suffix; + } font->draw(ci, text_pos, valtext, col, item_rect.size.x - updown->get_width()); - if (!p_item->cells[i].editable) + if (!p_item->cells[i].editable) { break; + } Point2i updown_pos = item_rect.position; updown_pos.x += item_rect.size.x - updown->get_width(); @@ -1384,9 +1313,9 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } break; case TreeItem::CELL_MODE_ICON: { - - if (p_item->cells[i].icon.is_null()) + if (p_item->cells[i].icon.is_null()) { break; + } Size2i icon_size = p_item->cells[i].get_icon_size(); if (p_item->cells[i].icon_max_w > 0 && icon_size.width > p_item->cells[i].icon_max_w) { icon_size.height = icon_size.height * p_item->cells[i].icon_max_w / icon_size.width; @@ -1400,16 +1329,14 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } break; case TreeItem::CELL_MODE_CUSTOM: { - if (p_item->cells[i].custom_draw_obj.is_valid()) { - Object *cdo = ObjectDB::get_instance(p_item->cells[i].custom_draw_obj); - if (cdo) + if (cdo) { cdo->call(p_item->cells[i].custom_draw_callback, p_item, Rect2(item_rect)); + } } if (!p_item->cells[i].editable) { - draw_item_rect(p_item->cells[i], item_rect, col, icon_col); break; } @@ -1425,7 +1352,7 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 if (p_item->cells[i].custom_button) { if (cache.hover_item == p_item && cache.hover_cell == i) { - if (InputFilter::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { + if (Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { draw_style_box(cache.custom_button_pressed, ir); } else { draw_style_box(cache.custom_button_hover, ir); @@ -1446,19 +1373,17 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } if (i == 0) { - ofs = get_column_width(0); } else { - ofs += w + bw; } if (select_mode == SELECT_MULTI && selected_item == p_item && selected_col == i) { - - if (has_focus()) + if (has_focus()) { cache.cursor->draw(ci, cell_rect); - else + } else { cache.cursor_unfocus->draw(ci, cell_rect); + } } } @@ -1467,7 +1392,6 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 Ref<Texture2D> arrow; if (p_item->collapsed) { - arrow = cache.arrow_collapsed; } else { arrow = cache.arrow; @@ -1492,14 +1416,14 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 int prev_ofs = children_pos.y - cache.offset.y + p_draw_ofs.y; while (c) { - if (cache.draw_relationship_lines > 0 && (!hide_root || c->parent != root)) { int root_ofs = children_pos.x + ((p_item->disable_folding || hide_folding) ? cache.hseparation : cache.item_margin); int parent_ofs = p_pos.x + ((p_item->disable_folding || hide_folding) ? cache.hseparation : cache.item_margin); Point2i root_pos = Point2i(root_ofs, children_pos.y + label_h / 2) - cache.offset + p_draw_ofs; - if (c->get_children() != NULL) + if (c->get_children() != nullptr) { root_pos -= Point2i(cache.arrow->get_width(), 0); + } float line_width = 1.0; #ifdef TOOLS_ENABLED @@ -1509,8 +1433,8 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 Point2i parent_pos = Point2i(parent_ofs - cache.arrow->get_width() / 2, p_pos.y + label_h / 2 + cache.arrow->get_height() / 2) - cache.offset + p_draw_ofs; if (root_pos.y + line_width >= 0) { - VisualServer::get_singleton()->canvas_item_add_line(ci, root_pos, Point2i(parent_pos.x - Math::floor(line_width / 2), root_pos.y), cache.relationship_line_color, line_width); - VisualServer::get_singleton()->canvas_item_add_line(ci, Point2i(parent_pos.x, root_pos.y), Point2i(parent_pos.x, prev_ofs), cache.relationship_line_color, line_width); + RenderingServer::get_singleton()->canvas_item_add_line(ci, root_pos, Point2i(parent_pos.x - Math::floor(line_width / 2), root_pos.y), cache.relationship_line_color, line_width); + RenderingServer::get_singleton()->canvas_item_add_line(ci, Point2i(parent_pos.x, root_pos.y), Point2i(parent_pos.x, prev_ofs), cache.relationship_line_color, line_width); } if (htotal < 0) { @@ -1543,11 +1467,11 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } int Tree::_count_selected_items(TreeItem *p_from) const { - int count = 0; for (int i = 0; i < columns.size(); i++) { - if (p_from->is_selected(i)) + if (p_from->is_selected(i)) { count++; + } } if (p_from->get_children()) { @@ -1560,8 +1484,8 @@ int Tree::_count_selected_items(TreeItem *p_from) const { return count; } -void Tree::select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_col, TreeItem *p_prev, bool *r_in_range, bool p_force_deselect) { +void Tree::select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_col, TreeItem *p_prev, bool *r_in_range, bool p_force_deselect) { TreeItem::Cell &selected_cell = p_selected->cells.write[p_col]; bool switched = false; @@ -1573,14 +1497,13 @@ void Tree::select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_c bool emitted_row = false; for (int i = 0; i < columns.size(); i++) { - TreeItem::Cell &c = p_current->cells.write[i]; - if (!c.selectable) + if (!c.selectable) { continue; + } if (select_mode == SELECT_ROW) { - if (p_selected == p_current && (!c.selected || allow_reselect)) { c.selected = true; selected_item = p_selected; @@ -1595,45 +1518,40 @@ void Tree::select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_c */ } else if (c.selected) { - c.selected = false; //p_current->deselected_signal.call(p_col); } } else if (select_mode == SELECT_SINGLE || select_mode == SELECT_MULTI) { - if (!r_in_range && &selected_cell == &c) { - if (!selected_cell.selected || allow_reselect) { - selected_cell.selected = true; selected_item = p_selected; selected_col = i; emit_signal("cell_selected"); - if (select_mode == SELECT_MULTI) + if (select_mode == SELECT_MULTI) { emit_signal("multi_selected", p_current, i, true); - else if (select_mode == SELECT_SINGLE) + } else if (select_mode == SELECT_SINGLE) { emit_signal("item_selected"); + } } else if (select_mode == SELECT_MULTI && (selected_item != p_selected || selected_col != i)) { - selected_item = p_selected; selected_col = i; emit_signal("cell_selected"); } } else { - if (r_in_range && *r_in_range && !p_force_deselect) { - if (!c.selected && c.selectable) { c.selected = true; emit_signal("multi_selected", p_current, i, true); } } else if (!r_in_range || p_force_deselect) { - if (select_mode == SELECT_MULTI && c.selected) + if (select_mode == SELECT_MULTI && c.selected) { emit_signal("multi_selected", p_current, i, false); + } c.selected = false; } //p_current->deselected_signal.call(p_col); @@ -1648,21 +1566,17 @@ void Tree::select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_c TreeItem *c = p_current->children; while (c) { - select_single_item(p_selected, c, p_col, p_prev, r_in_range, p_current->is_collapsed() || p_force_deselect); c = c->next; } } Rect2 Tree::search_item_rect(TreeItem *p_from, TreeItem *p_item) { - return Rect2(); } void Tree::_range_click_timeout() { - - if (range_item_last && !range_drag_enabled && InputFilter::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { - + if (range_item_last && !range_drag_enabled && Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { Point2 pos = get_local_mouse_position() - cache.bg->get_offset(); if (show_column_titles) { pos.y -= _get_title_button_height(); @@ -1689,8 +1603,9 @@ void Tree::_range_click_timeout() { range_click_timer->start(); } - if (!click_handled) + if (!click_handled) { range_click_timer->stop(); + } if (propagate_mouse_activated) { emit_signal("item_activated"); @@ -1703,7 +1618,6 @@ void Tree::_range_click_timeout() { } int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool p_doubleclick, TreeItem *p_item, int p_button, const Ref<InputEventWithModifiers> &p_mod) { - int item_h = compute_item_height(p_item) + cache.vseparation; bool skip = (p_item == root && hide_root); @@ -1716,9 +1630,9 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool } if (!p_item->disable_folding && !hide_folding && (p_pos.x >= x_ofs && p_pos.x < (x_ofs + cache.item_margin))) { - - if (p_item->children) + if (p_item->children) { p_item->set_collapsed(!p_item->is_collapsed()); + } return -1; //handled! } @@ -1729,11 +1643,9 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool int col_ofs = 0; int col_width = 0; for (int i = 0; i < columns.size(); i++) { - col_width = get_column_width(i); if (p_item->cells[i].expand_right) { - int plus = 1; while (i + plus < columns.size() && !p_item->cells[i + plus].editable && p_item->cells[i + plus].mode == TreeItem::CELL_MODE_STRING && p_item->cells[i + plus].text == "" && p_item->cells[i + plus].icon.is_null()) { col_width += cache.hseparation; @@ -1752,16 +1664,15 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool break; } - if (col == -1) + if (col == -1) { return -1; - else if (col == 0) { + } else if (col == 0) { int margin = x_ofs + cache.item_margin; //-cache.hseparation; //int lm = cache.bg->get_margin(MARGIN_LEFT); col_width -= margin; col_ofs += margin; x -= margin; } else { - col_width -= cache.hseparation; x -= cache.hseparation; } @@ -1812,9 +1723,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool } if (select_mode == SELECT_MULTI && p_mod->get_command() && c.selectable) { - if (!c.selected || p_button == BUTTON_RIGHT) { - p_item->select(col); emit_signal("multi_selected", p_item, col, true); if (p_button == BUTTON_RIGHT) { @@ -1823,18 +1732,14 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool //p_item->selected_signal.call(col); } else { - p_item->deselect(col); emit_signal("multi_selected", p_item, col, false); //p_item->deselected_signal.call(col); } } else { - if (c.selectable) { - if (select_mode == SELECT_MULTI && p_mod->get_shift() && selected_item && selected_item != p_item) { - bool inrange = false; select_single_item(p_item, root, col, selected_item, &inrange); @@ -1842,14 +1747,12 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool emit_signal("item_rmb_selected", get_local_mouse_position()); } } else { - int icount = _count_selected_items(root); if (select_mode == SELECT_MULTI && icount > 1 && p_button != BUTTON_RIGHT) { single_select_defer = p_item; single_select_defer_column = col; } else { - if (p_button != BUTTON_RIGHT || !c.selected) { select_single_item(p_item, root, col); } @@ -1870,8 +1773,9 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool } } - if (!c.editable) + if (!c.editable) { return -1; // if cell is not editable, don't bother + } /* editing */ @@ -1879,7 +1783,6 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool String editor_text = c.text; switch (c.mode) { - case TreeItem::CELL_MODE_STRING: { //nothing in particular @@ -1889,7 +1792,6 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool } break; case TreeItem::CELL_MODE_CHECK: { - bring_up_editor = false; //checkboxes are not edited with editor if (force_edit_checkbox_only_on_checkbox) { if (x < cache.checked->get_width()) { @@ -1910,7 +1812,6 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool popup_menu->clear(); for (int i = 0; i < c.text.get_slice_count(","); i++) { - String s = c.text.get_slicec(',', i); popup_menu->add_item(s.get_slicec(':', 0), s.get_slicec(':', 1).empty() ? i : s.get_slicec(':', 1).to_int()); } @@ -1923,16 +1824,12 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool //} bring_up_editor = false; } else { - if (x >= (col_width - item_h / 2)) { - /* touching the combo */ bool up = p_pos.y < (item_h / 2); if (p_button == BUTTON_LEFT) { - if (range_click_timer->get_time_left() == 0) { - range_item_last = p_item; range_up_last = up; @@ -1941,7 +1838,6 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool range_click_timer->start(); } else if (up != range_up_last) { - return -1; // break. avoid changing direction on mouse held } @@ -1950,15 +1846,12 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool item_edited(col, p_item); } else if (p_button == BUTTON_RIGHT) { - p_item->set_range(col, (up ? c.max : c.min)); item_edited(col, p_item); } else if (p_button == BUTTON_WHEEL_UP) { - p_item->set_range(col, c.val + c.step); item_edited(col, p_item); } else if (p_button == BUTTON_WHEEL_DOWN) { - p_item->set_range(col, c.val - c.step); item_edited(col, p_item); } @@ -1967,10 +1860,10 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool bring_up_editor = false; } else { - editor_text = String::num(p_item->cells[col].val, Math::range_step_decimals(p_item->cells[col].step)); - if (select_mode == SELECT_MULTI && get_tree()->get_event_count() == focus_in_id) + if (select_mode == SELECT_MULTI && get_tree()->get_event_count() == focus_in_id) { bring_up_editor = false; + } } } click_handled = true; @@ -1998,8 +1891,9 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool } break; }; - if (!bring_up_editor || p_button != BUTTON_LEFT) + if (!bring_up_editor || p_button != BUTTON_LEFT) { return -1; + } click_handled = true; popup_edited_item = p_item; @@ -2011,7 +1905,6 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool return -1; //select } else { - Point2i new_pos = p_pos; if (!skip) { @@ -2026,11 +1919,11 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool TreeItem *c = p_item->children; while (c) { - int child_h = propagate_mouse_event(new_pos, x_ofs, y_ofs, p_doubleclick, c, p_button, p_mod); - if (child_h < 0) + if (child_h < 0) { return -1; // break, stop propagating, no need to anymore + } new_pos.y -= child_h; y_ofs += child_h; @@ -2047,47 +1940,46 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool } void Tree::_text_editor_modal_close() { - - if (InputFilter::get_singleton()->is_key_pressed(KEY_ESCAPE) || - InputFilter::get_singleton()->is_key_pressed(KEY_KP_ENTER) || - InputFilter::get_singleton()->is_key_pressed(KEY_ENTER)) { - + if (Input::get_singleton()->is_key_pressed(KEY_ESCAPE) || + Input::get_singleton()->is_key_pressed(KEY_KP_ENTER) || + Input::get_singleton()->is_key_pressed(KEY_ENTER)) { return; } - if (value_editor->has_point(value_editor->get_local_mouse_position())) + if (value_editor->has_point(value_editor->get_local_mouse_position())) { return; + } _text_editor_enter(text_editor->get_text()); } void Tree::_text_editor_enter(String p_text) { - popup_editor->hide(); - if (!popup_edited_item) + if (!popup_edited_item) { return; + } - if (popup_edited_item_col < 0 || popup_edited_item_col > columns.size()) + if (popup_edited_item_col < 0 || popup_edited_item_col > columns.size()) { return; + } TreeItem::Cell &c = popup_edited_item->cells.write[popup_edited_item_col]; switch (c.mode) { - case TreeItem::CELL_MODE_STRING: { - c.text = p_text; //popup_edited_item->edited_signal.call( popup_edited_item_col ); } break; case TreeItem::CELL_MODE_RANGE: { - c.val = p_text.to_double(); - if (c.step > 0) + if (c.step > 0) { c.val = Math::stepify(c.val, c.step); - if (c.val < c.min) + } + if (c.val < c.min) { c.val = c.min; - else if (c.val > c.max) + } else if (c.val > c.max) { c.val = c.max; + } //popup_edited_item->edited_signal.call( popup_edited_item_col ); } break; @@ -2101,7 +1993,6 @@ void Tree::_text_editor_enter(String p_text) { } void Tree::value_editor_changed(double p_value) { - if (updating_value_editor) { return; } @@ -2116,12 +2007,13 @@ void Tree::value_editor_changed(double p_value) { } void Tree::popup_select(int p_option) { - - if (!popup_edited_item) + if (!popup_edited_item) { return; + } - if (popup_edited_item_col < 0 || popup_edited_item_col > columns.size()) + if (popup_edited_item_col < 0 || popup_edited_item_col > columns.size()) { return; + } popup_edited_item->cells.write[popup_edited_item_col].val = p_option; //popup_edited_item->edited_signal.call( popup_edited_item_col ); @@ -2131,7 +2023,7 @@ void Tree::popup_select(int p_option) { void Tree::_go_left() { if (selected_col == 0) { - if (selected_item->get_children() != NULL && !selected_item->is_collapsed()) { + if (selected_item->get_children() != nullptr && !selected_item->is_collapsed()) { selected_item->set_collapsed(true); } else { if (columns.size() == 1) { // goto parent with one column @@ -2149,7 +2041,6 @@ void Tree::_go_left() { selected_col--; emit_signal("cell_selected"); } else { - selected_item->select(selected_col - 1); } } @@ -2160,7 +2051,7 @@ void Tree::_go_left() { void Tree::_go_right() { if (selected_col == (columns.size() - 1)) { - if (selected_item->get_children() != NULL && selected_item->is_collapsed()) { + if (selected_item->get_children() != nullptr && selected_item->is_collapsed()) { selected_item->set_collapsed(false); } else if (selected_item->get_next_visible()) { selected_col = 0; @@ -2171,7 +2062,6 @@ void Tree::_go_right() { selected_col++; emit_signal("cell_selected"); } else { - selected_item->select(selected_col + 1); } } @@ -2181,12 +2071,11 @@ void Tree::_go_right() { } void Tree::_go_up() { - TreeItem *prev = NULL; + TreeItem *prev = nullptr; if (!selected_item) { prev = get_last_item(); selected_col = 0; } else { - prev = selected_item->get_prev_visible(); if (last_keypress != 0) { //incr search next @@ -2200,19 +2089,20 @@ void Tree::_go_up() { } if (select_mode == SELECT_MULTI) { - - if (!prev) + if (!prev) { return; + } selected_item = prev; emit_signal("cell_selected"); update(); } else { - int col = selected_col < 0 ? 0 : selected_col; - while (prev && !prev->cells[col].selectable) + while (prev && !prev->cells[col].selectable) { prev = prev->get_prev_visible(); - if (!prev) + } + if (!prev) { return; // do nothing.. + } prev->select(col); } @@ -2221,14 +2111,12 @@ void Tree::_go_up() { } void Tree::_go_down() { - TreeItem *next = NULL; + TreeItem *next = nullptr; if (!selected_item) { - if (root) { next = hide_root ? root->get_next_visible() : root; } } else { - next = selected_item->get_next_visible(); if (last_keypress != 0) { @@ -2243,7 +2131,6 @@ void Tree::_go_down() { } if (select_mode == SELECT_MULTI) { - if (!next) { return; } @@ -2252,11 +2139,11 @@ void Tree::_go_down() { emit_signal("cell_selected"); update(); } else { - int col = selected_col < 0 ? 0 : selected_col; - while (next && !next->cells[col].selectable) + while (next && !next->cells[col].selectable) { next = next->get_next_visible(); + } if (!next) { return; // do nothing.. } @@ -2268,13 +2155,13 @@ void Tree::_go_down() { } void Tree::_gui_input(Ref<InputEvent> p_event) { - Ref<InputEventKey> k = p_event; bool is_command = k.is_valid() && k->get_command(); if (p_event->is_action("ui_right") && p_event->is_pressed()) { - - if (!cursor_can_exit_tree) accept_event(); + if (!cursor_can_exit_tree) { + accept_event(); + } if (!selected_item || select_mode == SELECT_ROW || selected_col > (columns.size() - 1)) { return; @@ -2290,8 +2177,9 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { _go_right(); } } else if (p_event->is_action("ui_left") && p_event->is_pressed()) { - - if (!cursor_can_exit_tree) accept_event(); + if (!cursor_can_exit_tree) { + accept_event(); + } if (!selected_item || select_mode == SELECT_ROW || selected_col < 0) { return; @@ -2309,48 +2197,50 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } } else if (p_event->is_action("ui_up") && p_event->is_pressed() && !is_command) { - - if (!cursor_can_exit_tree) accept_event(); + if (!cursor_can_exit_tree) { + accept_event(); + } _go_up(); } else if (p_event->is_action("ui_down") && p_event->is_pressed() && !is_command) { - - if (!cursor_can_exit_tree) accept_event(); + if (!cursor_can_exit_tree) { + accept_event(); + } _go_down(); } else if (p_event->is_action("ui_page_down") && p_event->is_pressed()) { + if (!cursor_can_exit_tree) { + accept_event(); + } - if (!cursor_can_exit_tree) accept_event(); - - TreeItem *next = NULL; - if (!selected_item) + TreeItem *next = nullptr; + if (!selected_item) { return; + } next = selected_item; for (int i = 0; i < 10; i++) { - TreeItem *_n = next->get_next_visible(); if (_n) { next = _n; } else { - break; } } - if (next == selected_item) + if (next == selected_item) { return; + } if (select_mode == SELECT_MULTI) { - selected_item = next; emit_signal("cell_selected"); update(); } else { - - while (next && !next->cells[selected_col].selectable) + while (next && !next->cells[selected_col].selectable) { next = next->get_next_visible(); + } if (!next) { return; // do nothing.. } @@ -2359,36 +2249,36 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { ensure_cursor_is_visible(); } else if (p_event->is_action("ui_page_up") && p_event->is_pressed()) { + if (!cursor_can_exit_tree) { + accept_event(); + } - if (!cursor_can_exit_tree) accept_event(); - - TreeItem *prev = NULL; - if (!selected_item) + TreeItem *prev = nullptr; + if (!selected_item) { return; + } prev = selected_item; for (int i = 0; i < 10; i++) { - TreeItem *_n = prev->get_prev_visible(); if (_n) { prev = _n; } else { - break; } } - if (prev == selected_item) + if (prev == selected_item) { return; + } if (select_mode == SELECT_MULTI) { - selected_item = prev; emit_signal("cell_selected"); update(); } else { - - while (prev && !prev->cells[selected_col].selectable) + while (prev && !prev->cells[selected_col].selectable) { prev = prev->get_prev_visible(); + } if (!prev) { return; // do nothing.. } @@ -2396,7 +2286,6 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } ensure_cursor_is_visible(); } else if (p_event->is_action("ui_accept") && p_event->is_pressed()) { - if (selected_item) { //bring up editor if possible if (!edit_selected()) { @@ -2406,10 +2295,10 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } accept_event(); } else if (p_event->is_action("ui_select") && p_event->is_pressed()) { - if (select_mode == SELECT_MULTI) { - if (!selected_item) + if (!selected_item) { return; + } if (selected_item->is_selected(selected_col)) { selected_item->deselect(selected_col); emit_signal("multi_selected", selected_item, selected_col, false); @@ -2423,34 +2312,38 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { if (k.is_valid()) { // Incremental search - if (!k->is_pressed()) + if (!k->is_pressed()) { return; - if (k->get_command() || (k->get_shift() && k->get_unicode() == 0) || k->get_metakey()) + } + if (k->get_command() || (k->get_shift() && k->get_unicode() == 0) || k->get_metakey()) { return; - if (!root) + } + if (!root) { return; + } - if (hide_root && !root->get_next_visible()) + if (hide_root && !root->get_next_visible()) { return; + } if (k->get_unicode() > 0) { - _do_incr_search(String::chr(k->get_unicode())); accept_event(); return; } else { - if (k->get_keycode() != KEY_SHIFT) + if (k->get_keycode() != KEY_SHIFT) { last_keypress = 0; + } } } Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { - - if (cache.font.is_null()) // avoid a strange case that may corrupt stuff + if (cache.font.is_null()) { // avoid a strange case that may corrupt stuff update_cache(); + } Ref<StyleBox> bg = cache.bg; @@ -2467,13 +2360,10 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { pos.x += cache.offset.x; int len = 0; for (int i = 0; i < columns.size(); i++) { - len += get_column_width(i); if (pos.x < len) { - cache.hover_type = Cache::CLICK_TITLE; cache.hover_index = i; - update(); break; } } @@ -2481,16 +2371,19 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } if (root) { - Point2 mpos = mm->get_position(); mpos -= cache.bg->get_offset(); mpos.y -= _get_title_button_height(); if (mpos.y >= 0) { - - if (h_scroll->is_visible_in_tree()) + if (h_scroll->is_visible_in_tree()) { mpos.x += h_scroll->get_value(); - if (v_scroll->is_visible_in_tree()) + } + if (v_scroll->is_visible_in_tree()) { mpos.y += v_scroll->get_value(); + } + + TreeItem *old_it = cache.hover_item; + int old_col = cache.hover_cell; int col, h, section; TreeItem *it = _find_item_at_pos(root, mpos, col, h, section); @@ -2506,18 +2399,21 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } } - if (it != cache.hover_item) { - cache.hover_item = it; - update(); - } + cache.hover_item = it; + cache.hover_cell = col; - if (it && col != cache.hover_cell) { - cache.hover_cell = col; - update(); + if (it != old_it || col != old_col) { + // Only need to update if mouse enters/exits a button + bool was_over_button = old_it && old_it->cells[old_col].custom_button; + bool is_over_button = it && it->cells[col].custom_button; + if (was_over_button || is_over_button) { + update(); + } } } } + // Update if mouse enters/exits columns if (cache.hover_type != old_hover || cache.hover_index != old_index) { update(); } @@ -2526,16 +2422,14 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { //range drag if (!range_drag_enabled) { - Vector2 cpos = mm->get_position(); if (cpos.distance_to(pressing_pos) > 2) { range_drag_enabled = true; range_drag_capture_pos = cpos; range_drag_base = popup_edited_item->get_range(popup_edited_item_col); - InputFilter::get_singleton()->set_mouse_mode(InputFilter::MOUSE_MODE_CAPTURED); + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED); } } else { - const TreeItem::Cell &c = popup_edited_item->cells[popup_edited_item_col]; float diff_y = -mm->get_relative().y; diff_y = Math::pow(ABS(diff_y), 1.8f) * SGN(diff_y); @@ -2547,7 +2441,6 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } if (drag_touching && !drag_touching_deaccel) { - drag_accum -= mm->get_relative().y; v_scroll->set_value(drag_from + drag_accum); drag_speed = -mm->get_speed().y; @@ -2557,13 +2450,12 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { Ref<InputEventMouseButton> b = p_event; if (b.is_valid()) { - if (cache.font.is_null()) // avoid a strange case that may corrupt stuff + if (cache.font.is_null()) { // avoid a strange case that may corrupt stuff update_cache(); + } if (!b->is_pressed()) { - if (b->get_button_index() == BUTTON_LEFT) { - Point2 pos = b->get_position() - cache.bg->get_offset(); if (show_column_titles) { pos.y -= _get_title_button_height(); @@ -2572,7 +2464,6 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { pos.x += cache.offset.x; int len = 0; for (int i = 0; i < columns.size(); i++) { - len += get_column_width(i); if (pos.x < len) { emit_signal("column_title_pressed", i); @@ -2584,17 +2475,15 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { if (single_select_defer) { select_single_item(single_select_defer, root, single_select_defer_column); - single_select_defer = NULL; + single_select_defer = nullptr; } range_click_timer->stop(); if (pressing_for_editor) { - if (range_drag_enabled) { - range_drag_enabled = false; - InputFilter::get_singleton()->set_mouse_mode(InputFilter::MOUSE_MODE_VISIBLE); + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE); warp_mouse(range_drag_capture_pos); } else { Rect2 rect = get_selected()->get_meta("__focus_rect"); @@ -2609,7 +2498,7 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { pressing_for_editor = false; } - if (cache.click_type == Cache::CLICK_BUTTON && cache.click_item != NULL) { + if (cache.click_type == Cache::CLICK_BUTTON && cache.click_item != nullptr) { // make sure in case of wrong reference after reconstructing whole TreeItems cache.click_item = get_item_at_position(cache.click_pos); emit_signal("button_pressed", cache.click_item, cache.click_column, cache.click_id); @@ -2617,17 +2506,15 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { cache.click_type = Cache::CLICK_NONE; cache.click_index = -1; cache.click_id = -1; - cache.click_item = NULL; + cache.click_item = nullptr; cache.click_column = 0; if (drag_touching) { - if (drag_speed == 0) { drag_touching_deaccel = false; drag_touching = false; set_physics_process_internal(false); } else { - drag_touching_deaccel = true; } } @@ -2636,8 +2523,9 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { return; } - if (range_drag_enabled) + if (range_drag_enabled) { return; + } switch (b->get_button_index()) { case BUTTON_RIGHT: @@ -2654,10 +2542,8 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { pos.x += cache.offset.x; int len = 0; for (int i = 0; i < columns.size(); i++) { - len += get_column_width(i); if (pos.x < len) { - cache.click_type = Cache::CLICK_TITLE; cache.click_index = i; //cache.click_id=; @@ -2688,8 +2574,9 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { pressing_pos = b->get_position(); } - if (b->get_button_index() == BUTTON_RIGHT) + if (b->get_button_index() == BUTTON_RIGHT) { break; + } if (drag_touching) { set_physics_process_internal(false); @@ -2711,8 +2598,9 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } if (b->get_button_index() == BUTTON_LEFT) { - if (get_item_at_position(b->get_position()) == NULL && !b->get_shift() && !b->get_control() && !b->get_command()) + if (get_item_at_position(b->get_position()) == nullptr && !b->get_shift() && !b->get_control() && !b->get_command()) { emit_signal("nothing_selected"); + } } } @@ -2723,7 +2611,6 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } break; case BUTTON_WHEEL_UP: { - double prev_value = v_scroll->get_value(); v_scroll->set_value(v_scroll->get_value() - v_scroll->get_page() * b->get_factor() / 8); if (v_scroll->get_value() != prev_value) { @@ -2732,7 +2619,6 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } break; case BUTTON_WHEEL_DOWN: { - double prev_value = v_scroll->get_value(); v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() * b->get_factor() / 8); if (v_scroll->get_value() != prev_value) { @@ -2745,7 +2631,6 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { Ref<InputEventPanGesture> pan_gesture = p_event; if (pan_gesture.is_valid()) { - double prev_v = v_scroll->get_value(); v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() * pan_gesture->get_delta().y / 8); @@ -2759,15 +2644,15 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } bool Tree::edit_selected() { - TreeItem *s = get_selected(); ERR_FAIL_COND_V_MSG(!s, false, "No item selected."); ensure_cursor_is_visible(); int col = get_selected_column(); ERR_FAIL_INDEX_V_MSG(col, columns.size(), false, "No item column selected."); - if (!s->cells[col].editable) + if (!s->cells[col].editable) { return false; + } Rect2 rect = s->get_meta("__focus_rect"); popup_edited_item = s; @@ -2776,12 +2661,10 @@ bool Tree::edit_selected() { const TreeItem::Cell &c = s->cells[col]; if (c.mode == TreeItem::CELL_MODE_CHECK) { - s->set_checked(col, !c.checked); item_edited(col, s); return true; } else if (c.mode == TreeItem::CELL_MODE_CUSTOM) { - edited_item = s; edited_col = col; custom_popup_rect = Rect2i(get_global_position() + rect.position, rect.size); @@ -2790,10 +2673,8 @@ bool Tree::edit_selected() { return true; } else if (c.mode == TreeItem::CELL_MODE_RANGE && c.text != "") { - popup_menu->clear(); for (int i = 0; i < c.text.get_slice_count(","); i++) { - String s2 = c.text.get_slicec(',', i); popup_menu->add_item(s2.get_slicec(':', 0), s2.get_slicec(':', 1).empty() ? i : s2.get_slicec(':', 1).to_int()); } @@ -2806,7 +2687,6 @@ bool Tree::edit_selected() { return true; } else if (c.mode == TreeItem::CELL_MODE_STRING || c.mode == TreeItem::CELL_MODE_RANGE) { - Rect2 popup_rect; Vector2 ofs(0, (text_editor->get_size().height - rect.size.height) / 2); @@ -2820,7 +2700,6 @@ bool Tree::edit_selected() { text_editor->select_all(); if (c.mode == TreeItem::CELL_MODE_RANGE) { - popup_rect.size.y += value_editor->get_minimum_size().height; value_editor->show(); @@ -2849,12 +2728,11 @@ bool Tree::edit_selected() { } Size2 Tree::get_internal_min_size() const { - Size2i size = cache.bg->get_offset(); - if (root) + if (root) { size.height += get_item_height(root); + } for (int i = 0; i < columns.size(); i++) { - size.width += columns[i].min_width; } @@ -2862,13 +2740,11 @@ Size2 Tree::get_internal_min_size() const { } void Tree::update_scrollbars() { - Size2 size = get_size(); int tbh; if (show_column_titles) { tbh = _get_title_button_height(); } else { - tbh = 0; } @@ -2884,11 +2760,9 @@ void Tree::update_scrollbars() { Size2 min = get_internal_min_size(); if (min.height < size.height - hmin.height) { - v_scroll->hide(); cache.offset.y = 0; } else { - v_scroll->show(); v_scroll->set_max(min.height); v_scroll->set_page(size.height - hmin.height - tbh); @@ -2896,11 +2770,9 @@ void Tree::update_scrollbars() { } if (min.width < size.width - vmin.width) { - h_scroll->hide(); cache.offset.x = 0; } else { - h_scroll->show(); h_scroll->set_max(min.width); h_scroll->set_page(size.width - vmin.width); @@ -2909,19 +2781,15 @@ void Tree::update_scrollbars() { } int Tree::_get_title_button_height() const { - ERR_FAIL_COND_V(cache.font.is_null() || cache.title_button.is_null(), 0); return show_column_titles ? cache.font->get_height() + cache.title_button->get_minimum_size().height : 0; } void Tree::_notification(int p_what) { - if (p_what == NOTIFICATION_FOCUS_ENTER) { - focus_in_id = get_tree()->get_event_count(); } if (p_what == NOTIFICATION_MOUSE_EXIT) { - if (cache.hover_type != Cache::CLICK_NONE) { cache.hover_type = Cache::CLICK_NONE; update(); @@ -2929,35 +2797,28 @@ void Tree::_notification(int p_what) { } if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - drag_touching = false; } if (p_what == NOTIFICATION_ENTER_TREE) { - update_cache(); } if (p_what == NOTIFICATION_DRAG_END) { - drop_mode_flags = 0; scrolling = false; set_physics_process_internal(false); update(); } if (p_what == NOTIFICATION_DRAG_BEGIN) { - - single_select_defer = NULL; + single_select_defer = nullptr; if (cache.scroll_speed > 0) { scrolling = true; set_physics_process_internal(true); } } if (p_what == NOTIFICATION_INTERNAL_PHYSICS_PROCESS) { - if (drag_touching) { - if (drag_touching_deaccel) { - float pos = v_scroll->get_value(); pos += drag_speed * get_physics_process_delta_time(); @@ -3016,7 +2877,6 @@ void Tree::_notification(int p_what) { } if (p_what == NOTIFICATION_DRAW) { - update_cache(); update_scrollbars(); RID ci = get_canvas_item(); @@ -3030,9 +2890,9 @@ void Tree::_notification(int p_what) { bg->draw(ci, Rect2(Point2(), get_size())); if (has_focus()) { - VisualServer::get_singleton()->canvas_item_add_clip_ignore(ci, true); + RenderingServer::get_singleton()->canvas_item_add_clip_ignore(ci, true); bg_focus->draw(ci, Rect2(Point2(), get_size())); - VisualServer::get_singleton()->canvas_item_add_clip_ignore(ci, false); + RenderingServer::get_singleton()->canvas_item_add_clip_ignore(ci, false); } int tbh = _get_title_button_height(); @@ -3041,23 +2901,13 @@ void Tree::_notification(int p_what) { draw_size.y -= tbh; if (root) { - draw_item(Point2(), draw_ofs, draw_size, root); } - int ofs = 0; - - for (int i = 0; i < (columns.size() - 1 - 1); i++) { - - ofs += get_column_width(i); - } - if (show_column_titles) { - //title buttons int ofs2 = cache.bg->get_margin(MARGIN_LEFT); for (int i = 0; i < columns.size(); i++) { - Ref<StyleBox> sb = (cache.click_type == Cache::CLICK_TITLE && cache.click_index == i) ? cache.title_button_pressed : ((cache.hover_type == Cache::CLICK_TITLE && cache.hover_index == i) ? cache.title_button_hover : cache.title_button); Ref<Font> f = cache.tb_font; Rect2 tbrect = Rect2(ofs2 - cache.offset.x, bg->get_margin(MARGIN_TOP), get_column_width(i), tbh); @@ -3075,8 +2925,7 @@ void Tree::_notification(int p_what) { } if (p_what == NOTIFICATION_RESIZED || p_what == NOTIFICATION_TRANSFORM_CHANGED) { - - if (popup_edited_item != NULL) { + if (popup_edited_item != nullptr) { Rect2 rect = popup_edited_item->get_meta("__focus_rect"); Vector2 ofs(0, (text_editor->get_size().height - rect.size.height) / 2); Point2i textedpos = get_global_position() + rect.position - ofs; @@ -3091,24 +2940,21 @@ void Tree::_notification(int p_what) { } Size2 Tree::get_minimum_size() const { - return Size2(1, 1); } TreeItem *Tree::create_item(TreeItem *p_parent, int p_idx) { + ERR_FAIL_COND_V(blocked > 0, nullptr); - ERR_FAIL_COND_V(blocked > 0, NULL); - - TreeItem *ti = NULL; + TreeItem *ti = nullptr; if (p_parent) { - // Append or insert a new item to the given parent. ti = memnew(TreeItem(this)); - ERR_FAIL_COND_V(!ti, NULL); + ERR_FAIL_COND_V(!ti, nullptr); ti->cells.resize(columns.size()); - TreeItem *prev = NULL; + TreeItem *prev = nullptr; TreeItem *c = p_parent->children; int idx = 0; @@ -3121,18 +2967,18 @@ TreeItem *Tree::create_item(TreeItem *p_parent, int p_idx) { c = c->next; } - if (prev) + if (prev) { prev->next = ti; - else + } else { p_parent->children = ti; + } ti->parent = p_parent; } else { - if (!root) { // No root exists, make the given item the new root. ti = memnew(TreeItem(this)); - ERR_FAIL_COND_V(!ti, NULL); + ERR_FAIL_COND_V(!ti, nullptr); ti->cells.resize(columns.size()); root = ti; @@ -3146,61 +2992,56 @@ TreeItem *Tree::create_item(TreeItem *p_parent, int p_idx) { } TreeItem *Tree::get_root() { - return root; } -TreeItem *Tree::get_last_item() { +TreeItem *Tree::get_last_item() { TreeItem *last = root; while (last) { - - if (last->next) + if (last->next) { last = last->next; - else if (last->children) + } else if (last->children) { last = last->children; - else + } else { break; + } } return last; } void Tree::item_edited(int p_column, TreeItem *p_item, bool p_lmb) { - edited_item = p_item; edited_col = p_column; - if (p_lmb) + if (p_lmb) { emit_signal("item_edited"); - else + } else { emit_signal("item_rmb_edited"); + } } void Tree::item_changed(int p_column, TreeItem *p_item) { - update(); } void Tree::item_selected(int p_column, TreeItem *p_item) { - if (select_mode == SELECT_MULTI) { - - if (!p_item->cells[p_column].selectable) + if (!p_item->cells[p_column].selectable) { return; + } p_item->cells.write[p_column].selected = true; //emit_signal("multi_selected",p_item,p_column,true); - NO this is for TreeItem::select selected_col = p_column; } else { - select_single_item(p_item, root, p_column); } update(); } void Tree::item_deselected(int p_column, TreeItem *p_item) { - if (select_mode == SELECT_MULTI || select_mode == SELECT_SINGLE) { p_item->cells.write[p_column].selected = false; } @@ -3208,17 +3049,14 @@ void Tree::item_deselected(int p_column, TreeItem *p_item) { } void Tree::set_select_mode(SelectMode p_mode) { - select_mode = p_mode; } Tree::SelectMode Tree::get_select_mode() const { - return select_mode; } void Tree::deselect_all() { - TreeItem *item = get_next_selected(get_root()); while (item) { item->deselect(selected_col); @@ -3227,25 +3065,23 @@ void Tree::deselect_all() { ERR_FAIL_COND(item == prev_item); } - selected_item = NULL; + selected_item = nullptr; selected_col = -1; update(); } bool Tree::is_anything_selected() { - - return (selected_item != NULL); + return (selected_item != nullptr); } void Tree::clear() { - ERR_FAIL_COND(blocked > 0); if (pressing_for_editor) { if (range_drag_enabled) { range_drag_enabled = false; - InputFilter::get_singleton()->set_mouse_mode(InputFilter::MOUSE_MODE_VISIBLE); + Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE); warp_mouse(range_drag_capture_pos); } pressing_for_editor = false; @@ -3253,38 +3089,36 @@ void Tree::clear() { if (root) { memdelete(root); - root = NULL; + root = nullptr; }; - selected_item = NULL; - edited_item = NULL; - popup_edited_item = NULL; + selected_item = nullptr; + edited_item = nullptr; + popup_edited_item = nullptr; update(); }; void Tree::set_hide_root(bool p_enabled) { - hide_root = p_enabled; update(); } bool Tree::is_root_hidden() const { - return hide_root; } void Tree::set_column_min_width(int p_column, int p_min_width) { - ERR_FAIL_INDEX(p_column, columns.size()); - if (p_min_width < 1) + if (p_min_width < 1) { return; + } columns.write[p_column].min_width = p_min_width; update(); } -void Tree::set_column_expand(int p_column, bool p_expand) { +void Tree::set_column_expand(int p_column, bool p_expand) { ERR_FAIL_INDEX(p_column, columns.size()); columns.write[p_column].expand = p_expand; @@ -3292,87 +3126,80 @@ void Tree::set_column_expand(int p_column, bool p_expand) { } TreeItem *Tree::get_selected() const { - return selected_item; } int Tree::get_selected_column() const { - return selected_col; } TreeItem *Tree::get_edited() const { - return edited_item; } int Tree::get_edited_column() const { - return edited_col; } TreeItem *Tree::get_next_selected(TreeItem *p_item) { - /* if (!p_item) - return NULL; + return nullptr; */ - if (!root) - return NULL; + if (!root) { + return nullptr; + } while (true) { - if (!p_item) { p_item = root; } else { - if (p_item->children) { - p_item = p_item->children; } else if (p_item->next) { - p_item = p_item->next; } else { - while (!p_item->next) { - p_item = p_item->parent; - if (p_item == NULL) - return NULL; + if (p_item == nullptr) { + return nullptr; + } } p_item = p_item->next; } } - for (int i = 0; i < columns.size(); i++) - if (p_item->cells[i].selected) + for (int i = 0; i < columns.size(); i++) { + if (p_item->cells[i].selected) { return p_item; + } + } } - return NULL; + return nullptr; } int Tree::get_column_width(int p_column) const { - ERR_FAIL_INDEX_V(p_column, columns.size(), -1); - if (!columns[p_column].expand) + if (!columns[p_column].expand) { return columns[p_column].min_width; + } Ref<StyleBox> bg = cache.bg; int expand_area = get_size().width - (bg->get_margin(MARGIN_LEFT) + bg->get_margin(MARGIN_RIGHT)); - if (v_scroll->is_visible_in_tree()) + if (v_scroll->is_visible_in_tree()) { expand_area -= v_scroll->get_combined_minimum_size().width; + } int expanding_columns = 0; int expanding_total = 0; for (int i = 0; i < columns.size(); i++) { - if (!columns[i].expand) { expand_area -= columns[i].min_width; } else { @@ -3381,8 +3208,9 @@ int Tree::get_column_width(int p_column) const { } } - if (expand_area < expanding_total) + if (expand_area < expanding_total) { return columns[p_column].min_width; + } ERR_FAIL_COND_V(expanding_columns == 0, -1); // shouldn't happen @@ -3390,56 +3218,52 @@ int Tree::get_column_width(int p_column) const { } void Tree::propagate_set_columns(TreeItem *p_item) { - p_item->cells.resize(columns.size()); TreeItem *c = p_item->get_children(); while (c) { - propagate_set_columns(c); c = c->get_next(); } } void Tree::set_columns(int p_columns) { - ERR_FAIL_COND(p_columns < 1); ERR_FAIL_COND(blocked > 0); columns.resize(p_columns); - if (root) + if (root) { propagate_set_columns(root); - if (selected_col >= p_columns) + } + if (selected_col >= p_columns) { selected_col = p_columns - 1; + } update(); } int Tree::get_columns() const { - return columns.size(); } void Tree::_scroll_moved(float) { - update(); } Rect2 Tree::get_custom_popup_rect() const { - return custom_popup_rect; } int Tree::get_item_offset(TreeItem *p_item) const { - TreeItem *it = root; int ofs = _get_title_button_height(); - if (!it) + if (!it) { return 0; + } while (true) { - - if (it == p_item) + if (it == p_item) { return ofs; + } ofs += compute_item_height(it); if (it != root || !hide_root) { @@ -3447,19 +3271,16 @@ int Tree::get_item_offset(TreeItem *p_item) const { } if (it->children && !it->collapsed) { - it = it->children; } else if (it->next) { - it = it->next; } else { - while (!it->next) { - it = it->parent; - if (it == NULL) + if (it == nullptr) { return 0; + } } it = it->next; @@ -3516,12 +3337,10 @@ void Tree::ensure_cursor_is_visible() { } int Tree::get_pressed_button() const { - return pressed_button; } Rect2 Tree::get_item_rect(TreeItem *p_item, int p_column) const { - ERR_FAIL_NULL_V(p_item, Rect2()); ERR_FAIL_COND_V(p_item->tree != this, Rect2()); if (p_column != -1) { @@ -3538,7 +3357,6 @@ Rect2 Tree::get_item_rect(TreeItem *p_item, int p_column) const { r.position.x = 0; r.size.x = get_size().width; } else { - int accum = 0; for (int i = 0; i < p_column; i++) { accum += get_column_width(i); @@ -3551,43 +3369,38 @@ Rect2 Tree::get_item_rect(TreeItem *p_item, int p_column) const { } void Tree::set_column_titles_visible(bool p_show) { - show_column_titles = p_show; update(); } bool Tree::are_column_titles_visible() const { - return show_column_titles; } void Tree::set_column_title(int p_column, const String &p_title) { - ERR_FAIL_INDEX(p_column, columns.size()); columns.write[p_column].title = p_title; update(); } String Tree::get_column_title(int p_column) const { - ERR_FAIL_INDEX_V(p_column, columns.size(), ""); return columns[p_column].title; } Point2 Tree::get_scroll() const { - Point2 ofs; - if (h_scroll->is_visible_in_tree()) + if (h_scroll->is_visible_in_tree()) { ofs.x = h_scroll->get_value(); - if (v_scroll->is_visible_in_tree()) + } + if (v_scroll->is_visible_in_tree()) { ofs.y = v_scroll->get_value(); + } return ofs; } void Tree::scroll_to_item(TreeItem *p_item) { - if (!is_visible_in_tree()) { - // hack to work around crash in get_item_rect() if Tree is not in tree. return; } @@ -3605,38 +3418,40 @@ void Tree::scroll_to_item(TreeItem *p_item) { } TreeItem *Tree::_search_item_text(TreeItem *p_at, const String &p_find, int *r_col, bool p_selectable, bool p_backwards) { - TreeItem *from = p_at; while (p_at) { - for (int i = 0; i < columns.size(); i++) { if (p_at->get_text(i).findn(p_find) == 0 && (!p_selectable || p_at->is_selectable(i))) { - if (r_col) + if (r_col) { *r_col = i; + } return p_at; } } - if (p_backwards) + if (p_backwards) { p_at = p_at->get_prev_visible(true); - else + } else { p_at = p_at->get_next_visible(true); + } - if ((p_at) == from) + if ((p_at) == from) { break; + } } - return NULL; + return nullptr; } TreeItem *Tree::search_item_text(const String &p_find, int *r_col, bool p_selectable) { - TreeItem *from = get_selected(); - if (!from) + if (!from) { from = root; - if (!from) - return NULL; + } + if (!from) { + return nullptr; + } return _search_item_text(from->get_next_visible(true), p_find, r_col, p_selectable); } @@ -3649,37 +3464,35 @@ TreeItem *Tree::get_item_with_text(const String &p_find) const { } } } - return NULL; + return nullptr; } void Tree::_do_incr_search(const String &p_add) { - uint64_t time = OS::get_singleton()->get_ticks_usec() / 1000; // convert to msec uint64_t diff = time - last_keypress; - if (diff > uint64_t(GLOBAL_DEF("gui/timers/incremental_search_max_interval_msec", 2000))) + if (diff > uint64_t(GLOBAL_DEF("gui/timers/incremental_search_max_interval_msec", 2000))) { incr_search = p_add; - else if (incr_search != p_add) + } else if (incr_search != p_add) { incr_search += p_add; + } last_keypress = time; int col; TreeItem *item = search_item_text(incr_search, &col, true); - if (!item) + if (!item) { return; + } item->select(col); ensure_cursor_is_visible(); } TreeItem *Tree::_find_item_at_pos(TreeItem *p_item, const Point2 &p_pos, int &r_column, int &h, int §ion) const { - Point2 pos = p_pos; if (root != p_item || !hide_root) { - h = compute_item_height(p_item) + cache.vseparation; if (pos.y < h) { - if (drop_mode_flags == DROP_MODE_ON_ITEM) { section = 0; } else if (drop_mode_flags == DROP_MODE_INBETWEEN) { @@ -3693,7 +3506,6 @@ TreeItem *Tree::_find_item_at_pos(TreeItem *p_item, const Point2 &p_pos, int &r_ } for (int i = 0; i < columns.size(); i++) { - int w = get_column_width(i); if (pos.x < w) { r_column = i; @@ -3703,48 +3515,48 @@ TreeItem *Tree::_find_item_at_pos(TreeItem *p_item, const Point2 &p_pos, int &r_ pos.x -= w; } - return NULL; + return nullptr; } else { - pos.y -= h; } } else { - h = 0; } - if (p_item->is_collapsed()) - return NULL; // do not try children, it's collapsed + if (p_item->is_collapsed()) { + return nullptr; // do not try children, it's collapsed + } TreeItem *n = p_item->get_children(); while (n) { - int ch; TreeItem *r = _find_item_at_pos(n, pos, r_column, ch, section); pos.y -= ch; h += ch; - if (r) + if (r) { return r; + } n = n->get_next(); } - return NULL; + return nullptr; } int Tree::get_column_at_position(const Point2 &p_pos) const { - if (root) { - Point2 pos = p_pos; pos -= cache.bg->get_offset(); pos.y -= _get_title_button_height(); - if (pos.y < 0) + if (pos.y < 0) { return -1; + } - if (h_scroll->is_visible_in_tree()) + if (h_scroll->is_visible_in_tree()) { pos.x += h_scroll->get_value(); - if (v_scroll->is_visible_in_tree()) + } + if (v_scroll->is_visible_in_tree()) { pos.y += v_scroll->get_value(); + } int col, h, section; TreeItem *it = _find_item_at_pos(root, pos, col, h, section); @@ -3758,19 +3570,20 @@ int Tree::get_column_at_position(const Point2 &p_pos) const { } int Tree::get_drop_section_at_position(const Point2 &p_pos) const { - if (root) { - Point2 pos = p_pos; pos -= cache.bg->get_offset(); pos.y -= _get_title_button_height(); - if (pos.y < 0) + if (pos.y < 0) { return -100; + } - if (h_scroll->is_visible_in_tree()) + if (h_scroll->is_visible_in_tree()) { pos.x += h_scroll->get_value(); - if (v_scroll->is_visible_in_tree()) + } + if (v_scroll->is_visible_in_tree()) { pos.y += v_scroll->get_value(); + } int col, h, section; TreeItem *it = _find_item_at_pos(root, pos, col, h, section); @@ -3782,58 +3595,60 @@ int Tree::get_drop_section_at_position(const Point2 &p_pos) const { return -100; } -TreeItem *Tree::get_item_at_position(const Point2 &p_pos) const { +TreeItem *Tree::get_item_at_position(const Point2 &p_pos) const { if (root) { - Point2 pos = p_pos; pos -= cache.bg->get_offset(); pos.y -= _get_title_button_height(); - if (pos.y < 0) - return NULL; + if (pos.y < 0) { + return nullptr; + } - if (h_scroll->is_visible_in_tree()) + if (h_scroll->is_visible_in_tree()) { pos.x += h_scroll->get_value(); - if (v_scroll->is_visible_in_tree()) + } + if (v_scroll->is_visible_in_tree()) { pos.y += v_scroll->get_value(); + } int col, h, section; TreeItem *it = _find_item_at_pos(root, pos, col, h, section); if (it) { - return it; } } - return NULL; + return nullptr; } String Tree::get_tooltip(const Point2 &p_pos) const { - if (root) { - Point2 pos = p_pos; pos -= cache.bg->get_offset(); pos.y -= _get_title_button_height(); - if (pos.y < 0) + if (pos.y < 0) { return Control::get_tooltip(p_pos); + } - if (h_scroll->is_visible_in_tree()) + if (h_scroll->is_visible_in_tree()) { pos.x += h_scroll->get_value(); - if (v_scroll->is_visible_in_tree()) + } + if (v_scroll->is_visible_in_tree()) { pos.y += v_scroll->get_value(); + } int col, h, section; TreeItem *it = _find_item_at_pos(root, pos, col, h, section); if (it) { - const TreeItem::Cell &c = it->cells[col]; int col_width = get_column_width(col); - for (int i = 0; i < col; i++) + for (int i = 0; i < col; i++) { pos.x -= get_column_width(i); + } for (int j = c.buttons.size() - 1; j >= 0; j--) { Ref<Texture2D> b = c.buttons[j].texture; @@ -3847,10 +3662,11 @@ String Tree::get_tooltip(const Point2 &p_pos) const { col_width -= size.width; } String ret; - if (it->get_tooltip(col) == "") + if (it->get_tooltip(col) == "") { ret = it->get_text(col); - else + } else { ret = it->get_tooltip(col); + } return ret; } } @@ -3859,12 +3675,10 @@ String Tree::get_tooltip(const Point2 &p_pos) const { } void Tree::set_cursor_can_exit_tree(bool p_enable) { - cursor_can_exit_tree = p_enable; } bool Tree::can_cursor_exit_tree() const { - return cursor_can_exit_tree; } @@ -3874,43 +3688,38 @@ void Tree::set_hide_folding(bool p_hide) { } bool Tree::is_folding_hidden() const { - return hide_folding; } void Tree::set_drop_mode_flags(int p_flags) { - if (drop_mode_flags == p_flags) + if (drop_mode_flags == p_flags) { return; + } drop_mode_flags = p_flags; if (drop_mode_flags == 0) { - drop_mode_over = NULL; + drop_mode_over = nullptr; } update(); } int Tree::get_drop_mode_flags() const { - return drop_mode_flags; } void Tree::set_edit_checkbox_cell_only_when_checkbox_is_pressed(bool p_enable) { - force_edit_checkbox_only_on_checkbox = p_enable; } bool Tree::get_edit_checkbox_cell_only_when_checkbox_is_pressed() const { - return force_edit_checkbox_only_on_checkbox; } void Tree::set_allow_rmb_select(bool p_allow) { - allow_rmb_select = p_allow; } bool Tree::get_allow_rmb_select() const { - return allow_rmb_select; } @@ -3919,12 +3728,10 @@ void Tree::set_allow_reselect(bool p_allow) { } bool Tree::get_allow_reselect() const { - return allow_reselect; } void Tree::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &Tree::_gui_input); ClassDB::bind_method(D_METHOD("clear"), &Tree::clear); @@ -4012,20 +3819,19 @@ void Tree::_bind_methods() { } Tree::Tree() { - selected_col = 0; columns.resize(1); - selected_item = NULL; - edited_item = NULL; + selected_item = nullptr; + edited_item = nullptr; selected_col = -1; edited_col = -1; hide_root = false; select_mode = SELECT_SINGLE; - root = 0; - popup_menu = NULL; - popup_edited_item = NULL; - text_editor = NULL; + root = nullptr; + popup_menu = nullptr; + popup_edited_item = nullptr; + text_editor = nullptr; set_focus_mode(FOCUS_ALL); popup_menu = memnew(PopupMenu); @@ -4078,7 +3884,7 @@ Tree::Tree() { cache.hover_index = -1; cache.click_index = -1; cache.click_id = -1; - cache.click_item = NULL; + cache.click_item = nullptr; cache.click_column = 0; cache.hover_cell = -1; last_keypress = 0; @@ -4098,9 +3904,9 @@ Tree::Tree() { hide_folding = false; drop_mode_flags = 0; - drop_mode_over = NULL; + drop_mode_over = nullptr; drop_mode_section = 0; - single_select_defer = NULL; + single_select_defer = nullptr; scrolling = false; allow_rmb_select = false; @@ -4108,7 +3914,7 @@ Tree::Tree() { set_clip_contents(true); - cache.hover_item = NULL; + cache.hover_item = nullptr; cache.hover_cell = -1; allow_reselect = false; @@ -4116,7 +3922,6 @@ Tree::Tree() { } Tree::~Tree() { - if (root) { memdelete(root); } |