From 1deda477d9dd7241bdf41bed2237aa85d897f707 Mon Sep 17 00:00:00 2001 From: Eduardo Flores Date: Wed, 1 May 2024 14:16:40 -0700 Subject: [PATCH] fix(appearance): use same theme border radius for dock and panel. --- .../src/pages/desktop/appearance.rs | 53 +++++++++++++++++++ .../src/pages/desktop/panel/inner.rs | 48 ++++++++++++++++- 2 files changed, 99 insertions(+), 2 deletions(-) diff --git a/cosmic-settings/src/pages/desktop/appearance.rs b/cosmic-settings/src/pages/desktop/appearance.rs index 34e2942..3ea3181 100644 --- a/cosmic-settings/src/pages/desktop/appearance.rs +++ b/cosmic-settings/src/pages/desktop/appearance.rs @@ -23,6 +23,7 @@ use cosmic::widget::{ }; use cosmic::Apply; use cosmic::{command, Command, Element}; +use cosmic_panel_config::CosmicPanelConfig; use cosmic_settings_page::Section; use cosmic_settings_page::{self as page, section}; use cosmic_settings_wallpaper as wallpaper; @@ -72,6 +73,10 @@ pub struct Page { interface_text: ColorPickerModel, control_component: ColorPickerModel, roundness: Roundness, + dock_config_helper: Option, + dock_config: Option, + panel_config_helper: Option, + panel_config: Option, icon_theme_active: Option, icon_themes: IconThemes, @@ -149,6 +154,17 @@ impl && c != theme.palette.accent_yellow }); + let panel_config_helper = CosmicPanelConfig::cosmic_config("Panel").ok(); + let dock_config_helper = CosmicPanelConfig::cosmic_config("Dock").ok(); + let panel_config = panel_config_helper.as_ref().and_then(|config_helper| { + let panel_config = CosmicPanelConfig::get_entry(config_helper).ok()?; + (panel_config.name == "Panel").then_some(panel_config) + }); + let dock_config = dock_config_helper.as_ref().and_then(|config_helper| { + let panel_config = CosmicPanelConfig::get_entry(config_helper).ok()?; + (panel_config.name == "Dock").then_some(panel_config) + }); + Self { can_reset: if theme_mode.is_dark { theme_builder == ThemeBuilder::dark() @@ -158,6 +174,10 @@ impl theme_builder_needs_update: false, context_view: None, roundness: theme_builder.corner_radii.into(), + dock_config_helper, + dock_config, + panel_config_helper, + panel_config, custom_accent: ColorPickerModel::new( &*HEX, &*RGB, @@ -622,6 +642,7 @@ impl Page { self.roundness = r; self.theme_builder.corner_radii = self.roundness.into(); self.theme_builder_needs_update = true; + self.update_panel_radii(r); Command::none() } Message::Entered((icon_themes, icon_handles)) => { @@ -987,6 +1008,38 @@ impl Page { _ => Command::none(), } } + + fn update_panel_radii(&mut self, roundness: Roundness) { + if let Some(panel_config_helper) = self.panel_config_helper.as_ref() { + if let Some(panel_config) = self.panel_config.as_mut() { + let radii = if panel_config.anchor_gap || !panel_config.expand_to_edges { + let cornder_radii: CornerRadii = roundness.into(); + cornder_radii.radius_xl[0] as u32 + } else { + 0 + }; + let update = panel_config.set_border_radius(panel_config_helper, radii); + if let Err(err) = update { + tracing::error!(?err, "Error updating panel corner radii"); + } + } + }; + + if let Some(dock_config_helper) = self.dock_config_helper.as_ref() { + if let Some(dock_config) = self.dock_config.as_mut() { + let radii = if dock_config.anchor_gap || !dock_config.expand_to_edges { + let cornder_radii: CornerRadii = roundness.into(); + cornder_radii.radius_xl[0] as u32 + } else { + 0 + }; + let update = dock_config.set_border_radius(dock_config_helper, radii); + if let Err(err) = update { + tracing::error!(?err, "Error updating dock corner radii"); + } + } + }; + } } impl page::Page for Page { diff --git a/cosmic-settings/src/pages/desktop/panel/inner.rs b/cosmic-settings/src/pages/desktop/panel/inner.rs index 8855801..c512f77 100644 --- a/cosmic-settings/src/pages/desktop/panel/inner.rs +++ b/cosmic-settings/src/pages/desktop/panel/inner.rs @@ -1,6 +1,7 @@ use cosmic::{ cctk::sctk::reexports::client::{backend::ObjectId, protocol::wl_output::WlOutput, Proxy}, - cosmic_config::{self, CosmicConfigEntry}, + cosmic_config::{self, Config, CosmicConfigEntry}, + cosmic_theme::{CornerRadii, ThemeBuilder, ThemeMode}, iced::Length, theme, widget::{ @@ -502,11 +503,54 @@ impl PageInner { } if panel_config.anchor_gap || !panel_config.expand_to_edges { - panel_config.border_radius = 8; + let radii = Self::get_corner_radii().radius_xl[0] as u32; + panel_config.border_radius = radii; } else { panel_config.border_radius = 0; } _ = panel_config.write_entry(helper); } + + fn get_corner_radii() -> CornerRadii { + let theme_mode_config = ThemeMode::config().ok(); + let theme_mode = theme_mode_config + .as_ref() + .map(|c| match ThemeMode::get_entry(c) { + Ok(t) => t, + Err((errors, t)) => { + for e in errors { + tracing::error!("{e}"); + } + t + } + }) + .unwrap_or_default(); + + let theme_builder_config = if theme_mode.is_dark { + ThemeBuilder::dark_config() + } else { + ThemeBuilder::light_config() + } + .ok(); + let theme_builder = theme_builder_config.as_ref().map_or_else( + || { + if theme_mode.is_dark { + ThemeBuilder::dark() + } else { + ThemeBuilder::light() + } + }, + |c| match ThemeBuilder::get_entry(c) { + Ok(t) => t, + Err((errors, t)) => { + for e in errors { + tracing::error!("{e}"); + } + t + } + }, + ); + theme_builder.corner_radii + } }