diff options
| author | 2021-10-31 16:24:31 +0700 | |
|---|---|---|
| committer | 2021-10-31 16:24:31 +0700 | |
| commit | 9a3c81f336b8e29c64471026860f3c9d8b56348c (patch) | |
| tree | cc95c6212655d908b7d2c2e564b4bcfd28b67167 /native/src/widget | |
| parent | c4186a71b746b603984e5fe1926a8cef6e8dcfcb (diff) | |
| download | iced-9a3c81f336b8e29c64471026860f3c9d8b56348c.tar.gz iced-9a3c81f336b8e29c64471026860f3c9d8b56348c.tar.bz2 iced-9a3c81f336b8e29c64471026860f3c9d8b56348c.zip  | |
Introduce first-class `svg` module in `iced_native`
Diffstat (limited to '')
| -rw-r--r-- | native/src/widget/svg.rs | 93 | 
1 files changed, 4 insertions, 89 deletions
diff --git a/native/src/widget/svg.rs b/native/src/widget/svg.rs index 785b8054..f212dfcb 100644 --- a/native/src/widget/svg.rs +++ b/native/src/widget/svg.rs @@ -1,11 +1,11 @@  //! Display vector graphics in your application.  use crate::layout;  use crate::renderer; +use crate::svg::{self, Handle};  use crate::{Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget}; -use std::hash::{Hash, Hasher as _}; +use std::hash::Hash;  use std::path::PathBuf; -use std::sync::Arc;  /// A vector graphics image.  /// @@ -51,7 +51,7 @@ impl Svg {  impl<Message, Renderer> Widget<Message, Renderer> for Svg  where -    Renderer: self::Renderer, +    Renderer: svg::Renderer,  {      fn width(&self) -> Length {          self.width @@ -106,94 +106,9 @@ where      }  } -/// An [`Svg`] handle. -#[derive(Debug, Clone)] -pub struct Handle { -    id: u64, -    data: Arc<Data>, -} - -impl Handle { -    /// Creates an SVG [`Handle`] pointing to the vector image of the given -    /// path. -    pub fn from_path(path: impl Into<PathBuf>) -> Handle { -        Self::from_data(Data::Path(path.into())) -    } - -    /// Creates an SVG [`Handle`] from raw bytes containing either an SVG string -    /// or gzip compressed data. -    /// -    /// This is useful if you already have your SVG data in-memory, maybe -    /// because you downloaded or generated it procedurally. -    pub fn from_memory(bytes: impl Into<Vec<u8>>) -> Handle { -        Self::from_data(Data::Bytes(bytes.into())) -    } - -    fn from_data(data: Data) -> Handle { -        let mut hasher = Hasher::default(); -        data.hash(&mut hasher); - -        Handle { -            id: hasher.finish(), -            data: Arc::new(data), -        } -    } - -    /// Returns the unique identifier of the [`Handle`]. -    pub fn id(&self) -> u64 { -        self.id -    } - -    /// Returns a reference to the SVG [`Data`]. -    pub fn data(&self) -> &Data { -        &self.data -    } -} - -impl Hash for Handle { -    fn hash<H: std::hash::Hasher>(&self, state: &mut H) { -        self.id.hash(state); -    } -} - -/// The data of an [`Svg`]. -#[derive(Clone, Hash)] -pub enum Data { -    /// File data -    Path(PathBuf), - -    /// In-memory data -    /// -    /// Can contain an SVG string or a gzip compressed data. -    Bytes(Vec<u8>), -} - -impl std::fmt::Debug for Data { -    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { -        match self { -            Data::Path(path) => write!(f, "Path({:?})", path), -            Data::Bytes(_) => write!(f, "Bytes(...)"), -        } -    } -} - -/// The renderer of an [`Svg`]. -/// -/// Your [renderer] will need to implement this trait before being able to use -/// an [`Svg`] in your user interface. -/// -/// [renderer]: crate::renderer -pub trait Renderer: crate::Renderer { -    /// Returns the default dimensions of an [`Svg`] for the given [`Handle`]. -    fn dimensions(&self, handle: &Handle) -> (u32, u32); - -    // Draws an [`Svg`]. -    fn draw(&mut self, handle: Handle, bounds: Rectangle); -} -  impl<'a, Message, Renderer> From<Svg> for Element<'a, Message, Renderer>  where -    Renderer: self::Renderer, +    Renderer: svg::Renderer,  {      fn from(icon: Svg) -> Element<'a, Message, Renderer> {          Element::new(icon)  | 
