diff options
Diffstat (limited to 'scene/gui/tabs.cpp')
-rw-r--r-- | scene/gui/tabs.cpp | 157 |
1 files changed, 65 insertions, 92 deletions
diff --git a/scene/gui/tabs.cpp b/scene/gui/tabs.cpp index 1a3b53f489..8f71aa7cab 100644 --- a/scene/gui/tabs.cpp +++ b/scene/gui/tabs.cpp @@ -36,7 +36,6 @@ #include "scene/gui/texture_rect.h" Size2 Tabs::get_minimum_size() const { - Ref<StyleBox> tab_bg = get_theme_stylebox("tab_bg"); Ref<StyleBox> tab_fg = get_theme_stylebox("tab_fg"); Ref<StyleBox> tab_disabled = get_theme_stylebox("tab_disabled"); @@ -45,22 +44,23 @@ Size2 Tabs::get_minimum_size() const { Size2 ms(0, MAX(MAX(tab_bg->get_minimum_size().height, tab_fg->get_minimum_size().height), tab_disabled->get_minimum_size().height) + font->get_height()); for (int i = 0; i < tabs.size(); i++) { - Ref<Texture2D> tex = tabs[i].icon; if (tex.is_valid()) { ms.height = MAX(ms.height, tex->get_size().height); - if (tabs[i].text != "") + if (tabs[i].text != "") { ms.width += get_theme_constant("hseparation"); + } } ms.width += Math::ceil(font->get_string_size(tabs[i].xl_text).width); - if (tabs[i].disabled) + if (tabs[i].disabled) { ms.width += tab_disabled->get_minimum_size().width; - else if (current == i) + } else if (current == i) { ms.width += tab_fg->get_minimum_size().width; - else + } else { ms.width += tab_bg->get_minimum_size().width; + } if (tabs[i].right_button.is_valid()) { Ref<Texture2D> rb = tabs[i].right_button; @@ -84,16 +84,13 @@ Size2 Tabs::get_minimum_size() const { } void Tabs::_gui_input(const Ref<InputEvent> &p_event) { - Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { - Point2 pos = mm->get_position(); highlight_arrow = -1; if (buttons_visible) { - Ref<Texture2D> incr = get_theme_icon("increment"); Ref<Texture2D> decr = get_theme_icon("decrement"); @@ -114,9 +111,7 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_UP && !mb->get_command()) { - if (scrolling_enabled && buttons_visible) { if (offset > 0) { offset--; @@ -135,7 +130,6 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { } if (rb_pressing && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { - if (rb_hover != -1) { //pressed emit_signal("right_button_pressed", rb_hover); @@ -146,7 +140,6 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { } if (cb_pressing && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { - if (cb_hover != -1) { //pressed emit_signal("tab_close", cb_hover); @@ -157,12 +150,10 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { } if (mb->is_pressed() && (mb->get_button_index() == BUTTON_LEFT || (select_with_rmb && mb->get_button_index() == BUTTON_RIGHT))) { - // clicks Point2 pos(mb->get_position().x, mb->get_position().y); if (buttons_visible) { - Ref<Texture2D> incr = get_theme_icon("increment"); Ref<Texture2D> decr = get_theme_icon("decrement"); @@ -185,7 +176,6 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { int found = -1; for (int i = offset; i < tabs.size(); i++) { - if (tabs[i].rb_rect.has_point(pos)) { rb_pressing = true; update(); @@ -207,7 +197,6 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { } if (found != -1) { - set_current_tab(found); emit_signal("tab_clicked", found); } @@ -216,9 +205,7 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { } void Tabs::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_TRANSLATION_CHANGED: { for (int i = 0; i < tabs.size(); ++i) { tabs.write[i].xl_text = tr(tabs[i].text); @@ -249,7 +236,6 @@ void Tabs::_notification(int p_what) { int mw = 0; for (int i = 0; i < tabs.size(); i++) { - tabs.write[i].ofs_cache = mw; mw += get_tab_width(i); } @@ -274,7 +260,6 @@ void Tabs::_notification(int p_what) { missing_right = false; for (int i = offset; i < tabs.size(); i++) { - tabs.write[i].ofs_cache = w; int lsize = tabs[i].size_cache; @@ -309,10 +294,10 @@ void Tabs::_notification(int p_what) { Size2i sb_ms = sb->get_minimum_size(); Ref<Texture2D> icon = tabs[i].icon; if (icon.is_valid()) { - icon->draw(ci, Point2i(w, sb->get_margin(MARGIN_TOP) + ((sb_rect.size.y - sb_ms.y) - icon->get_height()) / 2)); - if (tabs[i].text != "") + if (tabs[i].text != "") { w += icon->get_width() + get_theme_constant("hseparation"); + } } font->draw(ci, Point2i(w, sb->get_margin(MARGIN_TOP) + ((sb_rect.size.y - sb_ms.y) - font->get_height()) / 2 + font->get_ascent()), tabs[i].xl_text, col, tabs[i].size_text); @@ -320,7 +305,6 @@ void Tabs::_notification(int p_what) { w += tabs[i].size_text; if (tabs[i].right_button.is_valid()) { - Ref<StyleBox> style = get_theme_stylebox("button"); Ref<Texture2D> rb = tabs[i].right_button; @@ -332,10 +316,11 @@ void Tabs::_notification(int p_what) { rb_rect.position.y = sb->get_margin(MARGIN_TOP) + ((sb_rect.size.y - sb_ms.y) - (rb_rect.size.y)) / 2; if (rb_hover == i) { - if (rb_pressing) + if (rb_pressing) { get_theme_stylebox("button_pressed")->draw(ci, rb_rect); - else + } else { style->draw(ci, rb_rect); + } } rb->draw(ci, Point2i(w + style->get_margin(MARGIN_LEFT), rb_rect.position.y + style->get_margin(MARGIN_TOP))); @@ -344,7 +329,6 @@ void Tabs::_notification(int p_what) { } if (cb_displaypolicy == CLOSE_BUTTON_SHOW_ALWAYS || (cb_displaypolicy == CLOSE_BUTTON_SHOW_ACTIVE_ONLY && i == current)) { - Ref<StyleBox> style = get_theme_stylebox("button"); Ref<Texture2D> cb = close; @@ -356,10 +340,11 @@ void Tabs::_notification(int p_what) { cb_rect.position.y = sb->get_margin(MARGIN_TOP) + ((sb_rect.size.y - sb_ms.y) - (cb_rect.size.y)) / 2; if (!tabs[i].disabled && cb_hover == i) { - if (cb_pressing) + if (cb_pressing) { get_theme_stylebox("button_pressed")->draw(ci, cb_rect); - else + } else { style->draw(ci, cb_rect); + } } cb->draw(ci, Point2i(w + style->get_margin(MARGIN_LEFT), cb_rect.position.y + style->get_margin(MARGIN_TOP))); @@ -371,18 +356,19 @@ void Tabs::_notification(int p_what) { } if (offset > 0 || missing_right) { - int vofs = (get_size().height - incr->get_size().height) / 2; - if (offset > 0) + if (offset > 0) { draw_texture(highlight_arrow == 0 ? decr_hl : decr, Point2(limit, vofs)); - else + } else { draw_texture(decr, Point2(limit, vofs), Color(1, 1, 1, 0.5)); + } - if (missing_right) + if (missing_right) { draw_texture(highlight_arrow == 1 ? incr_hl : incr, Point2(limit + decr->get_size().width, vofs)); - else + } else { draw_texture(incr, Point2(limit + decr->get_size().width, vofs), Color(1, 1, 1, 0.5)); + } buttons_visible = true; } else { @@ -393,13 +379,13 @@ void Tabs::_notification(int p_what) { } int Tabs::get_tab_count() const { - return tabs.size(); } void Tabs::set_current_tab(int p_current) { - - if (current == p_current) return; + if (current == p_current) { + return; + } ERR_FAIL_INDEX(p_current, get_tab_count()); current = p_current; @@ -412,7 +398,6 @@ void Tabs::set_current_tab(int p_current) { } int Tabs::get_current_tab() const { - return current; } @@ -429,7 +414,6 @@ bool Tabs::get_offset_buttons_visible() const { } void Tabs::set_tab_title(int p_tab, const String &p_title) { - ERR_FAIL_INDEX(p_tab, tabs.size()); tabs.write[p_tab].text = p_title; tabs.write[p_tab].xl_text = tr(p_title); @@ -438,13 +422,11 @@ void Tabs::set_tab_title(int p_tab, const String &p_title) { } String Tabs::get_tab_title(int p_tab) const { - ERR_FAIL_INDEX_V(p_tab, tabs.size(), ""); return tabs[p_tab].text; } void Tabs::set_tab_icon(int p_tab, const Ref<Texture2D> &p_icon) { - ERR_FAIL_INDEX(p_tab, tabs.size()); tabs.write[p_tab].icon = p_icon; update(); @@ -452,39 +434,35 @@ void Tabs::set_tab_icon(int p_tab, const Ref<Texture2D> &p_icon) { } Ref<Texture2D> Tabs::get_tab_icon(int p_tab) const { - ERR_FAIL_INDEX_V(p_tab, tabs.size(), Ref<Texture2D>()); return tabs[p_tab].icon; } void Tabs::set_tab_disabled(int p_tab, bool p_disabled) { - ERR_FAIL_INDEX(p_tab, tabs.size()); tabs.write[p_tab].disabled = p_disabled; update(); } -bool Tabs::get_tab_disabled(int p_tab) const { +bool Tabs::get_tab_disabled(int p_tab) const { ERR_FAIL_INDEX_V(p_tab, tabs.size(), false); return tabs[p_tab].disabled; } void Tabs::set_tab_right_button(int p_tab, const Ref<Texture2D> &p_right_button) { - ERR_FAIL_INDEX(p_tab, tabs.size()); tabs.write[p_tab].right_button = p_right_button; _update_cache(); update(); minimum_size_changed(); } -Ref<Texture2D> Tabs::get_tab_right_button(int p_tab) const { +Ref<Texture2D> Tabs::get_tab_right_button(int p_tab) const { ERR_FAIL_INDEX_V(p_tab, tabs.size(), Ref<Texture2D>()); return tabs[p_tab].right_button; } void Tabs::_update_hover() { - if (!is_inside_tree()) { return; } @@ -494,7 +472,6 @@ void Tabs::_update_hover() { int hover_now = -1; int hover_buttons = -1; for (int i = offset; i < tabs.size(); i++) { - Rect2 rect = get_tab_rect(i); if (rect.has_point(pos)) { hover_now = i; @@ -551,7 +528,6 @@ void Tabs::_update_cache() { m_width = MAX((limit - size_fixed) / count_resize, min_width); } for (int i = offset; i < tabs.size(); i++) { - Ref<StyleBox> sb; if (tabs[i].disabled) { sb = tab_disabled; @@ -586,7 +562,6 @@ void Tabs::_update_cache() { } void Tabs::_on_mouse_exited() { - rb_hover = -1; cb_hover = -1; hover = -1; @@ -595,7 +570,6 @@ void Tabs::_on_mouse_exited() { } void Tabs::add_tab(const String &p_str, const Ref<Texture2D> &p_icon) { - Tab t; t.text = p_str; t.xl_text = tr(p_str); @@ -619,33 +593,36 @@ void Tabs::clear_tabs() { } void Tabs::remove_tab(int p_idx) { - ERR_FAIL_INDEX(p_idx, tabs.size()); tabs.remove(p_idx); - if (current >= p_idx) + if (current >= p_idx) { current--; + } _update_cache(); call_deferred("_update_hover"); update(); minimum_size_changed(); - if (current < 0) + if (current < 0) { current = 0; - if (current >= tabs.size()) + } + if (current >= tabs.size()) { current = tabs.size() - 1; + } _ensure_no_over_offset(); } Variant Tabs::get_drag_data(const Point2 &p_point) { - - if (!drag_to_rearrange_enabled) + if (!drag_to_rearrange_enabled) { return Variant(); + } int tab_over = get_tab_idx_at_point(p_point); - if (tab_over < 0) + if (tab_over < 0) { return Variant(); + } HBoxContainer *drag_preview = memnew(HBoxContainer); @@ -671,16 +648,16 @@ Variant Tabs::get_drag_data(const Point2 &p_point) { } bool Tabs::can_drop_data(const Point2 &p_point, const Variant &p_data) const { - - if (!drag_to_rearrange_enabled) + if (!drag_to_rearrange_enabled) { return false; + } Dictionary d = p_data; - if (!d.has("type")) + if (!d.has("type")) { return false; + } if (String(d["type"]) == "tab_element") { - NodePath from_path = d["from_path"]; NodePath to_path = get_path(); if (from_path == to_path) { @@ -698,24 +675,25 @@ bool Tabs::can_drop_data(const Point2 &p_point, const Variant &p_data) const { } void Tabs::drop_data(const Point2 &p_point, const Variant &p_data) { - - if (!drag_to_rearrange_enabled) + if (!drag_to_rearrange_enabled) { return; + } int hover_now = get_tab_idx_at_point(p_point); Dictionary d = p_data; - if (!d.has("type")) + if (!d.has("type")) { return; + } if (String(d["type"]) == "tab_element") { - int tab_from_id = d["tab_element"]; NodePath from_path = d["from_path"]; NodePath to_path = get_path(); if (from_path == to_path) { - if (hover_now < 0) + if (hover_now < 0) { hover_now = get_tab_count() - 1; + } move_tab(tab_from_id, hover_now); emit_signal("reposition_active_tab_request", hover_now); set_current_tab(hover_now); @@ -724,11 +702,13 @@ void Tabs::drop_data(const Point2 &p_point, const Variant &p_data) { Node *from_node = get_node(from_path); Tabs *from_tabs = Object::cast_to<Tabs>(from_node); if (from_tabs && from_tabs->get_tabs_rearrange_group() == get_tabs_rearrange_group()) { - if (tab_from_id >= from_tabs->get_tab_count()) + if (tab_from_id >= from_tabs->get_tab_count()) { return; + } Tab moving_tab = from_tabs->tabs[tab_from_id]; - if (hover_now < 0) + if (hover_now < 0) { hover_now = get_tab_count(); + } tabs.insert(hover_now, moving_tab); from_tabs->remove_tab(tab_from_id); set_current_tab(hover_now); @@ -741,10 +721,8 @@ void Tabs::drop_data(const Point2 &p_point, const Variant &p_data) { } int Tabs::get_tab_idx_at_point(const Point2 &p_point) const { - int hover_now = -1; for (int i = offset; i < tabs.size(); i++) { - Rect2 rect = get_tab_rect(i); if (rect.has_point(p_point)) { hover_now = i; @@ -755,21 +733,19 @@ int Tabs::get_tab_idx_at_point(const Point2 &p_point) const { } void Tabs::set_tab_align(TabAlign p_align) { - ERR_FAIL_INDEX(p_align, ALIGN_MAX); tab_align = p_align; update(); } Tabs::TabAlign Tabs::get_tab_align() const { - return tab_align; } void Tabs::move_tab(int from, int to) { - - if (from == to) + if (from == to) { return; + } ERR_FAIL_INDEX(from, tabs.size()); ERR_FAIL_INDEX(to, tabs.size()); @@ -783,7 +759,6 @@ void Tabs::move_tab(int from, int to) { } int Tabs::get_tab_width(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, tabs.size(), 0); Ref<StyleBox> tab_bg = get_theme_stylebox("tab_bg"); @@ -796,18 +771,20 @@ int Tabs::get_tab_width(int p_idx) const { Ref<Texture2D> tex = tabs[p_idx].icon; if (tex.is_valid()) { x += tex->get_width(); - if (tabs[p_idx].text != "") + if (tabs[p_idx].text != "") { x += get_theme_constant("hseparation"); + } } x += Math::ceil(font->get_string_size(tabs[p_idx].xl_text).width); - if (tabs[p_idx].disabled) + if (tabs[p_idx].disabled) { x += tab_disabled->get_minimum_size().width; - else if (current == p_idx) + } else if (current == p_idx) { x += tab_fg->get_minimum_size().width; - else + } else { x += tab_bg->get_minimum_size().width; + } if (tabs[p_idx].right_button.is_valid()) { Ref<Texture2D> rb = tabs[p_idx].right_button; @@ -825,9 +802,9 @@ int Tabs::get_tab_width(int p_idx) const { } void Tabs::_ensure_no_over_offset() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } Ref<Texture2D> incr = get_theme_icon("increment"); Ref<Texture2D> decr = get_theme_icon("decrement"); @@ -835,10 +812,8 @@ void Tabs::_ensure_no_over_offset() { int limit = get_size().width - incr->get_width() - decr->get_width(); while (offset > 0) { - int total_w = 0; for (int i = offset - 1; i < tabs.size(); i++) { - total_w += tabs[i].size_cache; } @@ -852,11 +827,13 @@ void Tabs::_ensure_no_over_offset() { } void Tabs::ensure_tab_visible(int p_idx) { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } - if (tabs.size() == 0) return; + if (tabs.size() == 0) { + return; + } ERR_FAIL_INDEX(p_idx, tabs.size()); if (p_idx == offset) { @@ -884,20 +861,17 @@ void Tabs::ensure_tab_visible(int p_idx) { } Rect2 Tabs::get_tab_rect(int p_tab) const { - ERR_FAIL_INDEX_V(p_tab, tabs.size(), Rect2()); return Rect2(tabs[p_tab].ofs_cache, 0, tabs[p_tab].size_cache, get_size().height); } void Tabs::set_tab_close_display_policy(CloseButtonDisplayPolicy p_policy) { - ERR_FAIL_INDEX(p_policy, CLOSE_BUTTON_MAX); cb_displaypolicy = p_policy; update(); } Tabs::CloseButtonDisplayPolicy Tabs::get_tab_close_display_policy() const { - return cb_displaypolicy; } @@ -920,6 +894,7 @@ void Tabs::set_drag_to_rearrange_enabled(bool p_enabled) { bool Tabs::get_drag_to_rearrange_enabled() const { return drag_to_rearrange_enabled; } + void Tabs::set_tabs_rearrange_group(int p_group_id) { tabs_rearrange_group = p_group_id; } @@ -937,7 +912,6 @@ bool Tabs::get_select_with_rmb() const { } void Tabs::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &Tabs::_gui_input); ClassDB::bind_method(D_METHOD("_update_hover"), &Tabs::_update_hover); ClassDB::bind_method(D_METHOD("get_tab_count"), &Tabs::get_tab_count); @@ -995,7 +969,6 @@ void Tabs::_bind_methods() { } Tabs::Tabs() { - current = 0; tab_align = ALIGN_CENTER; rb_hover = -1; |