sctk_adwaita/
theme.rs

1pub use tiny_skia::Color;
2use tiny_skia::{Paint, Shader};
3
4// https://gitlab.gnome.org/GNOME/gtk/-/blob/1bf88f1d81043fd99740e2f91e56ade7ede7303b/gtk/gtkwindow.c#L165
5pub(crate) const RESIZE_HANDLE_SIZE: u32 = 12;
6// https://gitlab.gnome.org/GNOME/gtk/-/blob/1bf88f1d81043fd99740e2f91e56ade7ede7303b/gtk/gtkwindow.c#L166
7pub(crate) const RESIZE_HANDLE_CORNER_SIZE: u32 = 24;
8pub(crate) const BORDER_SIZE: u32 = crate::shadow::SHADOW_SIZE + VISIBLE_BORDER_SIZE;
9pub(crate) const HEADER_SIZE: u32 = 35;
10pub(crate) const CORNER_RADIUS: u32 = 10;
11pub(crate) const VISIBLE_BORDER_SIZE: u32 = 1;
12
13/// The color theme to use with the decorations frame.
14#[derive(Debug, Clone)]
15pub struct ColorTheme {
16    pub active: ColorMap,
17    pub inactive: ColorMap,
18}
19
20impl ColorTheme {
21    /// Automatically choose between light & dark themes based on:
22    /// * dbus org.freedesktop.portal.Settings
23    ///   <https://flatpak.github.io/xdg-desktop-portal/#gdbus-interface-org-freedesktop-portal-Settings>
24    pub fn auto() -> Self {
25        match crate::config::prefer_dark() {
26            true => Self::dark(),
27            false => Self::light(),
28        }
29    }
30
31    /// Predefined light variant, which aims to replecate Adwaita theme.
32    pub fn light() -> Self {
33        Self {
34            active: ColorMap {
35                headerbar: Color::from_rgba8(235, 235, 235, 255),
36                button_idle: Color::from_rgba8(216, 216, 216, 255),
37                button_hover: Color::from_rgba8(207, 207, 207, 255),
38                button_icon: Color::from_rgba8(42, 42, 42, 255),
39                border_color: Color::from_rgba8(220, 220, 220, 255),
40                font_color: Color::from_rgba8(47, 47, 47, 255),
41            },
42            inactive: ColorMap {
43                headerbar: Color::from_rgba8(250, 250, 250, 255),
44                button_idle: Color::from_rgba8(240, 240, 240, 255),
45                button_hover: Color::from_rgba8(216, 216, 216, 255),
46                button_icon: Color::from_rgba8(148, 148, 148, 255),
47                border_color: Color::from_rgba8(220, 220, 220, 255),
48                font_color: Color::from_rgba8(150, 150, 150, 255),
49            },
50        }
51    }
52
53    /// Predefined dark variant, which aims to replecate Adwaita-dark theme.
54    pub fn dark() -> Self {
55        Self {
56            active: ColorMap {
57                headerbar: Color::from_rgba8(48, 48, 48, 255),
58                button_idle: Color::from_rgba8(69, 69, 69, 255),
59                button_hover: Color::from_rgba8(79, 79, 79, 255),
60                button_icon: Color::from_rgba8(255, 255, 255, 255),
61                border_color: Color::from_rgba8(58, 58, 58, 255),
62                font_color: Color::from_rgba8(255, 255, 255, 255),
63            },
64            inactive: ColorMap {
65                headerbar: Color::from_rgba8(36, 36, 36, 255),
66                button_idle: Color::from_rgba8(47, 47, 47, 255),
67                button_hover: Color::from_rgba8(57, 57, 57, 255),
68                button_icon: Color::from_rgba8(144, 144, 144, 255),
69                border_color: Color::from_rgba8(58, 58, 58, 255),
70                font_color: Color::from_rgba8(144, 144, 144, 255),
71            },
72        }
73    }
74
75    pub(crate) fn for_state(&self, active: bool) -> &ColorMap {
76        if active {
77            &self.active
78        } else {
79            &self.inactive
80        }
81    }
82}
83
84impl Default for ColorTheme {
85    fn default() -> Self {
86        Self::auto()
87    }
88}
89
90/// The color map for various decorcation parts.
91#[derive(Debug, Clone)]
92pub struct ColorMap {
93    pub headerbar: Color,
94    pub button_idle: Color,
95    pub button_hover: Color,
96    pub button_icon: Color,
97    pub border_color: Color,
98    pub font_color: Color,
99}
100
101impl ColorMap {
102    pub(crate) fn headerbar_paint(&self) -> Paint {
103        Paint {
104            shader: Shader::SolidColor(self.headerbar),
105            anti_alias: true,
106            ..Default::default()
107        }
108    }
109
110    pub(crate) fn button_idle_paint(&self) -> Paint {
111        Paint {
112            shader: Shader::SolidColor(self.button_idle),
113            anti_alias: true,
114            ..Default::default()
115        }
116    }
117
118    pub(crate) fn button_hover_paint(&self) -> Paint {
119        Paint {
120            shader: Shader::SolidColor(self.button_hover),
121            anti_alias: true,
122            ..Default::default()
123        }
124    }
125
126    pub(crate) fn button_icon_paint(&self) -> Paint {
127        Paint {
128            shader: Shader::SolidColor(self.button_icon),
129            ..Default::default()
130        }
131    }
132
133    pub(crate) fn border_paint(&self) -> Paint {
134        Paint {
135            shader: Shader::SolidColor(self.border_color),
136            ..Default::default()
137        }
138    }
139}