summaryrefslogtreecommitdiffstats
path: root/scene/gui/tab_bar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/gui/tab_bar.cpp')
-rw-r--r--scene/gui/tab_bar.cpp93
1 files changed, 39 insertions, 54 deletions
diff --git a/scene/gui/tab_bar.cpp b/scene/gui/tab_bar.cpp
index d20fef8164..ddc757c452 100644
--- a/scene/gui/tab_bar.cpp
+++ b/scene/gui/tab_bar.cpp
@@ -323,6 +323,19 @@ void TabBar::gui_input(const Ref<InputEvent> &p_event) {
}
}
+String TabBar::get_tooltip(const Point2 &p_pos) const {
+ int tab_idx = get_tab_idx_at_point(p_pos);
+ if (tab_idx < 0) {
+ return Control::get_tooltip(p_pos);
+ }
+
+ if (tabs[tab_idx].tooltip.is_empty() && tabs[tab_idx].truncated) {
+ return tabs[tab_idx].text;
+ }
+
+ return tabs[tab_idx].tooltip;
+}
+
void TabBar::_shape(int p_tab) {
tabs.write[p_tab].text_buf->clear();
tabs.write[p_tab].text_buf->set_width(-1);
@@ -757,6 +770,16 @@ String TabBar::get_tab_title(int p_tab) const {
return tabs[p_tab].text;
}
+void TabBar::set_tab_tooltip(int p_tab, const String &p_tooltip) {
+ ERR_FAIL_INDEX(p_tab, tabs.size());
+ tabs.write[p_tab].tooltip = p_tooltip;
+}
+
+String TabBar::get_tab_tooltip(int p_tab) const {
+ ERR_FAIL_INDEX_V(p_tab, tabs.size(), "");
+ return tabs[p_tab].tooltip;
+}
+
void TabBar::set_tab_text_direction(int p_tab, Control::TextDirection p_text_direction) {
ERR_FAIL_INDEX(p_tab, tabs.size());
ERR_FAIL_COND((int)p_text_direction < -1 || (int)p_text_direction > 3);
@@ -998,7 +1021,8 @@ void TabBar::_update_cache(bool p_update_hover) {
tabs.write[i].size_text = Math::ceil(tabs[i].text_buf->get_size().x);
tabs.write[i].size_cache = get_tab_width(i);
- if (max_width > 0 && tabs[i].size_cache > max_width) {
+ tabs.write[i].truncated = max_width > 0 && tabs[i].size_cache > max_width;
+ if (tabs[i].truncated) {
int size_textless = tabs[i].size_cache - tabs[i].size_text;
int mw = MAX(size_textless, max_width);
@@ -1720,58 +1744,6 @@ bool TabBar::get_deselect_enabled() const {
return deselect_enabled;
}
-bool TabBar::_set(const StringName &p_name, const Variant &p_value) {
- Vector<String> components = String(p_name).split("/", true, 2);
- if (components.size() >= 2 && components[0].begins_with("tab_") && components[0].trim_prefix("tab_").is_valid_int()) {
- int tab_index = components[0].trim_prefix("tab_").to_int();
- const String &property = components[1];
- if (property == "title") {
- set_tab_title(tab_index, p_value);
- return true;
- } else if (property == "icon") {
- set_tab_icon(tab_index, p_value);
- return true;
- } else if (property == "disabled") {
- set_tab_disabled(tab_index, p_value);
- return true;
- }
- }
- return false;
-}
-
-bool TabBar::_get(const StringName &p_name, Variant &r_ret) const {
- Vector<String> components = String(p_name).split("/", true, 2);
- if (components.size() >= 2 && components[0].begins_with("tab_") && components[0].trim_prefix("tab_").is_valid_int()) {
- int tab_index = components[0].trim_prefix("tab_").to_int();
- const String &property = components[1];
- if (property == "title") {
- r_ret = get_tab_title(tab_index);
- return true;
- } else if (property == "icon") {
- r_ret = get_tab_icon(tab_index);
- return true;
- } else if (property == "disabled") {
- r_ret = is_tab_disabled(tab_index);
- return true;
- }
- }
- return false;
-}
-
-void TabBar::_get_property_list(List<PropertyInfo> *p_list) const {
- for (int i = 0; i < tabs.size(); i++) {
- p_list->push_back(PropertyInfo(Variant::STRING, vformat("tab_%d/title", i)));
-
- PropertyInfo pi = PropertyInfo(Variant::OBJECT, vformat("tab_%d/icon", i), PROPERTY_HINT_RESOURCE_TYPE, "Texture2D");
- pi.usage &= ~(get_tab_icon(i).is_null() ? PROPERTY_USAGE_STORAGE : 0);
- p_list->push_back(pi);
-
- pi = PropertyInfo(Variant::BOOL, vformat("tab_%d/disabled", i));
- pi.usage &= ~(!is_tab_disabled(i) ? PROPERTY_USAGE_STORAGE : 0);
- p_list->push_back(pi);
- }
-}
-
void TabBar::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_tab_count", "count"), &TabBar::set_tab_count);
ClassDB::bind_method(D_METHOD("get_tab_count"), &TabBar::get_tab_count);
@@ -1782,6 +1754,8 @@ void TabBar::_bind_methods() {
ClassDB::bind_method(D_METHOD("select_next_available"), &TabBar::select_next_available);
ClassDB::bind_method(D_METHOD("set_tab_title", "tab_idx", "title"), &TabBar::set_tab_title);
ClassDB::bind_method(D_METHOD("get_tab_title", "tab_idx"), &TabBar::get_tab_title);
+ ClassDB::bind_method(D_METHOD("set_tab_tooltip", "tab_idx", "tooltip"), &TabBar::set_tab_tooltip);
+ ClassDB::bind_method(D_METHOD("get_tab_tooltip", "tab_idx"), &TabBar::get_tab_tooltip);
ClassDB::bind_method(D_METHOD("set_tab_text_direction", "tab_idx", "direction"), &TabBar::set_tab_text_direction);
ClassDB::bind_method(D_METHOD("get_tab_text_direction", "tab_idx"), &TabBar::get_tab_text_direction);
ClassDB::bind_method(D_METHOD("set_tab_language", "tab_idx", "language"), &TabBar::set_tab_language);
@@ -1890,10 +1864,21 @@ void TabBar::_bind_methods() {
BIND_THEME_ITEM_CUSTOM(Theme::DATA_TYPE_ICON, TabBar, close_icon, "close");
BIND_THEME_ITEM_CUSTOM(Theme::DATA_TYPE_STYLEBOX, TabBar, button_pressed_style, "button_pressed");
BIND_THEME_ITEM_CUSTOM(Theme::DATA_TYPE_STYLEBOX, TabBar, button_hl_style, "button_highlight");
+
+ Tab defaults(true);
+
+ base_property_helper.set_prefix("tab_");
+ base_property_helper.set_array_length_getter(&TabBar::get_tab_count);
+ base_property_helper.register_property(PropertyInfo(Variant::STRING, "title"), defaults.text, &TabBar::set_tab_title, &TabBar::get_tab_title);
+ base_property_helper.register_property(PropertyInfo(Variant::STRING, "tooltip"), defaults.tooltip, &TabBar::set_tab_tooltip, &TabBar::get_tab_tooltip);
+ base_property_helper.register_property(PropertyInfo(Variant::OBJECT, "icon", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), defaults.icon, &TabBar::set_tab_icon, &TabBar::get_tab_icon);
+ base_property_helper.register_property(PropertyInfo(Variant::BOOL, "disabled"), defaults.disabled, &TabBar::set_tab_disabled, &TabBar::is_tab_disabled);
}
TabBar::TabBar() {
set_size(Size2(get_size().width, get_minimum_size().height));
set_focus_mode(FOCUS_ALL);
- connect("mouse_exited", callable_mp(this, &TabBar::_on_mouse_exited));
+ connect(SceneStringName(mouse_exited), callable_mp(this, &TabBar::_on_mouse_exited));
+
+ property_helper.setup_for_instance(base_property_helper, this);
}