Merge pull request #65156 from YuriSizov/control-customizable-cache-p1
This commit is contained in:
@ -336,6 +336,35 @@ void MenuBar::_update_menu() {
|
||||
queue_redraw();
|
||||
}
|
||||
|
||||
void MenuBar::_update_theme_item_cache() {
|
||||
Control::_update_theme_item_cache();
|
||||
|
||||
theme_cache.normal = get_theme_stylebox(SNAME("normal"));
|
||||
theme_cache.normal_mirrored = get_theme_stylebox(SNAME("normal_mirrored"));
|
||||
theme_cache.disabled = get_theme_stylebox(SNAME("disabled"));
|
||||
theme_cache.disabled_mirrored = get_theme_stylebox(SNAME("disabled_mirrored"));
|
||||
theme_cache.pressed = get_theme_stylebox(SNAME("pressed"));
|
||||
theme_cache.pressed_mirrored = get_theme_stylebox(SNAME("pressed_mirrored"));
|
||||
theme_cache.hover = get_theme_stylebox(SNAME("hover"));
|
||||
theme_cache.hover_mirrored = get_theme_stylebox(SNAME("hover_mirrored"));
|
||||
theme_cache.hover_pressed = get_theme_stylebox(SNAME("hover_pressed"));
|
||||
theme_cache.hover_pressed_mirrored = get_theme_stylebox(SNAME("hover_pressed_mirrored"));
|
||||
|
||||
theme_cache.font = get_theme_font(SNAME("font"));
|
||||
theme_cache.font_size = get_theme_font_size(SNAME("font_size"));
|
||||
theme_cache.outline_size = get_theme_constant(SNAME("outline_size"));
|
||||
theme_cache.font_outline_color = get_theme_color(SNAME("font_outline_color"));
|
||||
|
||||
theme_cache.font_color = get_theme_color(SNAME("font_color"));
|
||||
theme_cache.font_disabled_color = get_theme_color(SNAME("font_disabled_color"));
|
||||
theme_cache.font_pressed_color = get_theme_color(SNAME("font_pressed_color"));
|
||||
theme_cache.font_hover_color = get_theme_color(SNAME("font_hover_color"));
|
||||
theme_cache.font_hover_pressed_color = get_theme_color(SNAME("font_hover_pressed_color"));
|
||||
theme_cache.font_focus_color = get_theme_color(SNAME("font_focus_color"));
|
||||
|
||||
theme_cache.h_separation = get_theme_constant(SNAME("h_separation"));
|
||||
}
|
||||
|
||||
void MenuBar::_notification(int p_what) {
|
||||
switch (p_what) {
|
||||
case NOTIFICATION_ENTER_TREE: {
|
||||
@ -397,8 +426,7 @@ void MenuBar::_notification(int p_what) {
|
||||
}
|
||||
|
||||
int MenuBar::_get_index_at_point(const Point2 &p_point) const {
|
||||
Ref<StyleBox> style = get_theme_stylebox(SNAME("normal"));
|
||||
int hsep = get_theme_constant(SNAME("h_separation"));
|
||||
Ref<StyleBox> style = theme_cache.normal;
|
||||
int offset = 0;
|
||||
for (int i = 0; i < menu_cache.size(); i++) {
|
||||
if (menu_cache[i].hidden) {
|
||||
@ -410,7 +438,7 @@ int MenuBar::_get_index_at_point(const Point2 &p_point) const {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
offset += size.x + hsep;
|
||||
offset += size.x + theme_cache.h_separation;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@ -418,8 +446,7 @@ int MenuBar::_get_index_at_point(const Point2 &p_point) const {
|
||||
Rect2 MenuBar::_get_menu_item_rect(int p_index) const {
|
||||
ERR_FAIL_INDEX_V(p_index, menu_cache.size(), Rect2());
|
||||
|
||||
Ref<StyleBox> style = get_theme_stylebox(SNAME("normal"));
|
||||
int hsep = get_theme_constant(SNAME("h_separation"));
|
||||
Ref<StyleBox> style = theme_cache.normal;
|
||||
|
||||
int offset = 0;
|
||||
for (int i = 0; i < p_index; i++) {
|
||||
@ -427,7 +454,7 @@ Rect2 MenuBar::_get_menu_item_rect(int p_index) const {
|
||||
continue;
|
||||
}
|
||||
Size2 size = menu_cache[i].text_buf->get_size() + style->get_minimum_size();
|
||||
offset += size.x + hsep;
|
||||
offset += size.x + theme_cache.h_separation;
|
||||
}
|
||||
|
||||
return Rect2(Point2(offset, 0), menu_cache[p_index].text_buf->get_size() + style->get_minimum_size());
|
||||
@ -446,76 +473,76 @@ void MenuBar::_draw_menu_item(int p_index) {
|
||||
}
|
||||
|
||||
Color color;
|
||||
Ref<StyleBox> style = get_theme_stylebox(SNAME("normal"));
|
||||
Ref<StyleBox> style = theme_cache.normal;
|
||||
Rect2 item_rect = _get_menu_item_rect(p_index);
|
||||
|
||||
if (menu_cache[p_index].disabled) {
|
||||
if (rtl && has_theme_stylebox(SNAME("disabled_mirrored"))) {
|
||||
style = get_theme_stylebox(SNAME("disabled_mirrored"));
|
||||
style = theme_cache.disabled_mirrored;
|
||||
} else {
|
||||
style = get_theme_stylebox(SNAME("disabled"));
|
||||
style = theme_cache.disabled;
|
||||
}
|
||||
if (!flat) {
|
||||
style->draw(ci, item_rect);
|
||||
}
|
||||
color = get_theme_color(SNAME("font_disabled_color"));
|
||||
color = theme_cache.font_disabled_color;
|
||||
} else if (hovered && pressed && has_theme_stylebox("hover_pressed")) {
|
||||
if (rtl && has_theme_stylebox(SNAME("hover_pressed_mirrored"))) {
|
||||
style = get_theme_stylebox(SNAME("hover_pressed_mirrored"));
|
||||
style = theme_cache.hover_pressed_mirrored;
|
||||
} else {
|
||||
style = get_theme_stylebox(SNAME("hover_pressed"));
|
||||
style = theme_cache.hover_pressed;
|
||||
}
|
||||
if (!flat) {
|
||||
style->draw(ci, item_rect);
|
||||
}
|
||||
if (has_theme_color(SNAME("font_hover_pressed_color"))) {
|
||||
color = get_theme_color(SNAME("font_hover_pressed_color"));
|
||||
color = theme_cache.font_hover_pressed_color;
|
||||
}
|
||||
} else if (pressed) {
|
||||
if (rtl && has_theme_stylebox(SNAME("pressed_mirrored"))) {
|
||||
style = get_theme_stylebox(SNAME("pressed_mirrored"));
|
||||
style = theme_cache.pressed_mirrored;
|
||||
} else {
|
||||
style = get_theme_stylebox(SNAME("pressed"));
|
||||
style = theme_cache.pressed;
|
||||
}
|
||||
if (!flat) {
|
||||
style->draw(ci, item_rect);
|
||||
}
|
||||
if (has_theme_color(SNAME("font_pressed_color"))) {
|
||||
color = get_theme_color(SNAME("font_pressed_color"));
|
||||
color = theme_cache.font_pressed_color;
|
||||
} else {
|
||||
color = get_theme_color(SNAME("font_color"));
|
||||
color = theme_cache.font_color;
|
||||
}
|
||||
} else if (hovered) {
|
||||
if (rtl && has_theme_stylebox(SNAME("hover_mirrored"))) {
|
||||
style = get_theme_stylebox(SNAME("hover_mirrored"));
|
||||
style = theme_cache.hover_mirrored;
|
||||
} else {
|
||||
style = get_theme_stylebox(SNAME("hover"));
|
||||
style = theme_cache.hover;
|
||||
}
|
||||
if (!flat) {
|
||||
style->draw(ci, item_rect);
|
||||
}
|
||||
color = get_theme_color(SNAME("font_hover_color"));
|
||||
color = theme_cache.font_hover_color;
|
||||
} else {
|
||||
if (rtl && has_theme_stylebox(SNAME("normal_mirrored"))) {
|
||||
style = get_theme_stylebox(SNAME("normal_mirrored"));
|
||||
style = theme_cache.normal_mirrored;
|
||||
} else {
|
||||
style = get_theme_stylebox(SNAME("normal"));
|
||||
style = theme_cache.normal;
|
||||
}
|
||||
if (!flat) {
|
||||
style->draw(ci, item_rect);
|
||||
}
|
||||
// Focus colors only take precedence over normal state.
|
||||
if (has_focus()) {
|
||||
color = get_theme_color(SNAME("font_focus_color"));
|
||||
color = theme_cache.font_focus_color;
|
||||
} else {
|
||||
color = get_theme_color(SNAME("font_color"));
|
||||
color = theme_cache.font_color;
|
||||
}
|
||||
}
|
||||
|
||||
Point2 text_ofs = item_rect.position + Point2(style->get_margin(SIDE_LEFT), style->get_margin(SIDE_TOP));
|
||||
|
||||
Color font_outline_color = get_theme_color(SNAME("font_outline_color"));
|
||||
int outline_size = get_theme_constant(SNAME("outline_size"));
|
||||
Color font_outline_color = theme_cache.font_outline_color;
|
||||
int outline_size = theme_cache.outline_size;
|
||||
if (outline_size > 0 && font_outline_color.a > 0) {
|
||||
menu_cache[p_index].text_buf->draw_outline(ci, text_ofs, outline_size, font_outline_color);
|
||||
}
|
||||
@ -523,16 +550,13 @@ void MenuBar::_draw_menu_item(int p_index) {
|
||||
}
|
||||
|
||||
void MenuBar::shape(Menu &p_menu) {
|
||||
Ref<Font> font = get_theme_font(SNAME("font"));
|
||||
int font_size = get_theme_font_size(SNAME("font_size"));
|
||||
|
||||
p_menu.text_buf->clear();
|
||||
if (text_direction == Control::TEXT_DIRECTION_INHERITED) {
|
||||
p_menu.text_buf->set_direction(is_layout_rtl() ? TextServer::DIRECTION_RTL : TextServer::DIRECTION_LTR);
|
||||
} else {
|
||||
p_menu.text_buf->set_direction((TextServer::Direction)text_direction);
|
||||
}
|
||||
p_menu.text_buf->add_string(p_menu.name, font, font_size, language);
|
||||
p_menu.text_buf->add_string(p_menu.name, theme_cache.font, theme_cache.font_size, language);
|
||||
}
|
||||
|
||||
void MenuBar::_refresh_menu_names() {
|
||||
@ -762,7 +786,7 @@ Size2 MenuBar::get_minimum_size() const {
|
||||
return Size2();
|
||||
}
|
||||
|
||||
Ref<StyleBox> style = get_theme_stylebox(SNAME("normal"));
|
||||
Ref<StyleBox> style = theme_cache.normal;
|
||||
|
||||
Vector2 size;
|
||||
for (int i = 0; i < menu_cache.size(); i++) {
|
||||
@ -774,7 +798,7 @@ Size2 MenuBar::get_minimum_size() const {
|
||||
size.x += sz.x;
|
||||
}
|
||||
if (menu_cache.size() > 1) {
|
||||
size.x += get_theme_constant(SNAME("h_separation")) * (menu_cache.size() - 1);
|
||||
size.x += theme_cache.h_separation * (menu_cache.size() - 1);
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user