1 Commits

Author SHA1 Message Date
efbea10532 Shrink handwriting when not focused [wip] 2025-09-27 14:39:57 +02:00

View File

@ -78,6 +78,9 @@ struct Ephemeral {
canvas_rasterizer: CanvasRasterizer, canvas_rasterizer: CanvasRasterizer,
/// Whether the handwriting element is being interacted with.
is_focused: bool,
/// The stroke that is currently being drawed. /// The stroke that is currently being drawed.
current_stroke: Vec<Pos2>, current_stroke: Vec<Pos2>,
@ -128,6 +131,7 @@ impl Default for Ephemeral {
Self { Self {
id: random_id(), id: random_id(),
canvas_rasterizer: Default::default(), canvas_rasterizer: Default::default(),
is_focused: false,
current_stroke: Default::default(), current_stroke: Default::default(),
tessellator: None, tessellator: None,
mesh: Default::default(), mesh: Default::default(),
@ -214,9 +218,16 @@ impl Handwriting {
// Was the user in the process of drawing a stroke last frame? // Was the user in the process of drawing a stroke last frame?
let was_drawing = !self.e.current_stroke.is_empty(); let was_drawing = !self.e.current_stroke.is_empty();
// Is the user in the process of drawing a stroke now? // Is the user in the process of drawing a stroke now?;
let is_drawing = response.interact_pointer_pos().is_some(); let is_drawing = response.interact_pointer_pos().is_some();
if is_drawing {
self.e.is_focused = true;
} else if ui.ctx().input(|i| i.pointer.any_down()) {
// if the user starts interactive with something else, unfocus the handwriting area.
self.e.is_focused = false;
}
if !is_drawing { if !is_drawing {
if was_drawing { if was_drawing {
// commit current line // commit current line
@ -224,12 +235,18 @@ impl Handwriting {
response.mark_changed(); response.mark_changed();
} }
let padding = if self.e.is_focused {
HANDWRITING_BOTTOM_PADDING
} else {
0.0
};
// recalculate how tall the widget should be // recalculate how tall the widget should be
let lines_max_y = self let lines_max_y = self
.strokes .strokes
.iter() .iter()
.flatten() .flatten()
.map(|p| p.y + HANDWRITING_BOTTOM_PADDING) .map(|p| p.y + padding)
.fold(HANDWRITING_MIN_HEIGHT, |max, y| max.max(y)); .fold(HANDWRITING_MIN_HEIGHT, |max, y| max.max(y));
// Change the height of the handwriting item. // Change the height of the handwriting item.