diff options
author | 2019-12-06 19:37:56 +0100 | |
---|---|---|
committer | 2019-12-11 21:34:40 +0100 | |
commit | a88aae5e04e0a92457e5dd617a86af823e90af6c (patch) | |
tree | 2b3601cc15d041709a883c3b80685cf8e0baaa20 | |
parent | 80324284282f173e4d26e1f297daaf71a93f51a6 (diff) | |
download | iced-a88aae5e04e0a92457e5dd617a86af823e90af6c.tar.gz iced-a88aae5e04e0a92457e5dd617a86af823e90af6c.tar.bz2 iced-a88aae5e04e0a92457e5dd617a86af823e90af6c.zip |
Added an `Icon` widget to native.
-rw-r--r-- | native/src/widget.rs | 3 | ||||
-rw-r--r-- | native/src/widget/icon.rs | 103 | ||||
-rw-r--r-- | src/native.rs | 7 | ||||
-rw-r--r-- | wgpu/src/primitive.rs | 6 | ||||
-rw-r--r-- | wgpu/src/renderer/widget.rs | 1 | ||||
-rw-r--r-- | wgpu/src/renderer/widget/icon.rs | 21 | ||||
-rw-r--r-- | wgpu/src/svg.rs | 3 |
7 files changed, 138 insertions, 6 deletions
diff --git a/native/src/widget.rs b/native/src/widget.rs index 71dcdc0d..0cf6a639 100644 --- a/native/src/widget.rs +++ b/native/src/widget.rs @@ -24,6 +24,7 @@ pub mod button; pub mod checkbox; pub mod column; pub mod container; +pub mod icon; pub mod image; pub mod radio; pub mod row; @@ -41,6 +42,8 @@ pub use column::Column; #[doc(no_inline)] pub use container::Container; #[doc(no_inline)] +pub use icon::Icon; +#[doc(no_inline)] pub use image::Image; #[doc(no_inline)] pub use radio::Radio; diff --git a/native/src/widget/icon.rs b/native/src/widget/icon.rs new file mode 100644 index 00000000..4687d7e6 --- /dev/null +++ b/native/src/widget/icon.rs @@ -0,0 +1,103 @@ +//! Display an icon. +use crate::{layout, Element, Hasher, Layout, Length, Point, Rectangle, Widget}; + +use std::hash::Hash; +use std::path::{Path, PathBuf}; + +/// A simple icon_loader widget. +#[derive(Debug, Clone)] +pub struct Icon { + path: PathBuf, + size: Length, +} + +impl Icon { + /// Create a new [`Icon`] from the file at `path`. + /// + /// [`Icon`]: struct.Icon.html + pub fn new(path: impl Into<PathBuf>) -> Self { + Icon { + path: path.into(), + size: Length::Fill, + } + } + + /// Sets the size of the [`Icon`]. + /// + /// [`Icon`]: struct.Icon.html + pub fn size(mut self, size: Length) -> Self { + self.size = size; + self + } +} + +impl<Message, Renderer> Widget<Message, Renderer> for Icon +where + Renderer: self::Renderer, +{ + fn width(&self) -> Length { + self.size + } + + fn height(&self) -> Length { + self.size + } + + fn layout(&self, _: &Renderer, limits: &layout::Limits) -> layout::Node { + let mut size = limits.width(self.size).height(self.size).max(); + + if size.width > size.height { + size.width = size.height; + } else if size.width < size.height { + size.height = size.width; + } + + layout::Node::new(size) + } + + fn draw( + &self, + renderer: &mut Renderer, + layout: Layout<'_>, + _cursor_position: Point, + ) -> Renderer::Output { + let bounds = layout.bounds(); + + renderer.draw( + bounds, + self.path.as_path(), + ) + } + + fn hash_layout(&self, state: &mut Hasher) { + self.size.hash(state); + } +} + +/// The renderer of an [`Icon`]. +/// +/// Your [renderer] will need to implement this trait before being +/// able to use [`Icon`] in your [`UserInterface`]. +/// +/// [`Icon`]: struct.Icon.html +/// [renderer]: ../../renderer/index.html +/// [`UserInterface`]: ../../struct.UserInterface.html +pub trait Renderer: crate::Renderer { + /// Draws an [`Icon`]. + /// + /// [`Icon`]: struct.Icon.html + fn draw( + &mut self, + bounds: Rectangle, + path: &Path, + ) -> Self::Output; +} + +impl<'a, Message, Renderer> From<Icon> for Element<'a, Message, Renderer> +where + Renderer: self::Renderer, +{ + fn from(icon: Icon) -> Element<'a, Message, Renderer> { + Element::new(icon) + } +} diff --git a/src/native.rs b/src/native.rs index 3537dd52..b24518a2 100644 --- a/src/native.rs +++ b/src/native.rs @@ -80,11 +80,16 @@ pub mod widget { pub use iced_winit::image::{Handle, Image}; } + pub mod icon { + //! Display icons in your user interface. + pub use iced_winit::icon::Icon; + } + pub use iced_winit::{Checkbox, Radio, Text}; #[doc(no_inline)] pub use { - button::Button, image::Image, scrollable::Scrollable, slider::Slider, + button::Button, icon::Icon, image::Image, scrollable::Scrollable, slider::Slider, text_input::TextInput, }; diff --git a/wgpu/src/primitive.rs b/wgpu/src/primitive.rs index c637626b..1b0729cf 100644 --- a/wgpu/src/primitive.rs +++ b/wgpu/src/primitive.rs @@ -3,8 +3,6 @@ use iced_native::{ VerticalAlignment, }; -use crate::svg; - /// A rendering primitive. #[derive(Debug, Clone)] pub enum Primitive { @@ -50,8 +48,8 @@ pub enum Primitive { }, /// A svg icon primitive Svg { - /// The handle of the icon - handle: svg::Handle, + /// The path of the icon + handle: crate::svg::Handle, /// The bounds of the icon bounds: Rectangle, }, diff --git a/wgpu/src/renderer/widget.rs b/wgpu/src/renderer/widget.rs index 52410bee..3e1b8d92 100644 --- a/wgpu/src/renderer/widget.rs +++ b/wgpu/src/renderer/widget.rs @@ -1,6 +1,7 @@ mod button; mod checkbox; mod column; +mod icon; mod image; mod radio; mod row; diff --git a/wgpu/src/renderer/widget/icon.rs b/wgpu/src/renderer/widget/icon.rs new file mode 100644 index 00000000..a271bb47 --- /dev/null +++ b/wgpu/src/renderer/widget/icon.rs @@ -0,0 +1,21 @@ +use crate::{svg::Handle, Primitive, Renderer}; +use iced_native::{ + icon, MouseCursor, Rectangle, +}; +use std::path::Path; + +impl icon::Renderer for Renderer { + fn draw( + &mut self, + bounds: Rectangle, + path: &Path, + ) -> Self::Output { + ( + Primitive::Svg { + handle: Handle::from_path(path), + bounds, + }, + MouseCursor::OutOfBounds, + ) + } +}
\ No newline at end of file diff --git a/wgpu/src/svg.rs b/wgpu/src/svg.rs index 87394799..1b8f14b0 100644 --- a/wgpu/src/svg.rs +++ b/wgpu/src/svg.rs @@ -4,12 +4,13 @@ use iced_native::{Hasher, Rectangle}; use std::{ cell::RefCell, collections::{HashMap, HashSet}, + fmt::Debug, hash::{Hash, Hasher as _}, mem, path::PathBuf, rc::Rc, + u32, }; -use std::fmt::Debug; #[derive(Debug)] |