1use gpui2::Hsla;
2use refineable::Refineable;
3
4use crate::{generate_struct_with_overrides, SyntaxTheme};
5
6pub struct SystemColors {
7 pub transparent: Hsla,
8 pub mac_os_traffic_light_red: Hsla,
9 pub mac_os_traffic_light_yellow: Hsla,
10 pub mac_os_traffic_light_green: Hsla,
11}
12
13#[derive(Debug, Clone, Copy)]
14pub struct PlayerColor {
15 pub cursor: Hsla,
16 pub background: Hsla,
17 pub selection: Hsla,
18}
19
20pub struct PlayerColors(pub Vec<PlayerColor>);
21
22#[derive(Refineable, Clone, Debug)]
23#[refineable(debug)]
24pub struct StatusColors {
25 pub conflict: Hsla,
26 pub created: Hsla,
27 pub deleted: Hsla,
28 pub error: Hsla,
29 pub hidden: Hsla,
30 pub ignored: Hsla,
31 pub info: Hsla,
32 pub modified: Hsla,
33 pub renamed: Hsla,
34 pub success: Hsla,
35 pub warning: Hsla,
36}
37
38#[derive(Refineable, Clone, Debug)]
39#[refineable(debug)]
40pub struct GitStatusColors {
41 pub conflict: Hsla,
42 pub created: Hsla,
43 pub deleted: Hsla,
44 pub ignored: Hsla,
45 pub modified: Hsla,
46 pub renamed: Hsla,
47}
48
49#[derive(Refineable, Clone, Debug)]
50#[refineable(debug)]
51pub struct ThemeColors {
52 pub border: Hsla,
53 pub border_variant: Hsla,
54 pub border_focused: Hsla,
55 pub border_transparent: Hsla,
56 pub elevated_surface: Hsla,
57 pub surface: Hsla,
58 pub background: Hsla,
59 pub element: Hsla,
60 pub element_hover: Hsla,
61 pub element_active: Hsla,
62 pub element_selected: Hsla,
63 pub element_disabled: Hsla,
64 pub element_placeholder: Hsla,
65 pub ghost_element: Hsla,
66 pub ghost_element_hover: Hsla,
67 pub ghost_element_active: Hsla,
68 pub ghost_element_selected: Hsla,
69 pub ghost_element_disabled: Hsla,
70 pub text: Hsla,
71 pub text_muted: Hsla,
72 pub text_placeholder: Hsla,
73 pub text_disabled: Hsla,
74 pub text_accent: Hsla,
75 pub icon: Hsla,
76 pub icon_muted: Hsla,
77 pub icon_disabled: Hsla,
78 pub icon_placeholder: Hsla,
79 pub icon_accent: Hsla,
80 pub status_bar: Hsla,
81 pub title_bar: Hsla,
82 pub toolbar: Hsla,
83 pub tab_bar: Hsla,
84 pub editor: Hsla,
85 pub editor_subheader: Hsla,
86 pub editor_active_line: Hsla,
87}
88
89generate_struct_with_overrides! {
90 ThemeStyle,
91 ThemeStyleOverrides,
92 system: SystemColors,
93 colors: ThemeColors,
94 status: StatusColors,
95 git: GitStatusColors,
96 player: PlayerColors,
97 syntax: SyntaxTheme
98}
99
100#[cfg(test)]
101mod tests {
102 use super::*;
103
104 #[test]
105 fn override_a_single_theme_color() {
106 let mut colors = ThemeColors::default_light();
107
108 let magenta: Hsla = gpui2::rgb(0xff00ff);
109
110 assert_ne!(colors.text, magenta);
111
112 let overrides = ThemeColorsRefinement {
113 text: Some(magenta),
114 ..Default::default()
115 };
116
117 colors.refine(&overrides);
118
119 assert_eq!(colors.text, magenta);
120 }
121
122 #[test]
123 fn override_multiple_theme_colors() {
124 let mut colors = ThemeColors::default_light();
125
126 let magenta: Hsla = gpui2::rgb(0xff00ff);
127 let green: Hsla = gpui2::rgb(0x00ff00);
128
129 assert_ne!(colors.text, magenta);
130 assert_ne!(colors.background, green);
131
132 let overrides = ThemeColorsRefinement {
133 text: Some(magenta),
134 background: Some(green),
135 ..Default::default()
136 };
137
138 colors.refine(&overrides);
139
140 assert_eq!(colors.text, magenta);
141 assert_eq!(colors.background, green);
142 }
143}