From 9e299db491dd15c8b0cb625be913103ed1c17ffd Mon Sep 17 00:00:00 2001 From: Ashley Wulber <48420062+wash2@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:49:22 -0400 Subject: [PATCH] feat: theme management (#46) --- Cargo.lock | 72 +++++++++++++++++++++++++------------------------- app/src/app.rs | 48 ++++++++++++++++++++++++++++++--- 2 files changed, 81 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cc9c75e..ca43003 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -731,7 +731,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "atomicwrites", "calloop", @@ -746,7 +746,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "quote", "syn 1.0.109", @@ -874,7 +874,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "anyhow", "cosmic-config", @@ -2123,7 +2123,7 @@ dependencies = [ [[package]] name = "iced" version = "0.9.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "iced_accessibility", "iced_core", @@ -2139,7 +2139,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "accesskit", "accesskit_unix", @@ -2148,7 +2148,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.9.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "bitflags 1.3.2", "iced_accessibility", @@ -2163,7 +2163,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.6.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "futures", "iced_core", @@ -2176,7 +2176,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.8.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "bitflags 1.3.2", "bytemuck", @@ -2193,7 +2193,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -2205,7 +2205,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "iced_accessibility", "iced_core", @@ -2217,7 +2217,7 @@ dependencies = [ [[package]] name = "iced_sctk" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "enum-repr", "float-cmp", @@ -2238,7 +2238,7 @@ dependencies = [ [[package]] name = "iced_style" version = "0.8.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "iced_core", "once_cell", @@ -2248,7 +2248,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "bytemuck", "cosmic-text", @@ -2266,7 +2266,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.10.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "bitflags 1.3.2", "bytemuck", @@ -2288,7 +2288,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "iced_renderer", "iced_runtime", @@ -2303,7 +2303,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.9.1" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "iced_graphics", "iced_runtime", @@ -2617,7 +2617,7 @@ checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" [[package]] name = "libcosmic" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#31d7c75098a9ea4857bc16321306aa40ed14eac2" +source = "git+https://github.com/pop-os/libcosmic#6699aa475646fd044b5233dc918e3b0e3604c8ed" dependencies = [ "apply", "cosmic-config", @@ -2703,9 +2703,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.18" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "lru" @@ -3438,9 +3438,9 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "png" -version = "0.17.8" +version = "0.17.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaeebc51f9e7d2c150d3f3bfeb667f2aa985db5ef1e3d212847bdedb488beeaa" +checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -3507,9 +3507,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.59" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" dependencies = [ "unicode-ident", ] @@ -3771,9 +3771,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "6.6.1" +version = "6.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b68543d5527e158213414a92832d2aab11a84d2571a5eb021ebe22c43aab066" +checksum = "b73e721f488c353141288f223b599b4ae9303ecf3e62923f40a492f0634a4dc3" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -3782,14 +3782,14 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "6.5.0" +version = "6.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4e0f0ced47ded9a68374ac145edd65a6c1fa13a96447b873660b2a568a0fd7" +checksum = "e22ce362f5561923889196595504317a4372b84210e6e335da529a65ea5452b5" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 1.0.109", + "syn 2.0.18", "walkdir", ] @@ -3827,9 +3827,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.37.19" +version = "0.37.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" +checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0" dependencies = [ "bitflags 1.3.2", "errno", @@ -3912,18 +3912,18 @@ checksum = "1ef965a420fe14fdac7dd018862966a4c14094f900e1650bbc71ddd7d580c8af" [[package]] name = "serde" -version = "1.0.163" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.163" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", @@ -4290,9 +4290,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.29.1" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c72130613601f6aad275f8bb9a1d4bf953df8e9c7891029f30e5fdc405ad07c4" +checksum = "9557d0845b86eea8182f7b10dff120214fb6cd9fd937b6f4917714e546a38695" dependencies = [ "cfg-if", "core-foundation-sys", diff --git a/app/src/app.rs b/app/src/app.rs index 0fe55cc..9a9c0a7 100644 --- a/app/src/app.rs +++ b/app/src/app.rs @@ -7,7 +7,8 @@ use cosmic_panel_config::CosmicPanelConfig; use cosmic_settings_page::{self as page, section}; use cosmic::{ - cosmic_config::config_subscription, + cosmic_config::{config_subscription, CosmicConfigEntry}, + cosmic_theme::util::CssColor, iced::{ self, event::wayland::{self, WindowEvent, WindowState}, @@ -28,6 +29,7 @@ use cosmic::{ }, Element, ElementExt, }; +use tracing::error; use crate::{ config::Config, @@ -45,7 +47,7 @@ use crate::{ widget::{page_title, parent_page_button, search_header, sub_page_button}, }; -use std::{borrow::Cow, process}; +use std::{borrow::Cow, process, sync::Arc}; #[allow(clippy::struct_excessive_bools)] #[allow(clippy::module_name_repetitions)] @@ -88,6 +90,7 @@ pub enum Message { WindowState(WindowState), PanelConfig(CosmicPanelConfig), DesktopInfo, + ThemeChanged(Theme), } impl Application for SettingsApp { @@ -116,8 +119,8 @@ impl Application for SettingsApp { search_selections: Vec::default(), show_maximize: true, show_minimize: true, - theme: Theme::dark(), window_width: 0, + theme: theme(), }; // app.insert_page::(); @@ -199,6 +202,23 @@ impl Application for SettingsApp { } }, ), + config_subscription::>( + 0, + cosmic::cosmic_theme::NAME.into(), + cosmic::cosmic_theme::Theme::::version() as u64, + ) + .map(|(_, res)| { + let theme = res.map_or_else( + |(errors, theme)| { + for err in errors { + error!("{:?}", err); + } + theme.into_srgba() + }, + cosmic::cosmic_theme::Theme::into_srgba, + ); + Message::ThemeChanged(cosmic::theme::Theme::custom(Arc::new(theme))) + }), ]) } @@ -313,6 +333,9 @@ impl Application for SettingsApp { )); } } + Message::ThemeChanged(theme) => { + self.theme = theme; + } } ret } @@ -602,3 +625,22 @@ impl SettingsApp { .map(Message::Page) } } + +fn theme() -> Theme { + let Ok(helper) = cosmic::cosmic_config::Config::new( + cosmic::cosmic_theme::NAME, + cosmic::cosmic_theme::Theme::::version() as u64, + ) else { + return cosmic::theme::Theme::dark(); + }; + let t = cosmic::cosmic_theme::Theme::get_entry(&helper).map_or_else( + |(errors, theme)| { + for err in errors { + tracing::error!("{:?}", err); + } + theme.into_srgba() + }, + cosmic::cosmic_theme::Theme::into_srgba, + ); + cosmic::theme::Theme::custom(Arc::new(t)) +}