diff options
author | 2022-03-18 22:13:52 +0700 | |
---|---|---|
committer | 2022-03-18 22:13:52 +0700 | |
commit | 32fd8dadda6636b11d4a1d9f59b467e57b3706a8 (patch) | |
tree | 6acb0c0d0a14c032939412f8d177dc08c5fd75aa /graphics/src/widget/canvas.rs | |
parent | d7100fd2597da82d97eaf196d50573ea64f3f8ff (diff) | |
download | iced-32fd8dadda6636b11d4a1d9f59b467e57b3706a8.tar.gz iced-32fd8dadda6636b11d4a1d9f59b467e57b3706a8.tar.bz2 iced-32fd8dadda6636b11d4a1d9f59b467e57b3706a8.zip |
Reintroduce generic `Message` type for `canvas::Program`
As it is useful to make the `Message` completely free in many
implementations.
Diffstat (limited to 'graphics/src/widget/canvas.rs')
-rw-r--r-- | graphics/src/widget/canvas.rs | 41 |
1 files changed, 22 insertions, 19 deletions
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<Geometry>{ /// // 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<P: Program> { +pub struct Canvas<Message, P: Program<Message>> { width: Length, height: Length, program: P, + message_: PhantomData<Message>, } -impl<P: Program> Canvas<P> { +impl<Message, P: Program<Message>> Canvas<Message, P> { const DEFAULT_SIZE: u16 = 100; /// Creates a new [`Canvas`]. @@ -109,6 +110,7 @@ impl<P: Program> Canvas<P> { width: Length::Units(Self::DEFAULT_SIZE), height: Length::Units(Self::DEFAULT_SIZE), program, + message_: PhantomData, } } @@ -125,9 +127,9 @@ impl<P: Program> Canvas<P> { } } -impl<P, B> Widget<P::Message, Renderer<B>> for Canvas<P> +impl<Message, P, B> Widget<Message, Renderer<B>> for Canvas<Message, P> where - P: Program, + P: Program<Message>, B: Backend, { fn width(&self) -> Length { @@ -156,7 +158,7 @@ where cursor_position: Point, _renderer: &Renderer<B>, _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<Canvas<P>> for Element<'a, P::Message, Renderer<B>> +impl<'a, Message, P, B> From<Canvas<Message, P>> + for Element<'a, Message, Renderer<B>> where - P::Message: 'static, - P: Program + 'a, + Message: 'static, + P: Program<Message> + 'a, B: Backend, { - fn from(canvas: Canvas<P>) -> Element<'a, P::Message, Renderer<B>> { + fn from(canvas: Canvas<Message, P>) -> Element<'a, Message, Renderer<B>> { Element::new(canvas) } } |