Fix window title drawn outside the title bar

This commit is contained in:
Haoyu Qiu
2025-06-09 15:12:54 +08:00
parent 8f87e60307
commit f028bc93db
3 changed files with 18 additions and 13 deletions

View File

@ -1400,6 +1400,7 @@
<param index="6" name="oversampling" type="float" default="0.0" /> <param index="6" name="oversampling" type="float" default="0.0" />
<description> <description>
Draw shaped text into a canvas item at a given position, with [param color]. [param pos] specifies the leftmost point of the baseline (for horizontal layout) or topmost point of the baseline (for vertical layout). If [param oversampling] is greater than zero, it is used as font oversampling factor, otherwise viewport oversampling settings are used. Draw shaped text into a canvas item at a given position, with [param color]. [param pos] specifies the leftmost point of the baseline (for horizontal layout) or topmost point of the baseline (for vertical layout). If [param oversampling] is greater than zero, it is used as font oversampling factor, otherwise viewport oversampling settings are used.
[param clip_l] and [param clip_r] are offsets relative to [param pos], going to the right in horizontal layout and downward in vertical layout. If [param clip_l] is not negative, glyphs starting before the offset are clipped. If [param clip_r] is not negative, glyphs ending after the offset are clipped.
</description> </description>
</method> </method>
<method name="shaped_text_draw_outline" qualifiers="const"> <method name="shaped_text_draw_outline" qualifiers="const">
@ -1414,6 +1415,7 @@
<param index="7" name="oversampling" type="float" default="0.0" /> <param index="7" name="oversampling" type="float" default="0.0" />
<description> <description>
Draw the outline of the shaped text into a canvas item at a given position, with [param color]. [param pos] specifies the leftmost point of the baseline (for horizontal layout) or topmost point of the baseline (for vertical layout). If [param oversampling] is greater than zero, it is used as font oversampling factor, otherwise viewport oversampling settings are used. Draw the outline of the shaped text into a canvas item at a given position, with [param color]. [param pos] specifies the leftmost point of the baseline (for horizontal layout) or topmost point of the baseline (for vertical layout). If [param oversampling] is greater than zero, it is used as font oversampling factor, otherwise viewport oversampling settings are used.
[param clip_l] and [param clip_r] are offsets relative to [param pos], going to the right in horizontal layout and downward in vertical layout. If [param clip_l] is not negative, glyphs starting before the offset are clipped. If [param clip_r] is not negative, glyphs ending after the offset are clipped.
</description> </description>
</method> </method>
<method name="shaped_text_fit_to_width"> <method name="shaped_text_fit_to_width">

View File

@ -991,10 +991,10 @@
The color of the title's text outline. The color of the title's text outline.
</theme_item> </theme_item>
<theme_item name="close_h_offset" data_type="constant" type="int" default="18"> <theme_item name="close_h_offset" data_type="constant" type="int" default="18">
Horizontal position offset of the close button. Horizontal position offset of the close button, relative to the end of the title bar, towards the beginning of the title bar.
</theme_item> </theme_item>
<theme_item name="close_v_offset" data_type="constant" type="int" default="24"> <theme_item name="close_v_offset" data_type="constant" type="int" default="24">
Vertical position offset of the close button. Vertical position offset of the close button, relative to the bottom of the title bar, towards the top of the title bar.
</theme_item> </theme_item>
<theme_item name="resize_margin" data_type="constant" type="int" default="4"> <theme_item name="resize_margin" data_type="constant" type="int" default="4">
Defines the outside margin at which the window border can be grabbed with mouse and resized. Defines the outside margin at which the window border can be grabbed with mouse and resized.

View File

@ -337,7 +337,7 @@ void Viewport::_sub_window_update(Window *p_window) {
sw.pending_window_update = false; sw.pending_window_update = false;
RS::get_singleton()->canvas_item_clear(sw.canvas_item); RS::get_singleton()->canvas_item_clear(sw.canvas_item);
Rect2i r = Rect2i(p_window->get_position(), p_window->get_size()); const Rect2i r = Rect2i(p_window->get_position(), p_window->get_size());
if (!p_window->get_flag(Window::FLAG_BORDERLESS)) { if (!p_window->get_flag(Window::FLAG_BORDERLESS)) {
Ref<StyleBox> panel = gui.subwindow_focused == p_window ? p_window->theme_cache.embedded_border : p_window->theme_cache.embedded_unfocused_border; Ref<StyleBox> panel = gui.subwindow_focused == p_window ? p_window->theme_cache.embedded_border : p_window->theme_cache.embedded_unfocused_border;
@ -351,18 +351,21 @@ void Viewport::_sub_window_update(Window *p_window) {
int close_h_ofs = p_window->theme_cache.close_h_offset; int close_h_ofs = p_window->theme_cache.close_h_offset;
int close_v_ofs = p_window->theme_cache.close_v_offset; int close_v_ofs = p_window->theme_cache.close_v_offset;
TextLine title_text = TextLine(p_window->get_translated_title(), title_font, font_size); const real_t title_space = r.size.width - panel->get_minimum_size().x - close_h_ofs;
title_text.set_width(r.size.width - panel->get_minimum_size().x - close_h_ofs); if (title_space > 0) {
title_text.set_direction(p_window->is_layout_rtl() ? TextServer::DIRECTION_RTL : TextServer::DIRECTION_LTR); TextLine title_text = TextLine(p_window->get_translated_title(), title_font, font_size);
int x = (r.size.width - title_text.get_size().x) / 2; title_text.set_width(title_space);
int y = (-title_height - title_text.get_size().y) / 2; title_text.set_direction(p_window->is_layout_rtl() ? TextServer::DIRECTION_RTL : TextServer::DIRECTION_LTR);
int x = (r.size.width - title_text.get_size().x) / 2;
int y = (-title_height - title_text.get_size().y) / 2;
Color font_outline_color = p_window->theme_cache.title_outline_modulate; Color font_outline_color = p_window->theme_cache.title_outline_modulate;
int outline_size = p_window->theme_cache.title_outline_size; int outline_size = p_window->theme_cache.title_outline_size;
if (outline_size > 0 && font_outline_color.a > 0) { if (outline_size > 0 && font_outline_color.a > 0) {
title_text.draw_outline(sw.canvas_item, r.position + Point2(x, y), outline_size, font_outline_color); title_text.draw_outline(sw.canvas_item, r.position + Point2(x, y), outline_size, font_outline_color);
}
title_text.draw(sw.canvas_item, r.position + Point2(x, y), title_color);
} }
title_text.draw(sw.canvas_item, r.position + Point2(x, y), title_color);
bool pressed = gui.subwindow_focused == sw.window && gui.subwindow_drag == SUB_WINDOW_DRAG_CLOSE && gui.subwindow_drag_close_inside; bool pressed = gui.subwindow_focused == sw.window && gui.subwindow_drag == SUB_WINDOW_DRAG_CLOSE && gui.subwindow_drag_close_inside;
Ref<Texture2D> close_icon = pressed ? p_window->theme_cache.close_pressed : p_window->theme_cache.close; Ref<Texture2D> close_icon = pressed ? p_window->theme_cache.close_pressed : p_window->theme_cache.close;