diff --git a/crates/theme2/src/default_colors.rs b/crates/theme2/src/default_colors.rs index 2e62b68fae..6ef71009c5 100644 --- a/crates/theme2/src/default_colors.rs +++ b/crates/theme2/src/default_colors.rs @@ -1,9 +1,12 @@ -use gpui2::{hsla, Rgba}; +use std::num::ParseIntError; + +use gpui2::{hsla, Hsla, Rgba}; use crate::{ colors::{GitStatusColors, PlayerColor, PlayerColors, StatusColors, SystemColors, ThemeColors}, scale::{ColorScaleSet, ColorScales}, syntax::SyntaxTheme, + ColorScale, }; fn neutral() -> ColorScaleSet { @@ -265,31 +268,35 @@ impl ThemeColors { } } -struct DefaultColorScaleSet { +type StaticColorScale = [&'static str; 12]; + +struct StaticColorScaleSet { scale: &'static str, - light: [&'static str; 12], - light_alpha: [&'static str; 12], - dark: [&'static str; 12], - dark_alpha: [&'static str; 12], + light: StaticColorScale, + light_alpha: StaticColorScale, + dark: StaticColorScale, + dark_alpha: StaticColorScale, } -impl From for ColorScaleSet { - fn from(default: DefaultColorScaleSet) -> Self { - Self::new( - default.scale, - default - .light - .map(|color| Rgba::try_from(color).unwrap().into()), - default - .light_alpha - .map(|color| Rgba::try_from(color).unwrap().into()), - default - .dark - .map(|color| Rgba::try_from(color).unwrap().into()), - default - .dark_alpha - .map(|color| Rgba::try_from(color).unwrap().into()), - ) +impl TryFrom for ColorScaleSet { + type Error = ParseIntError; + + fn try_from(value: StaticColorScaleSet) -> Result { + fn to_color_scale(scale: StaticColorScale) -> Result { + scale + .into_iter() + .map(|color| Rgba::try_from(color).map(Hsla::from)) + .collect::, _>>() + .map(ColorScale::from_iter) + } + + Ok(Self::new( + value.scale, + to_color_scale(value.light)?, + to_color_scale(value.light_alpha)?, + to_color_scale(value.dark)?, + to_color_scale(value.dark_alpha)?, + )) } } @@ -332,7 +339,7 @@ pub fn default_color_scales() -> ColorScales { } fn gray() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Gray", light: [ "#fcfcfcff", @@ -391,11 +398,12 @@ fn gray() -> ColorScaleSet { "#ffffffed", ], } - .into() + .try_into() + .unwrap() } fn mauve() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Mauve", light: [ "#fdfcfdff", @@ -454,11 +462,12 @@ fn mauve() -> ColorScaleSet { "#fdfdffef", ], } - .into() + .try_into() + .unwrap() } fn slate() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Slate", light: [ "#fcfcfdff", @@ -517,11 +526,12 @@ fn slate() -> ColorScaleSet { "#fcfdffef", ], } - .into() + .try_into() + .unwrap() } fn sage() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Sage", light: [ "#fbfdfcff", @@ -580,11 +590,12 @@ fn sage() -> ColorScaleSet { "#fdfffeed", ], } - .into() + .try_into() + .unwrap() } fn olive() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Olive", light: [ "#fcfdfcff", @@ -643,11 +654,12 @@ fn olive() -> ColorScaleSet { "#fdfffded", ], } - .into() + .try_into() + .unwrap() } fn sand() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Sand", light: [ "#fdfdfcff", @@ -706,11 +718,12 @@ fn sand() -> ColorScaleSet { "#fffffded", ], } - .into() + .try_into() + .unwrap() } fn gold() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Gold", light: [ "#fdfdfcff", @@ -769,11 +782,12 @@ fn gold() -> ColorScaleSet { "#fef7ede7", ], } - .into() + .try_into() + .unwrap() } fn bronze() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Bronze", light: [ "#fdfcfcff", @@ -832,11 +846,12 @@ fn bronze() -> ColorScaleSet { "#fff1e9ec", ], } - .into() + .try_into() + .unwrap() } fn brown() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Brown", light: [ "#fefdfcff", @@ -895,11 +910,12 @@ fn brown() -> ColorScaleSet { "#feecd4f2", ], } - .into() + .try_into() + .unwrap() } fn yellow() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Yellow", light: [ "#fdfdf9ff", @@ -958,11 +974,12 @@ fn yellow() -> ColorScaleSet { "#fef6baf6", ], } - .into() + .try_into() + .unwrap() } fn amber() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Amber", light: [ "#fefdfbff", @@ -1021,11 +1038,12 @@ fn amber() -> ColorScaleSet { "#ffe7b3ff", ], } - .into() + .try_into() + .unwrap() } fn orange() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Orange", light: [ "#fefcfbff", @@ -1084,11 +1102,12 @@ fn orange() -> ColorScaleSet { "#ffe0c2ff", ], } - .into() + .try_into() + .unwrap() } fn tomato() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Tomato", light: [ "#fffcfcff", @@ -1147,11 +1166,12 @@ fn tomato() -> ColorScaleSet { "#ffd6cefb", ], } - .into() + .try_into() + .unwrap() } fn red() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Red", light: [ "#fffcfcff", @@ -1210,11 +1230,12 @@ fn red() -> ColorScaleSet { "#ffd1d9ff", ], } - .into() + .try_into() + .unwrap() } fn ruby() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Ruby", light: [ "#fffcfdff", @@ -1273,11 +1294,12 @@ fn ruby() -> ColorScaleSet { "#ffd3e2fe", ], } - .into() + .try_into() + .unwrap() } fn crimson() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Crimson", light: [ "#fffcfdff", @@ -1336,11 +1358,12 @@ fn crimson() -> ColorScaleSet { "#ffd5eafd", ], } - .into() + .try_into() + .unwrap() } fn pink() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Pink", light: [ "#fffcfeff", @@ -1399,11 +1422,12 @@ fn pink() -> ColorScaleSet { "#ffd3ecfd", ], } - .into() + .try_into() + .unwrap() } fn plum() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Plum", light: [ "#fefcffff", @@ -1462,11 +1486,12 @@ fn plum() -> ColorScaleSet { "#feddfef4", ], } - .into() + .try_into() + .unwrap() } fn purple() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Purple", light: [ "#fefcfeff", @@ -1525,11 +1550,12 @@ fn purple() -> ColorScaleSet { "#f1ddfffa", ], } - .into() + .try_into() + .unwrap() } fn violet() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Violet", light: [ "#fdfcfeff", @@ -1588,11 +1614,12 @@ fn violet() -> ColorScaleSet { "#e3defffe", ], } - .into() + .try_into() + .unwrap() } fn iris() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Iris", light: [ "#fdfdffff", @@ -1651,11 +1678,12 @@ fn iris() -> ColorScaleSet { "#e1e0fffe", ], } - .into() + .try_into() + .unwrap() } fn indigo() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Indigo", light: [ "#fdfdfeff", @@ -1714,11 +1742,12 @@ fn indigo() -> ColorScaleSet { "#d6e1ffff", ], } - .into() + .try_into() + .unwrap() } fn blue() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Blue", light: [ "#fbfdffff", @@ -1777,11 +1806,12 @@ fn blue() -> ColorScaleSet { "#c2e6ffff", ], } - .into() + .try_into() + .unwrap() } fn cyan() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Cyan", light: [ "#fafdfeff", @@ -1840,11 +1870,12 @@ fn cyan() -> ColorScaleSet { "#bbf3fef7", ], } - .into() + .try_into() + .unwrap() } fn teal() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Teal", light: [ "#fafefdff", @@ -1903,11 +1934,12 @@ fn teal() -> ColorScaleSet { "#b8ffebef", ], } - .into() + .try_into() + .unwrap() } fn jade() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Jade", light: [ "#fbfefdff", @@ -1966,11 +1998,12 @@ fn jade() -> ColorScaleSet { "#b8ffe1ef", ], } - .into() + .try_into() + .unwrap() } fn green() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Green", light: [ "#fbfefcff", @@ -2029,11 +2062,12 @@ fn green() -> ColorScaleSet { "#bbffd7f0", ], } - .into() + .try_into() + .unwrap() } fn grass() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Grass", light: [ "#fbfefbff", @@ -2092,11 +2126,12 @@ fn grass() -> ColorScaleSet { "#ceffceef", ], } - .into() + .try_into() + .unwrap() } fn lime() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Lime", light: [ "#fcfdfaff", @@ -2155,11 +2190,12 @@ fn lime() -> ColorScaleSet { "#e9febff7", ], } - .into() + .try_into() + .unwrap() } fn mint() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Mint", light: [ "#f9fefdff", @@ -2218,11 +2254,12 @@ fn mint() -> ColorScaleSet { "#cbfee9f5", ], } - .into() + .try_into() + .unwrap() } fn sky() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Sky", light: [ "#f9feffff", @@ -2281,11 +2318,12 @@ fn sky() -> ColorScaleSet { "#c2f3ffff", ], } - .into() + .try_into() + .unwrap() } fn black() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "Black", light: [ "#0000000d", @@ -2344,11 +2382,12 @@ fn black() -> ColorScaleSet { "#000000f2", ], } - .into() + .try_into() + .unwrap() } fn white() -> ColorScaleSet { - DefaultColorScaleSet { + StaticColorScaleSet { scale: "White", light: [ "#ffffff0d", @@ -2407,5 +2446,6 @@ fn white() -> ColorScaleSet { "#fffffff2", ], } - .into() + .try_into() + .unwrap() } diff --git a/crates/theme2/src/scale.rs b/crates/theme2/src/scale.rs index 21c8592d81..a22036df8d 100644 --- a/crates/theme2/src/scale.rs +++ b/crates/theme2/src/scale.rs @@ -2,7 +2,24 @@ use gpui2::{AppContext, Hsla, SharedString}; use crate::{ActiveTheme, Appearance}; -pub type ColorScale = [Hsla; 12]; +/// A one-based step in a [`ColorScale`]. +pub type ColorScaleStep = usize; + +pub struct ColorScale(Vec); + +impl FromIterator for ColorScale { + fn from_iter>(iter: T) -> Self { + Self(Vec::from_iter(iter)) + } +} + +impl std::ops::Index for ColorScale { + type Output = Hsla; + + fn index(&self, index: ColorScaleStep) -> &Self::Output { + &self.0[index - 1] + } +} pub struct ColorScales { pub gray: ColorScaleSet, @@ -85,9 +102,6 @@ impl IntoIterator for ColorScales { } } -/// A one-based step in a [`ColorScale`]. -pub type ColorScaleStep = usize; - pub struct ColorScaleSet { name: SharedString, light: ColorScale,