diff options
Diffstat (limited to 'native/src/widget/image.rs')
-rw-r--r-- | native/src/widget/image.rs | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/native/src/widget/image.rs b/native/src/widget/image.rs new file mode 100644 index 00000000..17f06ebe --- /dev/null +++ b/native/src/widget/image.rs @@ -0,0 +1,67 @@ +//! Display images in your user interface. + +use crate::{ + Element, Hasher, Layout, MouseCursor, Node, Point, Rectangle, Widget, +}; + +use std::hash::Hash; + +pub use iced_core::Image; + +impl<I, Message, Renderer> Widget<Message, Renderer> for Image<I> +where + Renderer: self::Renderer<I>, + I: Clone, +{ + fn node(&self, renderer: &mut Renderer) -> Node { + renderer.node(&self) + } + + fn draw( + &self, + renderer: &mut Renderer, + layout: Layout<'_>, + _cursor_position: Point, + ) -> MouseCursor { + renderer.draw(&self, layout); + + MouseCursor::OutOfBounds + } + + fn hash_layout(&self, state: &mut Hasher) { + self.width.hash(state); + self.height.hash(state); + } +} + +/// The renderer of an [`Image`]. +/// +/// Your [renderer] will need to implement this trait before being able to use +/// an [`Image`] in your user interface. +/// +/// [`Image`]: struct.Image.html +/// [renderer]: ../../renderer/index.html +pub trait Renderer<I> { + /// Creates a [`Node`] for the provided [`Image`]. + /// + /// You should probably keep the original aspect ratio, if possible. + /// + /// [`Node`]: ../../struct.Node.html + /// [`Image`]: struct.Image.html + fn node(&mut self, image: &Image<I>) -> Node; + + /// Draws an [`Image`]. + /// + /// [`Image`]: struct.Image.html + fn draw(&mut self, image: &Image<I>, layout: Layout<'_>); +} + +impl<'a, I, Message, Renderer> From<Image<I>> for Element<'a, Message, Renderer> +where + Renderer: self::Renderer<I>, + I: Clone + 'a, +{ + fn from(image: Image<I>) -> Element<'a, Message, Renderer> { + Element::new(image) + } +} |