From e4eb0553de13053c9828fd5454c281e27e598d65 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 28 Apr 2020 03:46:03 +0200 Subject: Allow `canvas::State` to produce messages --- wgpu/src/widget/canvas.rs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'wgpu/src/widget/canvas.rs') diff --git a/wgpu/src/widget/canvas.rs b/wgpu/src/widget/canvas.rs index 744d901e..044bc3ec 100644 --- a/wgpu/src/widget/canvas.rs +++ b/wgpu/src/widget/canvas.rs @@ -13,6 +13,7 @@ use iced_native::{ MouseCursor, Point, Size, Vector, Widget, }; use std::hash::Hash; +use std::marker::PhantomData; pub mod path; @@ -91,16 +92,17 @@ pub use text::Text; /// let cache = Cache::new(); /// /// // Finally, we simply use our `Cache` to create the `Canvas`! -/// let canvas = Canvas::new(cache.with(Circle { radius: 50.0 })); +/// let canvas: Canvas<_, ()> = Canvas::new(cache.with(Circle { radius: 50.0 })); /// ``` #[derive(Debug)] -pub struct Canvas { +pub struct Canvas, Message> { width: Length, height: Length, state: S, + phantom: PhantomData, } -impl Canvas { +impl> Canvas { const DEFAULT_SIZE: u16 = 100; /// Creates a new [`Canvas`] with no layers. @@ -111,6 +113,7 @@ impl Canvas { width: Length::Units(Self::DEFAULT_SIZE), height: Length::Units(Self::DEFAULT_SIZE), state, + phantom: PhantomData, } } @@ -131,7 +134,9 @@ impl Canvas { } } -impl Widget for Canvas { +impl> Widget + for Canvas +{ fn width(&self) -> Length { self.width } @@ -156,7 +161,7 @@ impl Widget for Canvas { event: iced_native::Event, layout: Layout<'_>, cursor_position: Point, - _messages: &mut Vec, + messages: &mut Vec, _renderer: &Renderer, _clipboard: Option<&dyn Clipboard>, ) { @@ -178,7 +183,11 @@ impl Widget for Canvas { }; if let Some(canvas_event) = canvas_event { - self.state.update(canvas_event, bounds.size()) + if let Some(message) = + self.state.update(canvas_event, bounds.size()) + { + messages.push(message); + } } } @@ -218,12 +227,12 @@ impl Widget for Canvas { } } -impl<'a, Message, S: State + 'a> From> +impl<'a, Message, S: State + 'a> From> for Element<'a, Message, Renderer> where Message: 'static, { - fn from(canvas: Canvas) -> Element<'a, Message, Renderer> { + fn from(canvas: Canvas) -> Element<'a, Message, Renderer> { Element::new(canvas) } } -- cgit