Skip to content

Commit 324b8c1

Browse files
committed
feat: add configurables for accent_palette_dark and accent_palette_light
Closes #749
1 parent fc3bc8f commit 324b8c1

File tree

2 files changed

+159
-103
lines changed

2 files changed

+159
-103
lines changed

cosmic-settings/src/config.rs

+21-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
// Copyright 2023 System76 <[email protected]>
22
// SPDX-License-Identifier: GPL-3.0-only
33

4-
use cosmic::cosmic_config::{self, ConfigGet, ConfigSet};
4+
use cosmic::{
5+
cosmic_config::{self, ConfigGet, ConfigSet},
6+
cosmic_theme::palette::Srgba,
7+
};
58

69
const NAME: &str = "com.system76.CosmicSettings";
710

811
const ACTIVE_PAGE: &str = "active-page";
12+
const ACCENT_PALETTE_DARK: &str = "accent_palette_dark";
13+
const ACCENT_PALETTE_LIGHT: &str = "accent_palette_light";
914

1015
#[must_use]
11-
#[derive(Debug)]
16+
#[derive(Debug, Clone)]
1217
pub struct Config {
1318
pub cosmic_config: Option<cosmic_config::Config>,
1419
pub active_page: Box<str>,
@@ -35,6 +40,20 @@ impl Config {
3540
config
3641
}
3742

43+
pub fn accent_palette_dark(&self) -> Result<Vec<Srgba>, cosmic_config::Error> {
44+
self.cosmic_config
45+
.as_ref()
46+
.unwrap()
47+
.get::<Vec<Srgba>>(ACCENT_PALETTE_DARK)
48+
}
49+
50+
pub fn accent_palette_light(&self) -> Result<Vec<Srgba>, cosmic_config::Error> {
51+
self.cosmic_config
52+
.as_ref()
53+
.unwrap()
54+
.get::<Vec<Srgba>>(ACCENT_PALETTE_LIGHT)
55+
}
56+
3857
pub fn set_active_page(&mut self, page: Box<str>) {
3958
if let Some(context) = self.cosmic_config.as_ref() {
4059
if let Err(why) = context.set::<Box<str>>(ACTIVE_PAGE, page.clone()) {

cosmic-settings/src/pages/desktop/appearance/mod.rs

+138-101
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,12 @@ enum ContextView {
6060
MonospaceFont,
6161
SystemFont,
6262
}
63+
6364
#[allow(clippy::struct_excessive_bools)]
6465
pub struct Page {
6566
entity: page::Entity,
6667
on_enter_handle: Option<cosmic::iced::task::Handle>,
68+
accent_palette: AccentPalette,
6769
can_reset: bool,
6870
no_custom_window_hint: bool,
6971
context_view: Option<ContextView>,
@@ -96,12 +98,21 @@ pub struct Page {
9698
auto_switch_descs: [Cow<'static, str>; 4],
9799

98100
tk_config: Option<Config>,
99-
101+
settings_config: crate::config::Config,
100102
day_time: bool,
101103
}
102104

105+
#[derive(Default)]
106+
pub struct AccentPalette {
107+
dark: Option<Vec<Srgba>>,
108+
light: Option<Vec<Srgba>>,
109+
theme: Vec<Srgba>,
110+
}
111+
103112
impl Default for Page {
104113
fn default() -> Self {
114+
let settings_config = crate::config::Config::new();
115+
105116
let theme_mode_config = ThemeMode::config().ok();
106117
let theme_mode = theme_mode_config
107118
.as_ref()
@@ -116,26 +127,52 @@ impl Default for Page {
116127
})
117128
.unwrap_or_default();
118129

119-
(theme_mode_config, theme_mode).into()
130+
let accent_palette = AccentPalette {
131+
dark: settings_config.accent_palette_dark().ok(),
132+
light: settings_config.accent_palette_light().ok(),
133+
theme: Vec::new(),
134+
};
135+
136+
let mut page: Page = (
137+
settings_config,
138+
theme_mode_config,
139+
theme_mode,
140+
accent_palette,
141+
)
142+
.into();
143+
page.update_accent_palette();
144+
page
120145
}
121146
}
122147

123148
impl
124149
From<(
150+
crate::config::Config,
125151
Option<Config>,
126152
ThemeMode,
127153
Option<Config>,
128154
ThemeBuilder,
129155
Option<Config>,
156+
AccentPalette,
130157
)> for Page
131158
{
132159
fn from(
133-
(theme_mode_config, theme_mode, theme_builder_config, theme_builder, tk_config): (
160+
(
161+
settings_config,
162+
theme_mode_config,
163+
theme_mode,
164+
theme_builder_config,
165+
theme_builder,
166+
tk_config,
167+
accent_palette,
168+
): (
169+
crate::config::Config,
134170
Option<Config>,
135171
ThemeMode,
136172
Option<Config>,
137173
ThemeBuilder,
138174
Option<Config>,
175+
AccentPalette,
139176
),
140177
) -> Self {
141178
let theme = if theme_mode.is_dark {
@@ -212,12 +249,14 @@ impl
212249
icon_theme_active: None,
213250
icon_themes: Vec::new(),
214251
icon_handles: Vec::new(),
252+
accent_palette,
215253
theme,
216254
theme_mode_config,
217255
theme_builder_config,
218256
theme_mode,
219257
theme_builder,
220258
tk_config,
259+
settings_config,
221260
day_time: true,
222261
auto_switch_descs: [
223262
fl!("auto-switch", "sunrise").into(),
@@ -229,8 +268,22 @@ impl
229268
}
230269
}
231270

232-
impl From<(Option<Config>, ThemeMode)> for Page {
233-
fn from((theme_mode_config, theme_mode): (Option<Config>, ThemeMode)) -> Self {
271+
impl
272+
From<(
273+
crate::config::Config,
274+
Option<Config>,
275+
ThemeMode,
276+
AccentPalette,
277+
)> for Page
278+
{
279+
fn from(
280+
(settings_config, theme_mode_config, theme_mode, accent_palette): (
281+
crate::config::Config,
282+
Option<Config>,
283+
ThemeMode,
284+
AccentPalette,
285+
),
286+
) -> Self {
234287
let theme_builder_config = if theme_mode.is_dark {
235288
ThemeBuilder::dark_config()
236289
} else {
@@ -259,11 +312,13 @@ impl From<(Option<Config>, ThemeMode)> for Page {
259312
let tk_config = CosmicTk::config().ok();
260313

261314
Self::from((
315+
settings_config,
262316
theme_mode_config,
263317
theme_mode,
264318
theme_builder_config,
265319
theme_builder,
266320
tk_config,
321+
accent_palette,
267322
))
268323
}
269324
}
@@ -1110,6 +1165,7 @@ impl Page {
11101165

11111166
// If the theme builder changed, write a new theme to disk on a background thread.
11121167
if needs_build {
1168+
self.update_accent_palette();
11131169
let theme_builder = self.theme_builder.clone();
11141170
let is_dark = self.theme_mode.is_dark;
11151171
let current_theme = self.theme.clone();
@@ -1186,6 +1242,21 @@ impl Page {
11861242
cosmic::Task::batch(tasks)
11871243
}
11881244

1245+
fn update_accent_palette(&mut self) {
1246+
let palette = self.theme_builder.palette.as_ref();
1247+
self.accent_palette.theme = vec![
1248+
palette.accent_blue,
1249+
palette.accent_indigo,
1250+
palette.accent_purple,
1251+
palette.accent_pink,
1252+
palette.accent_red,
1253+
palette.accent_orange,
1254+
palette.accent_yellow,
1255+
palette.accent_green,
1256+
palette.accent_warm_grey,
1257+
];
1258+
}
1259+
11891260
fn reload_theme_mode(&mut self) {
11901261
let entity = self.entity;
11911262
let font_config = std::mem::take(&mut self.font_config);
@@ -1194,7 +1265,15 @@ impl Page {
11941265
let icon_theme_active = self.icon_theme_active.take();
11951266
let day_time = self.day_time;
11961267

1197-
*self = Self::from((self.theme_mode_config.clone(), self.theme_mode));
1268+
*self = Self::from((
1269+
self.settings_config.clone(),
1270+
self.theme_mode_config.take(),
1271+
self.theme_mode,
1272+
std::mem::take(&mut self.accent_palette),
1273+
));
1274+
1275+
self.update_accent_palette();
1276+
11981277
self.entity = entity;
11991278
self.day_time = day_time;
12001279
self.icon_themes = icon_themes;
@@ -1624,6 +1703,58 @@ pub fn mode_and_colors() -> Section<crate::pages::Message> {
16241703
.theme_builder
16251704
.accent
16261705
.map_or(palette.accent_blue, Srgba::from);
1706+
1707+
let accent_palette_values = match (
1708+
page.theme_mode.is_dark,
1709+
page.accent_palette.dark.as_ref(),
1710+
page.accent_palette.light.as_ref(),
1711+
) {
1712+
(true, Some(dark_palette), _) => &dark_palette,
1713+
(false, _, Some(light_palette)) => &light_palette,
1714+
_ => &page.accent_palette.theme,
1715+
};
1716+
1717+
let mut accent_palette_row =
1718+
cosmic::widget::row::with_capacity(accent_palette_values.len());
1719+
1720+
for &color in accent_palette_values {
1721+
accent_palette_row = accent_palette_row.push(color_button(
1722+
Some(Message::PaletteAccent(color.into())),
1723+
color.into(),
1724+
cur_accent == color,
1725+
48,
1726+
48,
1727+
));
1728+
}
1729+
1730+
let accent_color_palette = cosmic::iced::widget::column![
1731+
text::body(&descriptions[accent_color]),
1732+
scrollable(
1733+
accent_palette_row
1734+
.push(if let Some(c) = page.custom_accent.get_applied_color() {
1735+
container(color_button(
1736+
Some(Message::CustomAccent(ColorPickerUpdate::ToggleColorPicker)),
1737+
c,
1738+
cosmic::iced::Color::from(cur_accent) == c,
1739+
48,
1740+
48,
1741+
))
1742+
} else {
1743+
container(
1744+
page.custom_accent
1745+
.picker_button(Message::CustomAccent, None)
1746+
.width(Length::Fixed(48.0))
1747+
.height(Length::Fixed(48.0)),
1748+
)
1749+
})
1750+
.padding([0, 0, 16, 0])
1751+
.spacing(16)
1752+
)
1753+
.direction(Direction::Horizontal(Scrollbar::new()))
1754+
]
1755+
.padding([16, 0, 0, 0])
1756+
.spacing(space_xxs);
1757+
16271758
let mut section = settings::section()
16281759
.title(&section.title)
16291760
.add(
@@ -1682,101 +1813,7 @@ pub fn mode_and_colors() -> Section<crate::pages::Message> {
16821813
)
16831814
.toggler(page.theme_mode.auto_switch, Message::Autoswitch),
16841815
)
1685-
.add(
1686-
cosmic::iced::widget::column![
1687-
text::body(&descriptions[accent_color]),
1688-
scrollable(
1689-
cosmic::iced::widget::row![
1690-
color_button(
1691-
Some(Message::PaletteAccent(palette.accent_blue.into())),
1692-
palette.accent_blue.into(),
1693-
cur_accent == palette.accent_blue,
1694-
48,
1695-
48
1696-
),
1697-
color_button(
1698-
Some(Message::PaletteAccent(palette.accent_indigo.into())),
1699-
palette.accent_indigo.into(),
1700-
cur_accent == palette.accent_indigo,
1701-
48,
1702-
48
1703-
),
1704-
color_button(
1705-
Some(Message::PaletteAccent(palette.accent_purple.into())),
1706-
palette.accent_purple.into(),
1707-
cur_accent == palette.accent_purple,
1708-
48,
1709-
48
1710-
),
1711-
color_button(
1712-
Some(Message::PaletteAccent(palette.accent_pink.into())),
1713-
palette.accent_pink.into(),
1714-
cur_accent == palette.accent_pink,
1715-
48,
1716-
48
1717-
),
1718-
color_button(
1719-
Some(Message::PaletteAccent(palette.accent_red.into())),
1720-
palette.accent_red.into(),
1721-
cur_accent == palette.accent_red,
1722-
48,
1723-
48
1724-
),
1725-
color_button(
1726-
Some(Message::PaletteAccent(palette.accent_orange.into())),
1727-
palette.accent_orange.into(),
1728-
cur_accent == palette.accent_orange,
1729-
48,
1730-
48
1731-
),
1732-
color_button(
1733-
Some(Message::PaletteAccent(palette.accent_yellow.into())),
1734-
palette.accent_yellow.into(),
1735-
cur_accent == palette.accent_yellow,
1736-
48,
1737-
48
1738-
),
1739-
color_button(
1740-
Some(Message::PaletteAccent(palette.accent_green.into())),
1741-
palette.accent_green.into(),
1742-
cur_accent == palette.accent_green,
1743-
48,
1744-
48
1745-
),
1746-
color_button(
1747-
Some(Message::PaletteAccent(palette.accent_warm_grey.into())),
1748-
palette.accent_warm_grey.into(),
1749-
cur_accent == palette.accent_warm_grey,
1750-
48,
1751-
48
1752-
),
1753-
if let Some(c) = page.custom_accent.get_applied_color() {
1754-
container(color_button(
1755-
Some(Message::CustomAccent(
1756-
ColorPickerUpdate::ToggleColorPicker,
1757-
)),
1758-
c,
1759-
cosmic::iced::Color::from(cur_accent) == c,
1760-
48,
1761-
48,
1762-
))
1763-
} else {
1764-
container(
1765-
page.custom_accent
1766-
.picker_button(Message::CustomAccent, None)
1767-
.width(Length::Fixed(48.0))
1768-
.height(Length::Fixed(48.0)),
1769-
)
1770-
},
1771-
]
1772-
.padding([0, 0, 16, 0])
1773-
.spacing(16)
1774-
)
1775-
.direction(Direction::Horizontal(Scrollbar::new()))
1776-
]
1777-
.padding([16, 0, 0, 0])
1778-
.spacing(space_xxs),
1779-
)
1816+
.add(accent_color_palette)
17801817
.add(
17811818
settings::item::builder(&descriptions[app_bg]).control(
17821819
page.application_background

0 commit comments

Comments
 (0)