summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--native/src/widget.rs3
-rw-r--r--native/src/widget/icon.rs103
-rw-r--r--src/native.rs7
-rw-r--r--wgpu/src/primitive.rs6
-rw-r--r--wgpu/src/renderer/widget.rs1
-rw-r--r--wgpu/src/renderer/widget/icon.rs21
-rw-r--r--wgpu/src/svg.rs3
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)]