[window] nice looking title bar separation line

This commit is contained in:
Emil Ernerfeldt 2020-05-23 20:24:55 +02:00
parent a8e5676a09
commit 6ab7cffd7f

View file

@ -169,6 +169,9 @@ impl<'open> Window<'open> {
let mut area = area.begin(ctx); let mut area = area.begin(ctx);
{ {
let mut frame = frame.begin(&mut area.content_ui); let mut frame = frame.begin(&mut area.content_ui);
let content_rect;
let title_bar;
{ {
let ui = &mut frame.content_ui; let ui = &mut frame.content_ui;
@ -179,7 +182,7 @@ impl<'open> Window<'open> {
default_expanded, default_expanded,
); );
let show_close_button = open.is_some(); let show_close_button = open.is_some();
let title_bar = show_title_bar( title_bar = show_title_bar(
ui, ui,
title_label, title_label,
show_close_button, show_close_button,
@ -187,10 +190,12 @@ impl<'open> Window<'open> {
&mut collapsing, &mut collapsing,
); );
let content = collapsing content_rect = collapsing
.add_contents(ui, |ui| { .add_contents(ui, |ui| {
resize.show(ui, |ui| { resize.show(ui, |ui| {
ui.add(Separator::new().line_width(0.5)); // TODO: nicer way to split window title from contents // Add some spacing (item_spacing) between title and content:
ui.allocate_space(Vec2::zero());
if let Some(scroll) = scroll { if let Some(scroll) = scroll {
scroll.show(ui, add_contents) scroll.show(ui, add_contents)
} else { } else {
@ -203,19 +208,12 @@ impl<'open> Window<'open> {
ui.memory() ui.memory()
.collapsing_headers .collapsing_headers
.insert(collapsing_id, collapsing); .insert(collapsing_id, collapsing);
if let Some(open) = open {
// Add close button now that we know our full width:
if title_bar.close_button_ui(ui, &content).clicked {
*open = false;
}
}
// TODO: pick style for title based on move interaction
title_bar.title_ui(ui);
} }
let outer_rect = frame.end(&mut area.content_ui); let outer_rect = frame.end(&mut area.content_ui);
title_bar.ui(&mut area.content_ui, outer_rect, content_rect, open);
let interaction = if possible.movable || possible.resizable { let interaction = if possible.movable || possible.resizable {
interact( interact(
ctx, ctx,
@ -577,13 +575,42 @@ fn show_title_bar(
} }
impl TitleBar { impl TitleBar {
pub fn title_ui(self, ui: &mut Ui) { fn ui(
self,
ui: &mut Ui,
outer_rect: Rect,
content_rect: Option<Rect>,
open: Option<&mut bool>,
) {
if let Some(open) = open {
// Add close button now that we know our full width:
if self.close_button_ui(ui, &content_rect).clicked {
*open = false;
}
}
// TODO: pick style for title based on move interaction
self.title_ui(ui);
if let Some(content_rect) = content_rect {
// paint separator between title and content:
let left = outer_rect.left();
let right = outer_rect.right();
let y = content_rect.top() + ui.style().item_spacing.y * 0.5;
ui.add_paint_cmd(PaintCmd::LineSegment {
points: [pos2(left, y), pos2(right, y)],
style: ui.style().interact.inactive.rect_outline.unwrap(),
});
}
}
fn title_ui(self, ui: &mut Ui) {
self.title_label self.title_label
.paint_galley(ui, self.title_rect.min, self.title_galley); .paint_galley(ui, self.title_rect.min, self.title_galley);
} }
pub fn close_button_ui(&self, ui: &mut Ui, content: &Option<Rect>) -> InteractInfo { fn close_button_ui(&self, ui: &mut Ui, content_rect: &Option<Rect>) -> InteractInfo {
let right = content.map(|c| c.right()).unwrap_or(self.rect.right()); let right = content_rect.map(|c| c.right()).unwrap_or(self.rect.right());
let button_size = ui.style().start_icon_width; let button_size = ui.style().start_icon_width;
let button_rect = Rect::from_min_size( let button_rect = Rect::from_min_size(