perf(desktop): reduce disk usage when reading and writing configs
This commit is contained in:
parent
395b922984
commit
94562eae88
5 changed files with 649 additions and 401 deletions
|
|
@ -100,6 +100,7 @@ pub enum Message {
|
|||
DelayedInit(page::Entity),
|
||||
DesktopInfo,
|
||||
Error(String),
|
||||
None,
|
||||
OpenContextDrawer(Cow<'static, str>),
|
||||
OutputAdded(OutputInfo, WlOutput),
|
||||
OutputRemoved(WlOutput),
|
||||
|
|
@ -290,6 +291,8 @@ impl cosmic::Application for SettingsApp {
|
|||
match message {
|
||||
Message::Page(page) => return self.activate_page(page),
|
||||
|
||||
Message::None => (),
|
||||
|
||||
Message::SetWindowTitle => return self.set_title(),
|
||||
|
||||
Message::SearchChanged(phrase) => {
|
||||
|
|
@ -347,7 +350,9 @@ impl cosmic::Application for SettingsApp {
|
|||
}
|
||||
|
||||
crate::pages::Message::Dock(message) => {
|
||||
page::update!(self.pages, message, dock::Page);
|
||||
if let Some(page) = self.pages.page_mut::<dock::Page>() {
|
||||
return page.update(message).map(Into::into);
|
||||
}
|
||||
}
|
||||
|
||||
crate::pages::Message::DockApplet(message) => {
|
||||
|
|
@ -443,7 +448,9 @@ impl cosmic::Application for SettingsApp {
|
|||
}
|
||||
|
||||
crate::pages::Message::Panel(message) => {
|
||||
page::update!(self.pages, message, panel::Page);
|
||||
if let Some(page) = self.pages.page_mut::<panel::Page>() {
|
||||
return page.update(message).map(Into::into);
|
||||
}
|
||||
}
|
||||
|
||||
crate::pages::Message::PanelApplet(message) => {
|
||||
|
|
@ -481,57 +488,82 @@ impl cosmic::Application for SettingsApp {
|
|||
|
||||
Message::OutputAdded(info, output) => {
|
||||
if let Some(page) = self.pages.page_mut::<panel::Page>() {
|
||||
page.update(panel::Message(_panel::Message::OutputAdded(
|
||||
info.name.clone().unwrap_or_default(),
|
||||
output.clone(),
|
||||
)));
|
||||
return page
|
||||
.update(panel::Message(_panel::Message::OutputAdded(
|
||||
info.name.clone().unwrap_or_default(),
|
||||
output.clone(),
|
||||
)))
|
||||
.map(Into::into);
|
||||
}
|
||||
// dock
|
||||
|
||||
if let Some(page) = self.pages.page_mut::<dock::Page>() {
|
||||
page.update(dock::Message::Inner(_panel::Message::OutputAdded(
|
||||
info.name.unwrap_or_default(),
|
||||
output,
|
||||
)));
|
||||
return page
|
||||
.update(dock::Message::Inner(_panel::Message::OutputAdded(
|
||||
info.name.unwrap_or_default(),
|
||||
output,
|
||||
)))
|
||||
.map(Into::into);
|
||||
}
|
||||
}
|
||||
|
||||
Message::OutputRemoved(output) => {
|
||||
if let Some(page) = self.pages.page_mut::<panel::Page>() {
|
||||
page.update(panel::Message(_panel::Message::OutputRemoved(
|
||||
output.clone(),
|
||||
)));
|
||||
}
|
||||
// dock
|
||||
if let Some(page) = self.pages.page_mut::<dock::Page>() {
|
||||
page.update(dock::Message::Inner(_panel::Message::OutputRemoved(output)));
|
||||
}
|
||||
}
|
||||
|
||||
Message::PanelConfig(config) if config.name.to_lowercase().contains("panel") => {
|
||||
page::update!(
|
||||
self.pages,
|
||||
panel::Message(_panel::Message::PanelConfig(config.clone())),
|
||||
panel::Page
|
||||
);
|
||||
|
||||
if let Some(page) = self.pages.page_mut::<applets_inner::Page>() {
|
||||
return page
|
||||
.update(applets_inner::Message::PanelConfig(config))
|
||||
.update(panel::Message(_panel::Message::OutputRemoved(
|
||||
output.clone(),
|
||||
)))
|
||||
.map(Into::into);
|
||||
}
|
||||
|
||||
if let Some(page) = self.pages.page_mut::<dock::Page>() {
|
||||
return page
|
||||
.update(dock::Message::Inner(_panel::Message::OutputRemoved(output)))
|
||||
.map(Into::into);
|
||||
}
|
||||
}
|
||||
|
||||
Message::PanelConfig(config) if config.name.to_lowercase().contains("panel") => {
|
||||
let mut commands = Vec::new();
|
||||
|
||||
if let Some(page) = self.pages.page_mut::<panel::Page>() {
|
||||
commands.push(
|
||||
page.update(panel::Message(_panel::Message::PanelConfig(config.clone())))
|
||||
.map(Into::into),
|
||||
);
|
||||
}
|
||||
|
||||
if let Some(page) = self.pages.page_mut::<applets_inner::Page>() {
|
||||
commands.push(
|
||||
page.update(applets_inner::Message::PanelConfig(config))
|
||||
.map(Into::into),
|
||||
);
|
||||
}
|
||||
|
||||
return Command::batch(commands);
|
||||
}
|
||||
|
||||
Message::PanelConfig(config) if config.name.to_lowercase().contains("dock") => {
|
||||
page::update!(
|
||||
self.pages,
|
||||
dock::Message::Inner(_panel::Message::PanelConfig(config.clone(),)),
|
||||
dock::Page
|
||||
);
|
||||
page::update!(
|
||||
self.pages,
|
||||
dock::applets::Message(applets_inner::Message::PanelConfig(config,)),
|
||||
dock::applets::Page
|
||||
);
|
||||
let mut commands = Vec::new();
|
||||
|
||||
if let Some(page) = self.pages.page_mut::<dock::Page>() {
|
||||
commands.push(
|
||||
page.update(dock::Message::Inner(_panel::Message::PanelConfig(
|
||||
config.clone(),
|
||||
)))
|
||||
.map(Into::into),
|
||||
);
|
||||
}
|
||||
|
||||
if let Some(page) = self.pages.page_mut::<dock::applets::Page>() {
|
||||
commands.push(
|
||||
page.update(dock::applets::Message(applets_inner::Message::PanelConfig(
|
||||
config,
|
||||
)))
|
||||
.map(Into::into),
|
||||
);
|
||||
}
|
||||
|
||||
return Command::batch(commands);
|
||||
}
|
||||
|
||||
Message::PanelConfig(_) => {}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -4,7 +4,7 @@ use cosmic::Apply;
|
|||
use cosmic::{
|
||||
cosmic_config::{ConfigSet, CosmicConfigEntry},
|
||||
widget::{settings, text, toggler},
|
||||
Element,
|
||||
Command, Element,
|
||||
};
|
||||
use cosmic_panel_config::{CosmicPanelConfig, CosmicPanelContainerConfig};
|
||||
use cosmic_settings_page::{self as page, section, Section};
|
||||
|
|
@ -31,17 +31,19 @@ pub enum Message {
|
|||
}
|
||||
|
||||
impl Page {
|
||||
pub fn update(&mut self, message: Message) {
|
||||
pub fn update(&mut self, message: Message) -> Command<crate::app::Message> {
|
||||
match message {
|
||||
Message::EnableDock(enabled) => {
|
||||
let Some(container_config) = self.inner.container_config.as_mut() else {
|
||||
return;
|
||||
return Command::none();
|
||||
};
|
||||
|
||||
let Some(panel_config) = self.inner.panel_config.as_ref() else {
|
||||
return;
|
||||
return Command::none();
|
||||
};
|
||||
|
||||
let Ok(helper) = CosmicPanelContainerConfig::cosmic_config() else {
|
||||
return;
|
||||
return Command::none();
|
||||
};
|
||||
|
||||
if enabled {
|
||||
|
|
@ -61,11 +63,16 @@ impl Page {
|
|||
if let Err(err) = helper.set("entries", entry_names) {
|
||||
error!("{:?}", err);
|
||||
}
|
||||
|
||||
Command::none()
|
||||
}
|
||||
Message::Inner(inner) => {
|
||||
self.inner.update(inner);
|
||||
}
|
||||
};
|
||||
Message::Inner(inner) => self
|
||||
.inner
|
||||
.update(inner)
|
||||
.map(Message::Inner)
|
||||
.map(crate::pages::Message::Dock)
|
||||
.map(crate::app::Message::PageMessage),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -109,11 +116,13 @@ impl Default for Page {
|
|||
fn default() -> Self {
|
||||
// TODO CosmicPanelConfig should return its own version
|
||||
let config_helper = CosmicPanelConfig::cosmic_config("Dock").ok();
|
||||
|
||||
let panel_config = config_helper.as_ref().and_then(|config_helper| {
|
||||
let panel_config = CosmicPanelConfig::get_entry(config_helper).ok()?;
|
||||
// If the config is not present, it will be created with the default values and the name will not match
|
||||
(panel_config.name == "Dock").then_some(panel_config)
|
||||
});
|
||||
|
||||
let system_default = cosmic::cosmic_config::Config::system(
|
||||
&format!("{}.Dock", cosmic_panel_config::NAME),
|
||||
CosmicPanelConfig::VERSION,
|
||||
|
|
@ -128,6 +137,7 @@ impl Default for Page {
|
|||
}
|
||||
})
|
||||
.ok();
|
||||
|
||||
let container_config = CosmicPanelContainerConfig::load().ok();
|
||||
Self {
|
||||
inner: PageInner {
|
||||
|
|
|
|||
|
|
@ -6,21 +6,24 @@ use cosmic::{
|
|||
widget::{
|
||||
button, container, dropdown, horizontal_space, icon, row, settings, slider, text, toggler,
|
||||
},
|
||||
Element,
|
||||
Command, Element,
|
||||
};
|
||||
|
||||
use cosmic::Apply;
|
||||
use cosmic_config::ConfigSet;
|
||||
use cosmic_panel_config::{
|
||||
AutoHide, CosmicPanelBackground, CosmicPanelConfig, CosmicPanelContainerConfig,
|
||||
CosmicPanelOuput, PanelAnchor, PanelSize,
|
||||
};
|
||||
use cosmic_settings_page::{self as page, Section};
|
||||
use slab::Slab;
|
||||
use std::collections::HashMap;
|
||||
use std::{collections::HashMap, time::Duration};
|
||||
|
||||
pub struct PageInner {
|
||||
pub(crate) config_helper: Option<cosmic_config::Config>,
|
||||
pub(crate) panel_config: Option<CosmicPanelConfig>,
|
||||
pub opacity: f32,
|
||||
pub opacity_changing: bool,
|
||||
pub outputs: Vec<String>,
|
||||
pub anchors: Vec<String>,
|
||||
pub backgrounds: Vec<String>,
|
||||
|
|
@ -36,6 +39,8 @@ impl Default for PageInner {
|
|||
Self {
|
||||
config_helper: Option::default(),
|
||||
panel_config: Option::default(),
|
||||
opacity: 0.0,
|
||||
opacity_changing: false,
|
||||
outputs: vec![fl!("all-displays")],
|
||||
anchors: vec![
|
||||
Anchor(PanelAnchor::Left).to_string(),
|
||||
|
|
@ -226,16 +231,22 @@ pub(crate) fn style<
|
|||
))
|
||||
.add(settings::flex_item(
|
||||
&descriptions[background_opacity],
|
||||
row::with_children(vec![
|
||||
text::body(fl!("number", HashMap::from_iter(vec![("number", 0)]))).into(),
|
||||
slider(0..=100, (panel_config.opacity * 100.0) as i32, |v| {
|
||||
Message::Opacity(v as f32 / 100.0)
|
||||
})
|
||||
.breakpoints(&[50])
|
||||
.into(),
|
||||
text::body(fl!("number", HashMap::from_iter(vec![("number", 100)]))).into(),
|
||||
])
|
||||
.spacing(12),
|
||||
row::with_capacity(3)
|
||||
.push(text::body(fl!(
|
||||
"number",
|
||||
HashMap::from_iter(vec![("number", 0)])
|
||||
)))
|
||||
.push(
|
||||
slider(0..=100, (panel_config.opacity * 100.0) as i32, |v| {
|
||||
Message::OpacityRequest(v as f32 / 100.0)
|
||||
})
|
||||
.breakpoints(&[50]),
|
||||
)
|
||||
.push(text::body(fl!(
|
||||
"number",
|
||||
HashMap::from_iter(vec![("number", 100)])
|
||||
)))
|
||||
.spacing(12),
|
||||
))
|
||||
.apply(Element::from)
|
||||
.map(msg_map)
|
||||
|
|
@ -396,7 +407,8 @@ pub enum Message {
|
|||
PanelSize(PanelSize),
|
||||
Appearance(usize),
|
||||
ExtendToEdge(bool),
|
||||
Opacity(f32),
|
||||
OpacityRequest(f32),
|
||||
OpacityApply,
|
||||
OutputAdded(String, WlOutput),
|
||||
OutputRemoved(WlOutput),
|
||||
PanelConfig(CosmicPanelConfig),
|
||||
|
|
@ -406,10 +418,11 @@ pub enum Message {
|
|||
|
||||
impl PageInner {
|
||||
#[allow(clippy::too_many_lines)]
|
||||
pub fn update(&mut self, message: Message) {
|
||||
pub fn update(&mut self, message: Message) -> Command<Message> {
|
||||
let Some(helper) = self.config_helper.as_ref() else {
|
||||
return;
|
||||
return Command::none();
|
||||
};
|
||||
|
||||
match &message {
|
||||
Message::ResetPanel => {
|
||||
if let Some((default, config)) = self
|
||||
|
|
@ -445,7 +458,7 @@ impl PageInner {
|
|||
};
|
||||
|
||||
let Some(panel_config) = self.panel_config.as_mut() else {
|
||||
return;
|
||||
return Command::none();
|
||||
};
|
||||
|
||||
match message {
|
||||
|
|
@ -509,13 +522,29 @@ impl PageInner {
|
|||
Message::ExtendToEdge(enabled) => {
|
||||
_ = panel_config.set_expand_to_edges(helper, enabled);
|
||||
}
|
||||
Message::Opacity(opacity) => {
|
||||
_ = panel_config.set_opacity(helper, opacity);
|
||||
Message::OpacityRequest(opacity) => {
|
||||
panel_config.opacity = opacity;
|
||||
|
||||
if self.opacity_changing {
|
||||
return Command::none();
|
||||
}
|
||||
|
||||
self.opacity_changing = true;
|
||||
return cosmic::command::future(async move {
|
||||
tokio::time::sleep(Duration::from_millis(125)).await;
|
||||
Message::OpacityApply
|
||||
});
|
||||
}
|
||||
|
||||
Message::OpacityApply => {
|
||||
self.opacity_changing = false;
|
||||
_ = helper.set("opacity", panel_config.opacity);
|
||||
}
|
||||
|
||||
Message::OutputAdded(name, output) => {
|
||||
self.outputs.push(name.clone());
|
||||
self.outputs_map.insert(output.id(), (name, output));
|
||||
return;
|
||||
return Command::none();
|
||||
}
|
||||
Message::OutputRemoved(output) => {
|
||||
if let Some((name, _)) = self.outputs_map.remove(&output.id()) {
|
||||
|
|
@ -526,7 +555,7 @@ impl PageInner {
|
|||
}
|
||||
Message::PanelConfig(c) => {
|
||||
self.panel_config = Some(c);
|
||||
return;
|
||||
return Command::none();
|
||||
}
|
||||
Message::ResetPanel | Message::FullReset => {}
|
||||
}
|
||||
|
|
@ -540,5 +569,7 @@ impl PageInner {
|
|||
} else {
|
||||
_ = panel_config.set_border_radius(helper, 0);
|
||||
}
|
||||
|
||||
Command::none()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
use cosmic::cosmic_config::CosmicConfigEntry;
|
||||
use cosmic::{cosmic_config::CosmicConfigEntry, Command};
|
||||
use cosmic_panel_config::{CosmicPanelConfig, CosmicPanelContainerConfig};
|
||||
use cosmic_settings_page::{self as page, section, Section};
|
||||
use slotmap::SlotMap;
|
||||
|
|
@ -22,8 +22,12 @@ pub struct Page {
|
|||
pub struct Message(pub inner::Message);
|
||||
|
||||
impl Page {
|
||||
pub fn update(&mut self, message: Message) {
|
||||
self.inner.update(message.0);
|
||||
pub fn update(&mut self, message: Message) -> Command<crate::app::Message> {
|
||||
self.inner
|
||||
.update(message.0)
|
||||
.map(Message)
|
||||
.map(crate::pages::Message::Panel)
|
||||
.map(crate::app::Message::PageMessage)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue