diff --git a/egui_demo_lib/src/apps/demo/painting.rs b/egui_demo_lib/src/apps/demo/painting.rs index 61efed1c..2e4d2072 100644 --- a/egui_demo_lib/src/apps/demo/painting.rs +++ b/egui_demo_lib/src/apps/demo/painting.rs @@ -18,24 +18,24 @@ impl Default for Painting { } impl Painting { - pub fn ui_control(&mut self, ui: &mut Ui) { + pub fn ui_control(&mut self, ui: &mut egui::Ui) -> egui::Response { ui.horizontal(|ui| { egui::stroke_ui(ui, &mut self.stroke, "Stroke"); ui.separator(); if ui.button("Clear Painting").clicked() { self.lines.clear(); } - }); + }) + .response } - pub fn ui_content(&mut self, ui: &mut Ui) { - let (response, painter) = + pub fn ui_content(&mut self, ui: &mut Ui) -> egui::Response { + let (mut response, painter) = ui.allocate_painter(ui.available_size_before_wrap_finite(), Sense::drag()); - let rect = response.rect; let to_screen = emath::RectTransform::from_to( - Rect::from_min_size(Pos2::ZERO, rect.square_proportions()), - rect, + Rect::from_min_size(Pos2::ZERO, response.rect.square_proportions()), + response.rect, ); let from_screen = to_screen.inverse(); @@ -49,17 +49,23 @@ impl Painting { let canvas_pos = from_screen * pointer_pos; if current_line.last() != Some(&canvas_pos) { current_line.push(canvas_pos); + response.mark_changed(); } } else if !current_line.is_empty() { self.lines.push(vec![]); + response.mark_changed(); } + let mut shapes = vec![]; for line in &self.lines { if line.len() >= 2 { let points: Vec = line.iter().map(|p| to_screen * *p).collect(); - painter.add(Shape::line(points, self.stroke)); + shapes.push(egui::Shape::line(points, self.stroke)); } } + painter.extend(shapes); + + response } }