egui: Fixed window title bar incorrect handling spacing (#3995)
Currently, the window title bar does not correctly handle the `item_spacing` and `window_margin`. * Video snapshot on changing the `item_spacing` and `window_margin` (master) [egui-demo-app-incorrect.webm](https://github.com/emilk/egui/assets/1274171/a4e32d43-69b5-44be-a4c3-97b0533147ca) * Video snapshot on changing the `item_spacing` and `window_margin` (feature/fix-window-title-bar) [egui-demo-app-fixed.webm](https://github.com/emilk/egui/assets/1274171/42bbc210-a1f3-4e0a-ab71-d068e58e0e35)
This commit is contained in:
parent
b35a7dd7de
commit
377f86efb5
|
|
@ -416,14 +416,15 @@ impl<'open> Window<'open> {
|
||||||
let on_top = Some(area_layer_id) == ctx.top_layer_id();
|
let on_top = Some(area_layer_id) == ctx.top_layer_id();
|
||||||
let mut area = area.begin(ctx);
|
let mut area = area.begin(ctx);
|
||||||
|
|
||||||
let title_content_spacing = 2.0 * ctx.style().spacing.item_spacing.y;
|
|
||||||
|
|
||||||
// Calculate roughly how much larger the window size is compared to the inner rect
|
// Calculate roughly how much larger the window size is compared to the inner rect
|
||||||
let title_bar_height = if with_title_bar {
|
let (title_bar_height, title_content_spacing) = if with_title_bar {
|
||||||
let style = ctx.style();
|
let style = ctx.style();
|
||||||
ctx.fonts(|f| title.font_height(f, &style)) + title_content_spacing * 2.0
|
let window_margin = style.spacing.window_margin;
|
||||||
|
let spacing = window_margin.top + window_margin.bottom;
|
||||||
|
let height = ctx.fonts(|f| title.font_height(f, &style)) + spacing;
|
||||||
|
(height, spacing)
|
||||||
} else {
|
} else {
|
||||||
0.0
|
(0.0, 0.0)
|
||||||
};
|
};
|
||||||
|
|
||||||
// First interact (move etc) to avoid frame delay:
|
// First interact (move etc) to avoid frame delay:
|
||||||
|
|
@ -466,6 +467,11 @@ impl<'open> Window<'open> {
|
||||||
|
|
||||||
let where_to_put_header_background = &area_content_ui.painter().add(Shape::Noop);
|
let where_to_put_header_background = &area_content_ui.painter().add(Shape::Noop);
|
||||||
|
|
||||||
|
// Backup item spacing before the title bar
|
||||||
|
let item_spacing = frame.content_ui.spacing().item_spacing;
|
||||||
|
// Use title bar spacing as the item spacing before the content
|
||||||
|
frame.content_ui.spacing_mut().item_spacing.y = title_content_spacing;
|
||||||
|
|
||||||
let title_bar = if with_title_bar {
|
let title_bar = if with_title_bar {
|
||||||
let title_bar = show_title_bar(
|
let title_bar = show_title_bar(
|
||||||
&mut frame.content_ui,
|
&mut frame.content_ui,
|
||||||
|
|
@ -480,13 +486,15 @@ impl<'open> Window<'open> {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
let (content_inner, content_response) = collapsing
|
// Remove item spacing after the title bar
|
||||||
.show_body_unindented(&mut frame.content_ui, |ui| {
|
frame.content_ui.spacing_mut().item_spacing.y = 0.0;
|
||||||
resize.show(ui, |ui| {
|
|
||||||
if title_bar.is_some() {
|
|
||||||
ui.add_space(title_content_spacing);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
let (content_inner, mut content_response) = collapsing
|
||||||
|
.show_body_unindented(&mut frame.content_ui, |ui| {
|
||||||
|
// Restore item spacing for the content
|
||||||
|
ui.spacing_mut().item_spacing.y = item_spacing.y;
|
||||||
|
|
||||||
|
resize.show(ui, |ui| {
|
||||||
if scroll.is_any_scroll_enabled() {
|
if scroll.is_any_scroll_enabled() {
|
||||||
scroll.show(ui, add_contents).inner
|
scroll.show(ui, add_contents).inner
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -523,6 +531,11 @@ impl<'open> Window<'open> {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Fix title bar separator line position
|
||||||
|
if let Some(response) = &mut content_response {
|
||||||
|
response.rect.min.y = outer_rect.min.y + title_bar_height;
|
||||||
|
}
|
||||||
|
|
||||||
title_bar.ui(
|
title_bar.ui(
|
||||||
&mut area_content_ui,
|
&mut area_content_ui,
|
||||||
outer_rect,
|
outer_rect,
|
||||||
|
|
@ -1026,7 +1039,7 @@ impl TitleBar {
|
||||||
|
|
||||||
if let Some(content_response) = &content_response {
|
if let Some(content_response) = &content_response {
|
||||||
// paint separator between title and content:
|
// paint separator between title and content:
|
||||||
let y = content_response.rect.top() + ui.spacing().item_spacing.y * 0.5;
|
let y = content_response.rect.top();
|
||||||
// let y = lerp(self.rect.bottom()..=content_response.rect.top(), 0.5);
|
// let y = lerp(self.rect.bottom()..=content_response.rect.top(), 0.5);
|
||||||
let stroke = ui.visuals().widgets.noninteractive.bg_stroke;
|
let stroke = ui.visuals().widgets.noninteractive.bg_stroke;
|
||||||
ui.painter().hline(outer_rect.x_range(), y, stroke);
|
ui.painter().hline(outer_rect.x_range(), y, stroke);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue