fix(appearance): use same theme border radius for dock and panel.

This commit is contained in:
Eduardo Flores 2024-05-01 14:16:40 -07:00 committed by Ashley Wulber
parent 2d83b22a56
commit 1deda477d9
2 changed files with 99 additions and 2 deletions

View file

@ -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<Config>,
dock_config: Option<CosmicPanelConfig>,
panel_config_helper: Option<Config>,
panel_config: Option<CosmicPanelConfig>,
icon_theme_active: Option<usize>,
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<crate::pages::Message> for Page {

View file

@ -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
}
}