From 6fa5b18cc60f9be75727c560063bfe591bf99f3d Mon Sep 17 00:00:00 2001 From: Alexandre Bury Date: Sat, 23 Sep 2017 13:31:17 -0700 Subject: [PATCH] Add Canvas::wrap(View) Behaves like a dynamic ViewWrapper --- src/views/canvas.rs | 55 ++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/src/views/canvas.rs b/src/views/canvas.rs index fab5346..c500e5a 100644 --- a/src/views/canvas.rs +++ b/src/views/canvas.rs @@ -11,14 +11,29 @@ use view::View; pub struct Canvas { state: T, - draw: Box, - on_event: Box EventResult>, - required_size: Box Vec2>, - layout: Box, - take_focus: Box bool>, + draw: Box, + on_event: Box EventResult>, + required_size: Box Vec2>, + layout: Box, + take_focus: Box bool>, needs_relayout: Box bool>, } +impl Canvas { + /// Creates a new Canvas around the given view. + /// + /// By default, forwards all calls to the inner view. + pub fn wrap(view: T) -> Self { + Canvas::new(view) + .with_draw(T::draw) + .with_on_event(T::on_event) + .with_required_size(T::required_size) + .with_layout(T::layout) + .with_take_focus(T::take_focus) + .with_needs_relayout(T::needs_relayout) + } +} + impl Canvas { /// Creates a new, empty Canvas. /// @@ -50,7 +65,7 @@ impl Canvas { /// Sets the closure for `draw(&Printer)`. pub fn set_draw(&mut self, f: F) - where F: 'static + Fn(&Printer, &T) + where F: 'static + Fn(&T, &Printer) { self.draw = Box::new(f); } @@ -59,14 +74,14 @@ impl Canvas { /// /// Chainable variant. pub fn with_draw(self, f: F) -> Self - where F: 'static + Fn(&Printer, &T) + where F: 'static + Fn(&T, &Printer) { self.with(|s| s.set_draw(f)) } /// Sets the closure for `on_event(Event)`. pub fn set_on_event(&mut self, f: F) - where F: 'static + FnMut(Event, &mut T) -> EventResult + where F: 'static + FnMut(&mut T, Event) -> EventResult { self.on_event = Box::new(f); } @@ -75,14 +90,14 @@ impl Canvas { /// /// Chainable variant. pub fn with_on_event(self, f: F) -> Self - where F: 'static + FnMut(Event, &mut T) -> EventResult + where F: 'static + FnMut(&mut T, Event) -> EventResult { self.with(|s| s.set_on_event(f)) } /// Sets the closure for `required_size(Vec2)`. pub fn set_required_size(&mut self, f: F) - where F: 'static + FnMut(Vec2, &mut T) -> Vec2 + where F: 'static + FnMut(&mut T, Vec2) -> Vec2 { self.required_size = Box::new(f); } @@ -91,14 +106,14 @@ impl Canvas { /// /// Chainable variant. pub fn with_required_size(self, f: F) -> Self - where F: 'static + FnMut(Vec2, &mut T) -> Vec2 + where F: 'static + FnMut(&mut T, Vec2) -> Vec2 { self.with(|s| s.set_required_size(f)) } /// Sets the closure for `layout(Vec2)`. pub fn set_layout(&mut self, f: F) - where F: 'static + FnMut(Vec2, &mut T) + where F: 'static + FnMut(&mut T, Vec2) { self.layout = Box::new(f); } @@ -107,14 +122,14 @@ impl Canvas { /// /// Chainable variant. pub fn with_layout(self, f: F) -> Self - where F: 'static + FnMut(Vec2, &mut T) + where F: 'static + FnMut(&mut T, Vec2) { self.with(|s| s.set_layout(f)) } /// Sets the closure for `take_focus(Direction)`. pub fn set_take_focus(&mut self, f: F) - where F: 'static + FnMut(Direction, &mut T) -> bool + where F: 'static + FnMut(&mut T, Direction) -> bool { self.take_focus = Box::new(f); } @@ -123,7 +138,7 @@ impl Canvas { /// /// Chainable variant. pub fn with_take_focus(self, f: F) -> Self - where F: 'static + FnMut(Direction, &mut T) -> bool + where F: 'static + FnMut(&mut T, Direction) -> bool { self.with(|s| s.set_take_focus(f)) } @@ -148,22 +163,22 @@ impl Canvas { impl View for Canvas { fn draw(&self, printer: &Printer) { - (self.draw)(printer, &self.state); + (self.draw)(&self.state, printer); } fn on_event(&mut self, event: Event) -> EventResult { - (self.on_event)(event, &mut self.state) + (self.on_event)(&mut self.state, event) } fn required_size(&mut self, constraint: Vec2) -> Vec2 { - (self.required_size)(constraint, &mut self.state) + (self.required_size)(&mut self.state, constraint) } fn layout(&mut self, size: Vec2) { - (self.layout)(size, &mut self.state); + (self.layout)(&mut self.state, size); } fn take_focus(&mut self, source: Direction) -> bool { - (self.take_focus)(source, &mut self.state) + (self.take_focus)(&mut self.state, source) } }