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" />
<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.
[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>
</method>
<method name="shaped_text_draw_outline" qualifiers="const">
@ -1414,6 +1415,7 @@
<param index="7" name="oversampling" type="float" default="0.0" />
<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.
[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>
</method>
<method name="shaped_text_fit_to_width">

View File

@ -991,10 +991,10 @@
The color of the title's text outline.
</theme_item>
<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 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 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.

View File

@ -337,7 +337,7 @@ void Viewport::_sub_window_update(Window *p_window) {
sw.pending_window_update = false;
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)) {
Ref<StyleBox> panel = gui.subwindow_focused == p_window ? p_window->theme_cache.embedded_border : p_window->theme_cache.embedded_unfocused_border;
@ -351,8 +351,10 @@ void Viewport::_sub_window_update(Window *p_window) {
int close_h_ofs = p_window->theme_cache.close_h_offset;
int close_v_ofs = p_window->theme_cache.close_v_offset;
const real_t title_space = r.size.width - panel->get_minimum_size().x - close_h_ofs;
if (title_space > 0) {
TextLine title_text = TextLine(p_window->get_translated_title(), title_font, font_size);
title_text.set_width(r.size.width - panel->get_minimum_size().x - close_h_ofs);
title_text.set_width(title_space);
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;
@ -363,6 +365,7 @@ void Viewport::_sub_window_update(Window *p_window) {
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);
}
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;