diff --git a/src/core/frame.rs b/src/core/frame.rs index 473780e..a3f7a94 100644 --- a/src/core/frame.rs +++ b/src/core/frame.rs @@ -6,7 +6,7 @@ pub struct Regioned { } impl Widget for Regioned { - fn draw(&self, mut painter: Painter) { + fn draw(&self, painter: &mut Painter) { painter.draw_within(&self.inner, self.region); } } diff --git a/src/core/image.rs b/src/core/image.rs index 74933db..0ac9c8f 100644 --- a/src/core/image.rs +++ b/src/core/image.rs @@ -7,7 +7,7 @@ pub struct Image { } impl Widget for Image { - fn draw(&self, mut painter: Painter) { + fn draw(&self, painter: &mut Painter) { if let Some(handle) = &self.handle { painter.draw_texture(handle); } else { diff --git a/src/core/rect.rs b/src/core/rect.rs index 24a840a..0787073 100644 --- a/src/core/rect.rs +++ b/src/core/rect.rs @@ -28,7 +28,7 @@ impl Rect { } impl Widget for Rect { - fn draw(&self, mut painter: Painter) { + fn draw(&self, painter: &mut Painter) { painter.write(RectPrimitive { color: self.color, radius: self.radius, diff --git a/src/core/span.rs b/src/core/span.rs index 0c9da6a..14398dd 100644 --- a/src/core/span.rs +++ b/src/core/span.rs @@ -6,7 +6,7 @@ pub struct Span { } impl Widget for Span { - fn draw(&self, mut painter: Painter) { + fn draw(&self, painter: &mut Painter) { let total = self.sums(); let mut start = UIScalar::min(); for (child, length) in &self.children { diff --git a/src/core/stack.rs b/src/core/stack.rs index d63127c..1bd9d13 100644 --- a/src/core/stack.rs +++ b/src/core/stack.rs @@ -5,7 +5,7 @@ pub struct Stack { } impl Widget for Stack { - fn draw(&self, mut painter: Painter) { + fn draw(&self, painter: &mut Painter) { for child in &self.children { painter.draw(child); } diff --git a/src/layout/painter.rs b/src/layout/painter.rs index 81c55c1..da3078c 100644 --- a/src/layout/painter.rs +++ b/src/layout/painter.rs @@ -60,20 +60,22 @@ impl<'a, Ctx> Painter<'a, Ctx> { if self.sensors_map.get(&id.id).is_some() { self.active_sensors.push((region, id.id.duplicate())); } - self.nodes.get_dyn(id).draw(Painter { - nodes: self.nodes, - ctx: self.ctx, - sensors_map: self.sensors_map, - active_sensors: self.active_sensors, - primitives: self.primitives, - region, - }); + // &mut self is passed to avoid copying all of the "static" pointers in self + // so need to save non static data here + let old = self.region; + self.region = region; + self.nodes.get_dyn(id).draw(self); + self.region = old; } pub fn draw_texture(&mut self, handle: &TextureHandle) { self.write(handle.inner); } + pub fn region(&self) -> UiRegion { + self.region + } + pub fn ctx(&mut self) -> &mut Ctx { self.ctx } diff --git a/src/layout/widget.rs b/src/layout/widget.rs index dd6e425..8894f47 100644 --- a/src/layout/widget.rs +++ b/src/layout/widget.rs @@ -2,7 +2,7 @@ use crate::{Painter, Ui, WidgetId, WidgetIdFnRet}; use std::{any::Any, marker::PhantomData}; pub trait Widget: Any { - fn draw(&self, painter: Painter); + fn draw(&self, painter: &mut Painter); } pub struct WidgetTag;