feat: hex_color serialization for the theme
can also can deserialize the previous version of the theme, so existing themes should not be affected
This commit is contained in:
parent
6653157def
commit
141bbd23ec
7 changed files with 264 additions and 25 deletions
|
|
@ -1,10 +1,11 @@
|
|||
use crate::{
|
||||
Component, Container, CornerRadii, CosmicPalette, CosmicPaletteInner, DARK_PALETTE,
|
||||
LIGHT_PALETTE, NAME, Spacing, ThemeMode,
|
||||
color::{ColorRepr, ColorReprOption, color_serde, color_serde::option as color_serde_option},
|
||||
composite::over,
|
||||
steps::{color_index, get_small_widget_color, get_surface_color, get_text, steps},
|
||||
};
|
||||
use cosmic_config::{Config, CosmicConfigEntry};
|
||||
use cosmic_config::{Config, CosmicConfigEntry, cosmic_config_derive::CosmicConfigEntry};
|
||||
use palette::{
|
||||
IntoColor, Oklcha, Srgb, Srgba, WithAlpha, color_difference::Wcag21RelativeContrast, rgb::Rgb,
|
||||
};
|
||||
|
|
@ -37,15 +38,8 @@ pub enum Layer {
|
|||
|
||||
#[must_use]
|
||||
/// Cosmic Theme data structure with all colors and its name
|
||||
#[derive(
|
||||
Clone,
|
||||
Debug,
|
||||
Serialize,
|
||||
Deserialize,
|
||||
PartialEq,
|
||||
cosmic_config::cosmic_config_derive::CosmicConfigEntry,
|
||||
)]
|
||||
#[version = 1]
|
||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, CosmicConfigEntry)]
|
||||
#[version = 2]
|
||||
pub struct Theme {
|
||||
/// name of the theme
|
||||
pub name: String,
|
||||
|
|
@ -98,13 +92,21 @@ pub struct Theme {
|
|||
/// enables blurred transparency
|
||||
pub is_frosted: bool,
|
||||
/// shade color for dialogs
|
||||
#[serde(with = "color_serde")]
|
||||
#[cosmic_config_entry(with = ColorRepr)]
|
||||
pub shade: Srgba,
|
||||
/// accent text colors
|
||||
/// If None, accent base color is the accent text color.
|
||||
#[serde(with = "color_serde_option")]
|
||||
#[cosmic_config_entry(with = ColorReprOption)]
|
||||
pub accent_text: Option<Srgba>,
|
||||
/// control tint color
|
||||
#[serde(with = "color_serde_option")]
|
||||
#[cosmic_config_entry(with = ColorReprOption)]
|
||||
pub control_tint: Option<Srgb>,
|
||||
/// text tint color
|
||||
#[serde(with = "color_serde_option")]
|
||||
#[cosmic_config_entry(with = ColorReprOption)]
|
||||
pub text_tint: Option<Srgb>,
|
||||
}
|
||||
|
||||
|
|
@ -739,7 +741,7 @@ impl Theme {
|
|||
if color_scheme.trim().contains("default") || color_scheme.trim().contains("light") {
|
||||
return Self::light_default();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Self::dark_default()
|
||||
}
|
||||
|
|
@ -748,10 +750,10 @@ impl Theme {
|
|||
pub fn preferred_theme() -> Self {
|
||||
let current_desktop = std::env::var("XDG_CURRENT_DESKTOP");
|
||||
|
||||
if let Ok(desktop) = current_desktop {
|
||||
if desktop.trim().to_lowercase().contains("gnome") {
|
||||
return Self::gtk_prefer_colorscheme();
|
||||
}
|
||||
if let Ok(desktop) = current_desktop
|
||||
&& desktop.trim().to_lowercase().contains("gnome")
|
||||
{
|
||||
return Self::gtk_prefer_colorscheme();
|
||||
}
|
||||
|
||||
Self::dark_default()
|
||||
|
|
@ -766,15 +768,8 @@ impl From<CosmicPalette> for Theme {
|
|||
|
||||
#[must_use]
|
||||
/// Helper for building customized themes
|
||||
#[derive(
|
||||
Clone,
|
||||
Debug,
|
||||
Serialize,
|
||||
Deserialize,
|
||||
cosmic_config::cosmic_config_derive::CosmicConfigEntry,
|
||||
PartialEq,
|
||||
)]
|
||||
#[version = 1]
|
||||
#[derive(Clone, Debug, Serialize, Deserialize, CosmicConfigEntry, PartialEq)]
|
||||
#[version = 2]
|
||||
pub struct ThemeBuilder {
|
||||
/// override the palette for the builder
|
||||
pub palette: CosmicPalette,
|
||||
|
|
@ -783,22 +778,40 @@ pub struct ThemeBuilder {
|
|||
/// override corner radii for the builder
|
||||
pub corner_radii: CornerRadii,
|
||||
/// override neutral_tint for the builder
|
||||
#[serde(with = "color_serde_option")]
|
||||
#[cosmic_config_entry(with = ColorReprOption)]
|
||||
pub neutral_tint: Option<Srgb>,
|
||||
/// override bg_color for the builder
|
||||
#[serde(with = "color_serde_option")]
|
||||
#[cosmic_config_entry(with = ColorReprOption)]
|
||||
pub bg_color: Option<Srgba>,
|
||||
/// override the primary container bg color for the builder
|
||||
#[serde(with = "color_serde_option")]
|
||||
#[cosmic_config_entry(with = ColorReprOption)]
|
||||
pub primary_container_bg: Option<Srgba>,
|
||||
/// override the secontary container bg color for the builder
|
||||
#[serde(with = "color_serde_option")]
|
||||
#[cosmic_config_entry(with = ColorReprOption)]
|
||||
pub secondary_container_bg: Option<Srgba>,
|
||||
/// override the text tint for the builder
|
||||
#[serde(with = "color_serde_option")]
|
||||
#[cosmic_config_entry(with = ColorReprOption)]
|
||||
pub text_tint: Option<Srgb>,
|
||||
/// override the accent color for the builder
|
||||
#[serde(with = "color_serde_option")]
|
||||
#[cosmic_config_entry(with = ColorReprOption)]
|
||||
pub accent: Option<Srgb>,
|
||||
/// override the success color for the builder
|
||||
#[serde(with = "color_serde_option")]
|
||||
#[cosmic_config_entry(with = ColorReprOption)]
|
||||
pub success: Option<Srgb>,
|
||||
/// override the warning color for the builder
|
||||
#[serde(with = "color_serde_option")]
|
||||
#[cosmic_config_entry(with = ColorReprOption)]
|
||||
pub warning: Option<Srgb>,
|
||||
/// override the destructive color for the builder
|
||||
#[serde(with = "color_serde_option")]
|
||||
#[cosmic_config_entry(with = ColorReprOption)]
|
||||
pub destructive: Option<Srgb>,
|
||||
/// enabled blurred transparency
|
||||
pub is_frosted: bool, // TODO handle
|
||||
|
|
@ -807,6 +820,8 @@ pub struct ThemeBuilder {
|
|||
/// cosmic-comp active hint window outline width
|
||||
pub active_hint: u32,
|
||||
/// cosmic-comp custom window hint color
|
||||
#[serde(with = "color_serde_option")]
|
||||
#[cosmic_config_entry(with = ColorReprOption)]
|
||||
pub window_hint: Option<Srgb>,
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue