Misc code cleanup
This commit is contained in:
parent
56502405f5
commit
e4afba3bb8
3 changed files with 98 additions and 87 deletions
|
@ -63,18 +63,15 @@ impl State {
|
|||
add_contents: impl FnOnce(&mut Ui) -> R,
|
||||
) -> Option<(R, Response)> {
|
||||
let openness = self.openness(ui.ctx(), id);
|
||||
let animate = 0.0 < openness && openness < 1.0;
|
||||
if animate {
|
||||
if openness <= 0.0 {
|
||||
None
|
||||
} else if openness < 1.0 {
|
||||
Some(ui.wrap(|child_ui| {
|
||||
let max_height = if self.open {
|
||||
if let Some(full_height) = self.open_height {
|
||||
remap_clamp(openness, 0.0..=1.0, 0.0..=full_height)
|
||||
} else {
|
||||
let max_height = if self.open && self.open_height.is_none() {
|
||||
// First frame of expansion.
|
||||
// We don't know full height yet, but we will next frame.
|
||||
// Just use a placeholder value that shows some movement:
|
||||
10.0
|
||||
}
|
||||
} else {
|
||||
let full_height = self.open_height.unwrap_or_default();
|
||||
remap_clamp(openness, 0.0..=1.0, 0.0..=full_height)
|
||||
|
@ -84,23 +81,21 @@ impl State {
|
|||
clip_rect.max.y = clip_rect.max.y.min(child_ui.max_rect().top() + max_height);
|
||||
child_ui.set_clip_rect(clip_rect);
|
||||
|
||||
let r = add_contents(child_ui);
|
||||
let ret = add_contents(child_ui);
|
||||
|
||||
self.open_height = Some(child_ui.min_size().y);
|
||||
|
||||
// Pretend children took up less space:
|
||||
let mut min_rect = child_ui.min_rect();
|
||||
min_rect.max.y = min_rect.max.y.min(min_rect.top() + max_height);
|
||||
self.open_height = Some(min_rect.height());
|
||||
|
||||
// Pretend children took up at most `max_height` space:
|
||||
min_rect.max.y = min_rect.max.y.at_most(min_rect.top() + max_height);
|
||||
child_ui.force_set_min_rect(min_rect);
|
||||
r
|
||||
ret
|
||||
}))
|
||||
} else if self.open || ui.memory().all_collpasing_are_open {
|
||||
} else {
|
||||
let (ret, response) = ui.wrap(add_contents);
|
||||
let full_size = response.rect.size();
|
||||
self.open_height = Some(full_size.y);
|
||||
Some((ret, response))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ pub struct Window<'open> {
|
|||
}
|
||||
|
||||
impl<'open> Window<'open> {
|
||||
// TODO: Into<Label>
|
||||
/// The winodw title must be unique, and should not change.
|
||||
pub fn new(title: impl Into<String>) -> Self {
|
||||
let title = title.into();
|
||||
let area = Area::new(&title);
|
||||
|
@ -40,7 +40,7 @@ impl<'open> Window<'open> {
|
|||
resize: Resize::default()
|
||||
.with_stroke(false)
|
||||
.min_size([96.0, 32.0])
|
||||
.default_size([420.0, 420.0]),
|
||||
.default_size([420.0, 420.0]), // Default inner size of a winodw
|
||||
scroll: None,
|
||||
collapsible: true,
|
||||
}
|
||||
|
@ -219,10 +219,6 @@ impl<'open> Window<'open> {
|
|||
// First interact (move etc) to avoid frame delay:
|
||||
let last_frame_outer_rect = area.state().rect();
|
||||
let interaction = if possible.movable || possible.resizable {
|
||||
let title_bar_height = title_label.font_height(ctx.fonts(), &ctx.style())
|
||||
+ 1.0 * ctx.style().spacing.item_spacing.y; // this could be better
|
||||
let margins = 2.0 * frame.margin + vec2(0.0, title_bar_height);
|
||||
|
||||
window_interaction(
|
||||
ctx,
|
||||
possible,
|
||||
|
@ -231,6 +227,11 @@ impl<'open> Window<'open> {
|
|||
last_frame_outer_rect,
|
||||
)
|
||||
.and_then(|window_interaction| {
|
||||
// Calculate roughly how much larger the window size is compared to the inner rect
|
||||
let title_bar_height = title_label.font_height(ctx.fonts(), &ctx.style())
|
||||
+ 1.0 * ctx.style().spacing.item_spacing.y; // this could be better
|
||||
let margins = 2.0 * frame.margin + vec2(0.0, title_bar_height);
|
||||
|
||||
interact(
|
||||
window_interaction,
|
||||
ctx,
|
||||
|
@ -276,9 +277,9 @@ impl<'open> Window<'open> {
|
|||
ui.allocate_space(ui.style().spacing.item_spacing);
|
||||
|
||||
if let Some(scroll) = scroll {
|
||||
scroll.show(ui, add_contents)
|
||||
scroll.show(ui, add_contents);
|
||||
} else {
|
||||
add_contents(ui)
|
||||
add_contents(ui);
|
||||
}
|
||||
})
|
||||
})
|
||||
|
@ -685,6 +686,7 @@ impl TitleBar {
|
|||
let left = outer_rect.left();
|
||||
let right = outer_rect.right();
|
||||
let y = content_response.rect.top() + ui.style().spacing.item_spacing.y * 0.5;
|
||||
// let y = lerp(self.rect.bottom()..=content_response.rect.top(), 0.5);
|
||||
ui.painter().line_segment(
|
||||
[pos2(left, y), pos2(right, y)],
|
||||
ui.style().visuals.widgets.inactive.bg_stroke,
|
||||
|
|
|
@ -673,10 +673,10 @@ fn mul_color(color: Srgba, factor: f32) -> Srgba {
|
|||
/// * `scratchpad_path`: if you plan to run `tessellate_paint_command`
|
||||
/// many times, pass it a reference to the same `Path` to avoid excessive allocations.
|
||||
fn tessellate_paint_command(
|
||||
clip_rect: Rect,
|
||||
command: PaintCmd,
|
||||
options: TesselationOptions,
|
||||
fonts: &Fonts,
|
||||
clip_rect: Rect,
|
||||
command: PaintCmd,
|
||||
out: &mut Triangles,
|
||||
scratchpad_points: &mut Vec<Pos2>,
|
||||
scratchpad_path: &mut Path,
|
||||
|
@ -773,6 +773,24 @@ fn tessellate_paint_command(
|
|||
text_style,
|
||||
color,
|
||||
} => {
|
||||
tesselate_text(
|
||||
options, fonts, clip_rect, pos, &galley, text_style, color, out,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
fn tesselate_text(
|
||||
options: TesselationOptions,
|
||||
fonts: &Fonts,
|
||||
clip_rect: Rect,
|
||||
pos: Pos2,
|
||||
galley: &super::Galley,
|
||||
text_style: super::TextStyle,
|
||||
color: Srgba,
|
||||
out: &mut Triangles,
|
||||
) {
|
||||
if color == TRANSPARENT {
|
||||
return;
|
||||
}
|
||||
|
@ -794,8 +812,7 @@ fn tessellate_paint_command(
|
|||
for line in &galley.rows {
|
||||
let line_min_y = pos.y + line.y_min + text_offset.x;
|
||||
let line_max_y = line_min_y + font.row_height();
|
||||
let is_line_visible =
|
||||
line_max_y >= clip_rect.min.y && line_min_y <= clip_rect.max.y;
|
||||
let is_line_visible = line_max_y >= clip_rect.min.y && line_min_y <= clip_rect.max.y;
|
||||
|
||||
for x_offset in line.x_offsets.iter().take(line.x_offsets.len() - 1) {
|
||||
let c = chars.next().unwrap();
|
||||
|
@ -807,8 +824,7 @@ fn tessellate_paint_command(
|
|||
}
|
||||
|
||||
if let Some(glyph) = font.uv_rect(c) {
|
||||
let mut left_top =
|
||||
pos + glyph.offset + vec2(*x_offset, line.y_min) + text_offset;
|
||||
let mut left_top = pos + glyph.offset + vec2(*x_offset, line.y_min) + text_offset;
|
||||
left_top.x = font.round_to_pixel(left_top.x); // Pixel-perfection.
|
||||
left_top.y = font.round_to_pixel(left_top.y); // Pixel-perfection.
|
||||
|
||||
|
@ -827,8 +843,6 @@ fn tessellate_paint_command(
|
|||
}
|
||||
assert_eq!(chars.next(), None);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Turns `PaintCmd`:s into sets of triangles.
|
||||
///
|
||||
|
@ -862,10 +876,10 @@ pub fn tessellate_paint_commands(
|
|||
|
||||
let out = &mut jobs.last_mut().unwrap().1;
|
||||
tessellate_paint_command(
|
||||
clip_rect,
|
||||
cmd,
|
||||
options,
|
||||
fonts,
|
||||
clip_rect,
|
||||
cmd,
|
||||
out,
|
||||
&mut scratchpad_points,
|
||||
&mut scratchpad_path,
|
||||
|
@ -875,6 +889,8 @@ pub fn tessellate_paint_commands(
|
|||
if options.debug_paint_clip_rects {
|
||||
for (clip_rect, triangles) in &mut jobs {
|
||||
tessellate_paint_command(
|
||||
options,
|
||||
fonts,
|
||||
Rect::everything(),
|
||||
PaintCmd::Rect {
|
||||
rect: *clip_rect,
|
||||
|
@ -882,8 +898,6 @@ pub fn tessellate_paint_commands(
|
|||
fill: Default::default(),
|
||||
stroke: Stroke::new(2.0, srgba(150, 255, 150, 255)),
|
||||
},
|
||||
options,
|
||||
fonts,
|
||||
triangles,
|
||||
&mut scratchpad_points,
|
||||
&mut scratchpad_path,
|
||||
|
|
Loading…
Reference in a new issue