diff --git a/src/handwriting/mod.rs b/src/handwriting/mod.rs index 5b4cb94..56be278 100644 --- a/src/handwriting/mod.rs +++ b/src/handwriting/mod.rs @@ -89,6 +89,9 @@ struct Ephemeral { /// Tool position last frame, in canvas space. last_tool_position: Option, + /// Whether the handwriting element is being interacted with. + is_focused: bool, + /// The stroke that is currently being drawed. current_stroke: Vec, @@ -142,6 +145,7 @@ impl Default for Ephemeral { tool: Tool::Eraser, tool_position: None, last_tool_position: None, + is_focused: false, current_stroke: Default::default(), tessellator: None, mesh: Default::default(), @@ -238,9 +242,16 @@ impl Handwriting { // Was the user in the process of drawing a stroke last frame? 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(); + 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 was_drawing { // commit current line @@ -248,12 +259,18 @@ impl Handwriting { response.mark_changed(); } + let padding = if self.e.is_focused { + HANDWRITING_BOTTOM_PADDING + } else { + 0.0 + }; + // recalculate how tall the widget should be let lines_max_y = self .strokes .iter() .flatten() - .map(|p| p.y + HANDWRITING_BOTTOM_PADDING) + .map(|p| p.y + padding) .fold(HANDWRITING_MIN_HEIGHT, |max, y| max.max(y)); // Change the height of the handwriting item.