summaryrefslogtreecommitdiff
path: root/iced_builder/src/theme.rs
diff options
context:
space:
mode:
Diffstat (limited to 'iced_builder/src/theme.rs')
-rw-r--r--iced_builder/src/theme.rs107
1 files changed, 104 insertions, 3 deletions
diff --git a/iced_builder/src/theme.rs b/iced_builder/src/theme.rs
index e41474c..e128162 100644
--- a/iced_builder/src/theme.rs
+++ b/iced_builder/src/theme.rs
@@ -5,10 +5,10 @@ use iced::Color;
use crate::config::Config;
-pub fn theme_index(theme_name: String, slice: &[iced::Theme]) -> Option<usize> {
+pub fn theme_index(theme_name: &str, slice: &[iced::Theme]) -> Option<usize> {
slice
.iter()
- .position(|theme| theme.to_string() == theme_name)
+ .position(|theme| &theme.to_string() == theme_name)
}
pub fn theme_from_str(
@@ -56,7 +56,108 @@ pub fn theme_from_str(
}
}
-#[derive(Debug)]
+fn palette_to_string(palette: &iced::theme::Palette) -> String {
+ format!(
+ r#"Palette {{
+ background: color!(0x{}),
+ text: color!(0x{}),
+ primary: color!(0x{}),
+ success: color!(0x{}),
+ danger: color!(0x{}),
+ }}"#,
+ color_to_hex(palette.background),
+ color_to_hex(palette.text),
+ color_to_hex(palette.primary),
+ color_to_hex(palette.success),
+ color_to_hex(palette.danger),
+ )
+}
+
+fn extended_to_string(extended: &Extended) -> String {
+ format!(
+ r#"
+Extended{{background:Background{{base:Pair{{color:color!(0x{}),text:color!(0x{}),}},weak:Pair{{color:color!(0x{}),text:color!(0x{}),}},strong:Pair{{color:color!(0x{}),text:color!(0x{}),}},}},primary:Primary{{base:Pair{{color:color!(0x{}),text:color!(0x{}),}},weak:Pair{{color:color!(0x{}),text:color!(0x{}),}},strong:Pair{{color:color!(0x{}),text:color!(0x{}),}},}},secondary:Secondary{{base:Pair{{color:color!(0x{}),text:color!(0x{}),}},weak:Pair{{color:color!(0x{}),text:color!(0x{}),}},strong:Pair{{color:color!(0x{}),text:color!(0x{}),}},}},success:Success{{base:Pair{{color:color!(0x{}),text:color!(0x{}),}},weak:Pair{{color:color!(0x{}),text:color!(0x{}),}},strong:Pair{{color:color!(0x{}),text:color!(0x{}),}},}},danger:Danger{{base:Pair{{color:color!(0x{}),text:color!(0x{}),}},weak:Pair{{color:color!(0x{}),text:color!(0x{}),}},strong:Pair{{color:color!(0x{}),text:color!(0x{}),}},}},is_dark:true,}}"#,
+ color_to_hex(extended.background.base.color),
+ color_to_hex(extended.background.base.text),
+ color_to_hex(extended.background.weak.color),
+ color_to_hex(extended.background.weak.text),
+ color_to_hex(extended.background.strong.color),
+ color_to_hex(extended.background.strong.text),
+ color_to_hex(extended.primary.base.color),
+ color_to_hex(extended.primary.base.text),
+ color_to_hex(extended.primary.weak.color),
+ color_to_hex(extended.primary.weak.text),
+ color_to_hex(extended.primary.strong.color),
+ color_to_hex(extended.primary.strong.text),
+ color_to_hex(extended.secondary.base.color),
+ color_to_hex(extended.secondary.base.text),
+ color_to_hex(extended.secondary.weak.color),
+ color_to_hex(extended.secondary.weak.text),
+ color_to_hex(extended.secondary.strong.color),
+ color_to_hex(extended.secondary.strong.text),
+ color_to_hex(extended.success.base.color),
+ color_to_hex(extended.success.base.text),
+ color_to_hex(extended.success.weak.color),
+ color_to_hex(extended.success.weak.text),
+ color_to_hex(extended.success.strong.color),
+ color_to_hex(extended.success.strong.text),
+ color_to_hex(extended.danger.base.color),
+ color_to_hex(extended.danger.base.text),
+ color_to_hex(extended.danger.weak.color),
+ color_to_hex(extended.danger.weak.text),
+ color_to_hex(extended.danger.strong.color),
+ color_to_hex(extended.danger.strong.text),
+ )
+}
+
+pub fn theme_to_string(theme: &iced::Theme) -> String {
+ let palette = theme.palette();
+ let extended = theme.extended_palette();
+
+ let generated_extended = Extended::generate(palette);
+
+ if &generated_extended == extended {
+ format!(
+ r#"custom(
+ "{}".to_string(),
+ {}
+ )"#,
+ theme,
+ palette_to_string(&palette)
+ )
+ } else {
+ format!(
+ r#"custom_with_fn(
+ "{}".to_string(),
+ {},
+ |_| {}
+ )"#,
+ theme,
+ palette_to_string(&palette),
+ extended_to_string(extended)
+ )
+ }
+}
+
+fn color_to_hex(color: Color) -> String {
+ use std::fmt::Write;
+
+ let mut hex = String::with_capacity(16);
+
+ let [r, g, b, a] = color.into_rgba8();
+
+ let _ = write!(&mut hex, "{:02X}", r);
+ let _ = write!(&mut hex, "{:02X}", g);
+ let _ = write!(&mut hex, "{:02X}", b);
+
+ if a < u8::MAX {
+ let _ = write!(&mut hex, ", {:.2}", a as f32 / 255.0);
+ }
+
+ hex
+}
+
+#[derive(Debug, Clone)]
pub struct Appearance {
pub selected: iced::Theme,
pub all: Arc<[iced::Theme]>,