diff options
| author | 2022-12-06 05:15:16 +0100 | |
|---|---|---|
| committer | 2022-12-06 05:15:16 +0100 | |
| commit | f38e7fcac2e3505d11577ade1757a77ca2a544ea (patch) | |
| tree | 84b3dc6c88aa555cf931482adcf4e7be35614b72 /style | |
| parent | 28f0beee52f258af6bbaf8a0d9867863d7513c9b (diff) | |
| parent | f99d24e0850b63194b7976ec66d547ea2ff6bfc8 (diff) | |
| download | iced-f38e7fcac2e3505d11577ade1757a77ca2a544ea.tar.gz iced-f38e7fcac2e3505d11577ade1757a77ca2a544ea.tar.bz2 iced-f38e7fcac2e3505d11577ade1757a77ca2a544ea.zip | |
Merge pull request #1578 from iced-rs/svg-styling
Svg styling
Diffstat (limited to '')
| -rw-r--r-- | style/src/lib.rs | 1 | ||||
| -rw-r--r-- | style/src/svg.rs | 23 | ||||
| -rw-r--r-- | style/src/theme.rs | 39 | 
3 files changed, 63 insertions, 0 deletions
| diff --git a/style/src/lib.rs b/style/src/lib.rs index 3242602c..59eb1eb8 100644 --- a/style/src/lib.rs +++ b/style/src/lib.rs @@ -32,6 +32,7 @@ pub mod radio;  pub mod rule;  pub mod scrollable;  pub mod slider; +pub mod svg;  pub mod text;  pub mod text_input;  pub mod theme; diff --git a/style/src/svg.rs b/style/src/svg.rs new file mode 100644 index 00000000..9378c1a7 --- /dev/null +++ b/style/src/svg.rs @@ -0,0 +1,23 @@ +//! Change the appearance of a svg. + +use iced_core::Color; + +/// The appearance of an SVG. +#[derive(Debug, Default, Clone, Copy)] +pub struct Appearance { +    /// The [`Color`] filter of an SVG. +    /// +    /// Useful for coloring a symbolic icon. +    /// +    /// `None` keeps the original color. +    pub color: Option<Color>, +} + +/// The stylesheet of a svg. +pub trait StyleSheet { +    /// The supported style of the [`StyleSheet`]. +    type Style: Default; + +    /// Produces the [`Appearance`] of the svg. +    fn appearance(&self, style: &Self::Style) -> Appearance; +} diff --git a/style/src/theme.rs b/style/src/theme.rs index dde0df5d..271d9a29 100644 --- a/style/src/theme.rs +++ b/style/src/theme.rs @@ -16,6 +16,7 @@ use crate::radio;  use crate::rule;  use crate::scrollable;  use crate::slider; +use crate::svg;  use crate::text;  use crate::text_input;  use crate::toggler; @@ -823,6 +824,44 @@ impl rule::StyleSheet for fn(&Theme) -> rule::Appearance {      }  } +/** + * Svg + */ +#[derive(Default)] +pub enum Svg { +    /// No filtering to the rendered SVG. +    #[default] +    Default, +    /// A custom style. +    Custom(Box<dyn svg::StyleSheet<Style = Theme>>), +} + +impl Svg { +    /// Creates a custom [`Svg`] style. +    pub fn custom_fn(f: fn(&Theme) -> svg::Appearance) -> Self { +        Self::Custom(Box::new(f)) +    } +} + +impl svg::StyleSheet for Theme { +    type Style = Svg; + +    fn appearance(&self, style: &Self::Style) -> svg::Appearance { +        match style { +            Svg::Default => Default::default(), +            Svg::Custom(custom) => custom.appearance(self), +        } +    } +} + +impl svg::StyleSheet for fn(&Theme) -> svg::Appearance { +    type Style = Theme; + +    fn appearance(&self, style: &Self::Style) -> svg::Appearance { +        (self)(style) +    } +} +  /// The style of a scrollable.  #[derive(Default)]  pub enum Scrollable { | 
