Collaping header and indent: add a closing horizontal line
This commit is contained in:
parent
829455b347
commit
c536e1b0da
4 changed files with 56 additions and 10 deletions
|
@ -254,7 +254,14 @@ impl CollapsingHeader {
|
||||||
header_response,
|
header_response,
|
||||||
mut state,
|
mut state,
|
||||||
} = self.begin(ui);
|
} = self.begin(ui);
|
||||||
let ret_response = state.add_contents(ui, id, |ui| ui.indent(id, add_contents).0);
|
let ret_response = state.add_contents(ui, id, |ui| {
|
||||||
|
ui.indent(id, |ui| {
|
||||||
|
// make as wide as the header:
|
||||||
|
ui.expand_to_include_x(header_response.rect.right());
|
||||||
|
add_contents(ui)
|
||||||
|
})
|
||||||
|
.0
|
||||||
|
});
|
||||||
ui.memory().collapsing_headers.insert(id, state);
|
ui.memory().collapsing_headers.insert(id, state);
|
||||||
|
|
||||||
if let Some((ret, response)) = ret_response {
|
if let Some((ret, response)) = ret_response {
|
||||||
|
|
|
@ -60,6 +60,16 @@ impl Region {
|
||||||
self.min_rect = self.min_rect.union(rect);
|
self.min_rect = self.min_rect.union(rect);
|
||||||
self.max_rect = self.max_rect.union(rect);
|
self.max_rect = self.max_rect.union(rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Ensure we are big enough to contain the given x-coordinate.
|
||||||
|
/// This is sometimes useful to expand an ui to stretch to a certain place.
|
||||||
|
pub fn expand_to_include_x(&mut self, x: f32) {
|
||||||
|
self.min_rect.min.x = self.min_rect.min.x.min(x);
|
||||||
|
self.min_rect.max.x = self.min_rect.max.x.max(x);
|
||||||
|
|
||||||
|
self.max_rect.min.x = self.max_rect.min.x.min(x);
|
||||||
|
self.max_rect.max.x = self.max_rect.max.x.max(x);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
|
@ -118,12 +118,16 @@ impl Placer {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Advance the cursor by this many points.
|
/// Advance the cursor by this many points.
|
||||||
|
/// [`Self::min_rect`] will expand to contain the cursor.
|
||||||
pub(crate) fn advance_cursor(&mut self, amount: f32) {
|
pub(crate) fn advance_cursor(&mut self, amount: f32) {
|
||||||
debug_assert!(
|
debug_assert!(
|
||||||
self.grid.is_none(),
|
self.grid.is_none(),
|
||||||
"You cannot advance the cursor when in a grid layout"
|
"You cannot advance the cursor when in a grid layout"
|
||||||
);
|
);
|
||||||
self.layout.advance_cursor(&mut self.region.cursor, amount)
|
self.layout.advance_cursor(&mut self.region.cursor, amount);
|
||||||
|
|
||||||
|
self.region
|
||||||
|
.expand_to_include_rect(Rect::from_min_size(self.cursor(), Vec2::zero()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Advance cursor after a widget was added to a specific rectangle
|
/// Advance cursor after a widget was added to a specific rectangle
|
||||||
|
@ -167,6 +171,11 @@ impl Placer {
|
||||||
self.region.expand_to_include_rect(rect);
|
self.region.expand_to_include_rect(rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Expand the `min_rect` and `max_rect` of this ui to include a child at the given x-coordinate.
|
||||||
|
pub(crate) fn expand_to_include_x(&mut self, x: f32) {
|
||||||
|
self.region.expand_to_include_x(x);
|
||||||
|
}
|
||||||
|
|
||||||
/// Set the maximum width of the ui.
|
/// Set the maximum width of the ui.
|
||||||
/// You won't be able to shrink it below the current minimum size.
|
/// You won't be able to shrink it below the current minimum size.
|
||||||
pub(crate) fn set_max_width(&mut self, width: f32) {
|
pub(crate) fn set_max_width(&mut self, width: f32) {
|
||||||
|
|
|
@ -311,6 +311,12 @@ impl Ui {
|
||||||
self.set_max_width(width);
|
self.set_max_width(width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Ensure we are big enough to contain the given x-coordinate.
|
||||||
|
/// This is sometimes useful to expand an ui to stretch to a certain place.
|
||||||
|
pub fn expand_to_include_x(&mut self, x: f32) {
|
||||||
|
self.placer.expand_to_include_x(x);
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// Layout related measures:
|
// Layout related measures:
|
||||||
|
|
||||||
|
@ -426,8 +432,11 @@ impl Ui {
|
||||||
// Stuff that moves the cursor, i.e. allocates space in this ui!
|
// Stuff that moves the cursor, i.e. allocates space in this ui!
|
||||||
|
|
||||||
/// Advance the cursor (where the next widget is put) by this many points.
|
/// Advance the cursor (where the next widget is put) by this many points.
|
||||||
|
///
|
||||||
/// The direction is dependent on the layout.
|
/// The direction is dependent on the layout.
|
||||||
/// This is useful for creating some extra space between widgets.
|
/// This is useful for creating some extra space between widgets.
|
||||||
|
///
|
||||||
|
/// [`Self::min_rect`] will expand to contain the cursor.
|
||||||
pub fn advance_cursor(&mut self, amount: f32) {
|
pub fn advance_cursor(&mut self, amount: f32) {
|
||||||
self.placer.advance_cursor(amount);
|
self.placer.advance_cursor(amount);
|
||||||
}
|
}
|
||||||
|
@ -965,16 +974,27 @@ impl Ui {
|
||||||
..self.child_ui(child_rect, *self.layout())
|
..self.child_ui(child_rect, *self.layout())
|
||||||
};
|
};
|
||||||
let ret = add_contents(&mut child_ui);
|
let ret = add_contents(&mut child_ui);
|
||||||
|
|
||||||
|
let end_with_horizontal_line = true;
|
||||||
|
if end_with_horizontal_line {
|
||||||
|
child_ui.advance_cursor(4.0);
|
||||||
|
}
|
||||||
|
|
||||||
let size = child_ui.min_size();
|
let size = child_ui.min_size();
|
||||||
|
|
||||||
// draw a grey line on the left to mark the indented section
|
// draw a faint line on the left to mark the indented section
|
||||||
let line_start = child_rect.min - indent * 0.5;
|
let stroke = self.visuals().widgets.noninteractive.bg_stroke;
|
||||||
let line_start = self.painter().round_pos_to_pixels(line_start);
|
let left_top = child_rect.min - indent * 0.5;
|
||||||
let line_end = pos2(line_start.x, line_start.y + size.y - 2.0);
|
let left_top = self.painter().round_pos_to_pixels(left_top);
|
||||||
self.painter.line_segment(
|
let left_bottom = pos2(left_top.x, left_top.y + size.y - 2.0);
|
||||||
[line_start, line_end],
|
let left_bottom = self.painter().round_pos_to_pixels(left_bottom);
|
||||||
self.visuals().widgets.noninteractive.bg_stroke,
|
self.painter.line_segment([left_top, left_bottom], stroke);
|
||||||
);
|
if end_with_horizontal_line {
|
||||||
|
let fudge = 2.0; // looks nicer with button rounding in collapsing headers
|
||||||
|
let right_bottom = pos2(child_ui.min_rect().right() - fudge, left_bottom.y);
|
||||||
|
self.painter
|
||||||
|
.line_segment([left_bottom, right_bottom], stroke);
|
||||||
|
}
|
||||||
|
|
||||||
let response = self.allocate_response(indent + size, Sense::hover());
|
let response = self.allocate_response(indent + size, Sense::hover());
|
||||||
(ret, response)
|
(ret, response)
|
||||||
|
|
Loading…
Reference in a new issue