From 32fd8dadda6636b11d4a1d9f59b467e57b3706a8 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 18 Mar 2022 22:13:52 +0700 Subject: Reintroduce generic `Message` type for `canvas::Program` As it is useful to make the `Message` completely free in many implementations. --- graphics/src/widget/canvas.rs | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) (limited to 'graphics/src/widget/canvas.rs') diff --git a/graphics/src/widget/canvas.rs b/graphics/src/widget/canvas.rs index ced2ce53..6c526e35 100644 --- a/graphics/src/widget/canvas.rs +++ b/graphics/src/widget/canvas.rs @@ -6,13 +6,6 @@ use crate::renderer::{self, Renderer}; use crate::{Backend, Primitive}; -use iced_native::layout; -use iced_native::mouse; -use iced_native::{ - Clipboard, Element, Layout, Length, Point, Rectangle, Shell, Size, Vector, - Widget, -}; - pub mod event; pub mod path; @@ -36,6 +29,15 @@ pub use program::Program; pub use stroke::{LineCap, LineDash, LineJoin, Stroke}; pub use text::Text; +use iced_native::layout; +use iced_native::mouse; +use iced_native::{ + Clipboard, Element, Layout, Length, Point, Rectangle, Shell, Size, Vector, + Widget, +}; + +use std::marker::PhantomData; + /// A widget capable of drawing 2D graphics. /// /// # Examples @@ -72,9 +74,7 @@ pub use text::Text; /// } /// /// // Then, we implement the `Program` trait -/// impl Program for Circle { -/// type Message = (); -/// +/// impl Program<()> for Circle { /// fn draw(&self, bounds: Rectangle, _cursor: Cursor) -> Vec{ /// // We prepare a new `Frame` /// let mut frame = Frame::new(bounds.size()); @@ -94,13 +94,14 @@ pub use text::Text; /// let canvas = Canvas::new(Circle { radius: 50.0 }); /// ``` #[derive(Debug)] -pub struct Canvas { +pub struct Canvas> { width: Length, height: Length, program: P, + message_: PhantomData, } -impl Canvas

{ +impl> Canvas { const DEFAULT_SIZE: u16 = 100; /// Creates a new [`Canvas`]. @@ -109,6 +110,7 @@ impl Canvas

{ width: Length::Units(Self::DEFAULT_SIZE), height: Length::Units(Self::DEFAULT_SIZE), program, + message_: PhantomData, } } @@ -125,9 +127,9 @@ impl Canvas

{ } } -impl Widget> for Canvas

+impl Widget> for Canvas where - P: Program, + P: Program, B: Backend, { fn width(&self) -> Length { @@ -156,7 +158,7 @@ where cursor_position: Point, _renderer: &Renderer, _clipboard: &mut dyn Clipboard, - shell: &mut Shell<'_, P::Message>, + shell: &mut Shell<'_, Message>, ) -> event::Status { let bounds = layout.bounds(); @@ -231,13 +233,14 @@ where } } -impl<'a, P, B> From> for Element<'a, P::Message, Renderer> +impl<'a, Message, P, B> From> + for Element<'a, Message, Renderer> where - P::Message: 'static, - P: Program + 'a, + Message: 'static, + P: Program + 'a, B: Backend, { - fn from(canvas: Canvas

) -> Element<'a, P::Message, Renderer> { + fn from(canvas: Canvas) -> Element<'a, Message, Renderer> { Element::new(canvas) } } -- cgit