diff --git a/core/src/ui/mod.rs b/core/src/ui/mod.rs index 2998cbc..315ccd8 100644 --- a/core/src/ui/mod.rs +++ b/core/src/ui/mod.rs @@ -28,7 +28,7 @@ pub trait UiRsc { #[allow(unused_variables)] fn on_remove(&mut self, id: WidgetId) {} #[allow(unused_variables)] - fn on_draw(&mut self, active: &ActiveData) {} + fn on_draw(&mut self, active: &ActiveData, redrawn: bool) {} #[allow(unused_variables)] fn on_undraw(&mut self, active: &ActiveData) {} diff --git a/core/src/ui/render_state.rs b/core/src/ui/render_state.rs index 57e79a6..c1bca8c 100644 --- a/core/src/ui/render_state.rs +++ b/core/src/ui/render_state.rs @@ -81,10 +81,12 @@ impl UiRenderState { old_children: Option>, rsc: &mut dyn UiRsc, ) { + let mut redrawn = old_children.is_some(); let mut old_children = old_children.unwrap_or_default(); if let Some(active) = self.active.get_mut(&id) && !rsc.widgets().needs_redraw.contains(&id) { + redrawn = true; // check to see if we can skip drawing first if active.region == region { return; @@ -149,7 +151,7 @@ impl UiRenderState { } } - rsc.on_draw(&active); + rsc.on_draw(&active, redrawn); self.active.insert(id, active); } diff --git a/src/default/mod.rs b/src/default/mod.rs index 8d70485..085ed5d 100644 --- a/src/default/mod.rs +++ b/src/default/mod.rs @@ -146,12 +146,14 @@ impl UiRsc for DefaultRsc { &mut self.ui } - fn on_draw(&mut self, active: &ActiveData) { + fn on_draw(&mut self, active: &ActiveData, redrawn: bool) { self.events.draw(active); - self.widget_events.push(WidgetEvent { - id: active.id, - ty: WidgetEventType::Draw, - }); + if !redrawn { + self.widget_events.push(WidgetEvent { + id: active.id, + ty: WidgetEventType::Draw, + }); + } } fn on_undraw(&mut self, active: &ActiveData) {