From 45f1183d92d916830c9973854ad67d1b4864254d Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy Date: Mon, 21 Apr 2025 18:14:58 +0200 Subject: [PATCH] feat: make ContextDrawer model accessible to pages --- Cargo.lock | 156 ++++++------------ cosmic-settings/Cargo.toml | 2 +- cosmic-settings/src/app.rs | 12 +- .../src/pages/applications/startup_apps.rs | 22 +-- .../src/pages/desktop/appearance/mod.rs | 12 +- .../src/pages/desktop/dock/applets.rs | 20 ++- .../src/pages/desktop/panel/applets_inner.rs | 24 +-- .../src/pages/desktop/wallpaper/mod.rs | 23 ++- .../src/pages/input/keyboard/mod.rs | 30 ++-- .../pages/input/keyboard/shortcuts/common.rs | 24 ++- .../pages/input/keyboard/shortcuts/custom.rs | 16 +- .../keyboard/shortcuts/manage_windows.rs | 7 +- .../src/pages/input/keyboard/shortcuts/mod.rs | 7 +- .../input/keyboard/shortcuts/move_window.rs | 7 +- .../src/pages/input/keyboard/shortcuts/nav.rs | 6 +- .../pages/input/keyboard/shortcuts/system.rs | 7 +- .../pages/input/keyboard/shortcuts/tiling.rs | 7 +- cosmic-settings/src/pages/mod.rs | 4 + cosmic-settings/src/pages/time/date.rs | 13 +- cosmic-settings/src/pages/time/region.rs | 15 +- page/src/binder.rs | 7 +- page/src/insert.rs | 2 +- page/src/lib.rs | 8 +- page/src/section.rs | 2 +- 24 files changed, 210 insertions(+), 223 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b18ac64..f581c1d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1175,9 +1175,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.36" +version = "4.5.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2df961d8c8a0d08aa9945718ccf584145eee3f3aa06cddbeac12933781102e04" +checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" dependencies = [ "clap_builder", "clap_derive", @@ -1185,9 +1185,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.36" +version = "4.5.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "132dbda40fb6753878316a489d5a1242a8ef2f0d9e47ba01c951ea8aa7d013a5" +checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" dependencies = [ "anstream", "anstyle", @@ -1522,7 +1522,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1544,7 +1544,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "quote", "syn 1.0.109", @@ -1600,7 +1600,7 @@ dependencies = [ [[package]] name = "cosmic-panel-config" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-panel#72581ce21346d85007e44ce43ae48c6ea92b5f61" +source = "git+https://github.com/pop-os/cosmic-panel#307a75c9338a28870193ff8e01e5cad9b0a9ccb1" dependencies = [ "anyhow", "cosmic-config", @@ -1689,7 +1689,7 @@ dependencies = [ "downcast-rs", "eyre", "fixed_decimal", - "fontdb 0.16.2", + "fontdb 0.23.0", "freedesktop-desktop-entry", "futures", "gettext-rs", @@ -1839,10 +1839,10 @@ dependencies = [ [[package]] name = "cosmic-text" version = "0.14.2" -source = "git+https://github.com/pop-os/cosmic-text.git#9e7a56f083db15f67510df4396351464df2e64bd" +source = "git+https://github.com/pop-os/cosmic-text.git#b017d7c856aed4b1a3ef0952df75d02d889a1f7b" dependencies = [ "bitflags 2.9.0", - "fontdb 0.16.2", + "fontdb 0.23.0", "log", "rangemap", "rustc-hash 1.1.0", @@ -1861,7 +1861,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "almost", "cosmic-config", @@ -2628,20 +2628,6 @@ dependencies = [ "roxmltree", ] -[[package]] -name = "fontdb" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" -dependencies = [ - "fontconfig-parser", - "log", - "memmap2 0.9.5", - "slotmap", - "tinyvec", - "ttf-parser 0.20.0", -] - [[package]] name = "fontdb" version = "0.18.0" @@ -2656,6 +2642,20 @@ dependencies = [ "ttf-parser 0.21.1", ] +[[package]] +name = "fontdb" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2 0.9.5", + "slotmap", + "tinyvec", + "ttf-parser 0.25.1", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -3235,7 +3235,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.61.0", + "windows-core 0.57.0", ] [[package]] @@ -3250,7 +3250,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "dnd", "iced_accessibility", @@ -3268,7 +3268,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "accesskit", "accesskit_winit", @@ -3277,7 +3277,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "bitflags 2.9.0", "bytes", @@ -3302,7 +3302,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "futures", "iced_core", @@ -3328,7 +3328,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "bitflags 2.9.0", "bytemuck", @@ -3350,7 +3350,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3362,7 +3362,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -3378,7 +3378,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "bytemuck", "cosmic-text", @@ -3394,7 +3394,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "as-raw-xcb-connection", "bitflags 2.9.0", @@ -3425,7 +3425,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3444,7 +3444,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -4471,7 +4471,7 @@ checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libcosmic" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#1abd6d75786697b48e1d5922717febd0ebeb48ac" +source = "git+https://github.com/pop-os/libcosmic#7aadfe6ba627236173405144c4deb4bdcff8208c" dependencies = [ "apply", "ashpd 0.9.2", @@ -4539,9 +4539,9 @@ checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libpulse-binding" -version = "2.29.0" +version = "2.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "441092fb2d05962d74246a00c1b2f8c87c60fb6b38a5cc42227c229a702c0ce5" +checksum = "909eb3049e16e373680fe65afe6e2a722ace06b671250cc4849557bc57d6a397" dependencies = [ "bitflags 2.9.0", "libc", @@ -4553,9 +4553,9 @@ dependencies = [ [[package]] name = "libpulse-sys" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8febf45075a6ac7e36d0c7aa62536217f476f24456854cdad296952852b5cd2" +checksum = "d74371848b22e989f829cc1621d2ebd74960711557d8b45cfe740f60d0a05e61" dependencies = [ "libc", "num-derive", @@ -6778,9 +6778,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -7527,12 +7527,6 @@ dependencies = [ "tracing-log", ] -[[package]] -name = "ttf-parser" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" - [[package]] name = "ttf-parser" version = "0.21.1" @@ -7544,6 +7538,9 @@ name = "ttf-parser" version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" +dependencies = [ + "core_maths", +] [[package]] name = "type-map" @@ -8269,7 +8266,7 @@ version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" dependencies = [ - "windows-result 0.1.2", + "windows-result", "windows-targets 0.52.6", ] @@ -8281,23 +8278,10 @@ checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" dependencies = [ "windows-implement 0.57.0", "windows-interface 0.57.0", - "windows-result 0.1.2", + "windows-result", "windows-targets 0.52.6", ] -[[package]] -name = "windows-core" -version = "0.61.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" -dependencies = [ - "windows-implement 0.60.0", - "windows-interface 0.59.1", - "windows-link", - "windows-result 0.3.2", - "windows-strings", -] - [[package]] name = "windows-implement" version = "0.53.0" @@ -8320,17 +8304,6 @@ dependencies = [ "syn 2.0.100", ] -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", -] - [[package]] name = "windows-interface" version = "0.53.0" @@ -8353,17 +8326,6 @@ dependencies = [ "syn 2.0.100", ] -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.100", -] - [[package]] name = "windows-link" version = "0.1.1" @@ -8379,24 +8341,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-result" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-sys" version = "0.45.0" @@ -8779,7 +8723,7 @@ dependencies = [ [[package]] name = "xdg-shell-wrapper-config" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-panel#72581ce21346d85007e44ce43ae48c6ea92b5f61" +source = "git+https://github.com/pop-os/cosmic-panel#307a75c9338a28870193ff8e01e5cad9b0a9ccb1" dependencies = [ "serde", "wayland-protocols-wlr", diff --git a/cosmic-settings/Cargo.toml b/cosmic-settings/Cargo.toml index 3a0dcfd..6a9a4d2 100644 --- a/cosmic-settings/Cargo.toml +++ b/cosmic-settings/Cargo.toml @@ -78,7 +78,7 @@ zbus = { version = "4.4.0", default-features = false, features = [ "tokio", ], optional = true } zbus_polkit = { version = "4.0.0", optional = true } -fontdb = "=0.16.2" +fontdb = "0.23.0" fixed_decimal = "0.5.6" mime = "0.3.17" rustix = { version = "1.0.3", features = ["process"] } diff --git a/cosmic-settings/src/app.rs b/cosmic-settings/src/app.rs index 3a500f3..0b9f814 100644 --- a/cosmic-settings/src/app.rs +++ b/cosmic-settings/src/app.rs @@ -146,7 +146,6 @@ impl SettingsApp { #[derive(Clone, Debug)] pub enum Message { - CloseContextDrawer, #[cfg(feature = "wayland")] DesktopInfo, Error(String), @@ -370,6 +369,8 @@ impl cosmic::Application for SettingsApp { } Message::PageMessage(message) => match message { + crate::pages::Message::CloseContextDrawer => return self.close_context_drawer(), + #[cfg(feature = "page-accessibility")] crate::pages::Message::Accessibility(message) => { if let Some(page) = self.pages.page_mut::() { @@ -761,8 +762,6 @@ impl cosmic::Application for SettingsApp { self.context_title = Some(title.to_string()); } - Message::CloseContextDrawer => return self.close_context_drawer(), - Message::Error(error) => { tracing::error!(error, "error occurred"); } @@ -814,10 +813,9 @@ impl cosmic::Application for SettingsApp { if self.core.window.show_context { self.active_context_page.and_then(|context_page| { self.pages.context_drawer(context_page).map(|cd| { - let cd = cosmic::app::context_drawer::context_drawer( - cd.map(Message::PageMessage), - Message::CloseContextDrawer, - ); + let cd = cd.map(Message::from); + + // TODO: The page should handle this? if let Some(title) = self.context_title.as_ref() { cd.title(title) } else { diff --git a/cosmic-settings/src/pages/applications/startup_apps.rs b/cosmic-settings/src/pages/applications/startup_apps.rs index 1b325b4..e8bded8 100644 --- a/cosmic-settings/src/pages/applications/startup_apps.rs +++ b/cosmic-settings/src/pages/applications/startup_apps.rs @@ -1,3 +1,4 @@ +use cosmic::app::ContextDrawer; use cosmic::iced::{Alignment, Length}; use cosmic::widget::{button, icon, settings, text}; use cosmic::{Apply, Element, Task, widget}; @@ -43,14 +44,13 @@ impl Default for Page { #[derive(Clone, Debug)] pub enum Message { - ShowApplicationSidebar(DirectoryType), - UpdateStartupApplications(CachedApps), - UpdateApplications(CachedApps), - - ApplicationSearch(String), AddStartupApplication(DirectoryType, DesktopEntry), - RemoveStartupApplication(DirectoryType, DesktopEntry, bool), + ApplicationSearch(String), CancelRemoveStartupApplication, + RemoveStartupApplication(DirectoryType, DesktopEntry, bool), + ShowApplicationSidebar(DirectoryType), + UpdateApplications(CachedApps), + UpdateStartupApplications(CachedApps), } #[derive(Clone, Debug, Eq, PartialEq, Hash)] @@ -110,11 +110,13 @@ impl page::Page for Page { Some(vec![sections.insert(apps())]) } - fn context_drawer(&self) -> Option> { + fn context_drawer(&self) -> Option> { match &self.context { - Some(Context::AddApplication(directory_type)) => { - Some(self.add_application_context_view(directory_type.clone())) - } + Some(Context::AddApplication(directory_type)) => Some(cosmic::app::context_drawer( + self.add_application_context_view(directory_type.clone()) + .map(crate::pages::Message::from), + crate::pages::Message::CloseContextDrawer, + )), None => None, } } diff --git a/cosmic-settings/src/pages/desktop/appearance/mod.rs b/cosmic-settings/src/pages/desktop/appearance/mod.rs index 62017f6..896d224 100644 --- a/cosmic-settings/src/pages/desktop/appearance/mod.rs +++ b/cosmic-settings/src/pages/desktop/appearance/mod.rs @@ -7,6 +7,7 @@ pub mod icon_themes; use std::borrow::Cow; use std::sync::Arc; +use cosmic::app::ContextDrawer; //TODO: use embedded cosmic-files for portability use cosmic::config::CosmicTk; use cosmic::cosmic_config::{Config, ConfigSet, CosmicConfigEntry}; @@ -1342,7 +1343,7 @@ impl Page { let task = match message { ColorPickerUpdate::AppliedColor | ColorPickerUpdate::Reset => { needs_update = true; - cosmic::task::message(crate::app::Message::CloseContextDrawer) + cosmic::task::message(crate::pages::Message::CloseContextDrawer) } ColorPickerUpdate::ActionFinished => { @@ -1351,7 +1352,7 @@ impl Page { } ColorPickerUpdate::Cancel => { - cosmic::task::message(crate::app::Message::CloseContextDrawer) + cosmic::task::message(crate::pages::Message::CloseContextDrawer) } ColorPickerUpdate::ToggleColorPicker => { @@ -1621,7 +1622,7 @@ impl page::Page for Page { cosmic::task::message(crate::pages::Message::Appearance(Message::Left)) } - fn context_drawer(&self) -> Option> { + fn context_drawer(&self) -> Option> { let view = match self.context_view? { ContextView::AccentWindowHint => color_picker_context_view( None, @@ -1710,7 +1711,10 @@ impl page::Page for Page { ContextView::IconsAndToolkit => self.icons_and_toolkit(), }; - Some(view) + Some(cosmic::app::context_drawer( + view, + crate::pages::Message::CloseContextDrawer, + )) } } diff --git a/cosmic-settings/src/pages/desktop/dock/applets.rs b/cosmic-settings/src/pages/desktop/dock/applets.rs index 46cff66..1affb47 100644 --- a/cosmic-settings/src/pages/desktop/dock/applets.rs +++ b/cosmic-settings/src/pages/desktop/dock/applets.rs @@ -1,5 +1,6 @@ use cosmic::{ Apply, Element, Task, + app::ContextDrawer, cosmic_config::CosmicConfigEntry, iced::{Alignment, Length}, widget::{button, container, row}, @@ -13,7 +14,7 @@ use crate::{ app, pages::{ self, - desktop::panel::applets_inner::{self, AppletsPage, ContextDrawer, lists}, + desktop::panel::applets_inner::{self, AppletsPage, ContextDrawerVariant, lists}, }, }; @@ -98,14 +99,17 @@ impl page::Page for Page { Some(content) } - fn context_drawer(&self) -> Option> { - Some(match self.inner.context { - Some(ContextDrawer::AddApplet) => self - .inner - .add_applet_view(|msg| crate::pages::Message::DockApplet(Message(msg))), + fn context_drawer(&self) -> Option> { + Some(cosmic::app::context_drawer( + match self.inner.context { + Some(ContextDrawerVariant::AddApplet) => self + .inner + .add_applet_view(|msg| crate::pages::Message::DockApplet(Message(msg))), - None => return None, - }) + None => return None, + }, + crate::pages::Message::CloseContextDrawer, + )) } fn set_id(&mut self, entity: cosmic_settings_page::Entity) { diff --git a/cosmic-settings/src/pages/desktop/panel/applets_inner.rs b/cosmic-settings/src/pages/desktop/panel/applets_inner.rs index 62b1731..505653d 100644 --- a/cosmic-settings/src/pages/desktop/panel/applets_inner.rs +++ b/cosmic-settings/src/pages/desktop/panel/applets_inner.rs @@ -1,3 +1,4 @@ +use cosmic::app::ContextDrawer; use cosmic::iced::Vector; use cosmic::iced::clipboard::dnd::{ DndAction, DndDestinationRectangle, DndEvent, OfferEvent, SourceEvent, @@ -56,7 +57,7 @@ pub struct Page { pub(crate) current_config: Option, pub(crate) reorder_widget_state: Option<(Applet<'static>, CosmicPanelConfig)>, pub(crate) search: String, - pub(crate) context: Option, + pub(crate) context: Option, } impl Default for Page { @@ -132,14 +133,17 @@ impl page::Page for Page { Some(content) } - fn context_drawer(&self) -> Option> { - Some(match self.context { - Some(ContextDrawer::AddApplet) => { - self.add_applet_view(crate::pages::Message::PanelApplet) - } + fn context_drawer(&self) -> Option> { + Some(cosmic::app::context_drawer( + match self.context { + Some(ContextDrawerVariant::AddApplet) => { + self.add_applet_view(crate::pages::Message::PanelApplet) + } - None => return None, - }) + None => return None, + }, + crate::pages::Message::CloseContextDrawer, + )) } fn on_enter(&mut self) -> Task { @@ -196,7 +200,7 @@ impl Debug for Message { } } -pub enum ContextDrawer { +pub enum ContextDrawerVariant { AddApplet, } @@ -416,7 +420,7 @@ impl Page { self.save(); } Message::AddAppletDrawer => { - self.context = Some(ContextDrawer::AddApplet); + self.context = Some(ContextDrawerVariant::AddApplet); return cosmic::task::message(app::Message::OpenContextDrawer( self.entity, Cow::Owned(fl!("add-applet")), diff --git a/cosmic-settings/src/pages/desktop/wallpaper/mod.rs b/cosmic-settings/src/pages/desktop/wallpaper/mod.rs index 944ec22..38e5132 100644 --- a/cosmic-settings/src/pages/desktop/wallpaper/mod.rs +++ b/cosmic-settings/src/pages/desktop/wallpaper/mod.rs @@ -16,7 +16,6 @@ use std::{ #[cfg(feature = "xdg-portal")] use cosmic::dialog::file_chooser; -use cosmic::iced_runtime::core::image::Handle as ImageHandle; use cosmic::widget::{ button, dropdown, list_column, row, segmented_button::{self, SingleSelectModel}, @@ -26,6 +25,7 @@ use cosmic::{ Apply, Element, Task, widget::{ColorPickerModel, color_picker::ColorPickerUpdate, icon}, }; +use cosmic::{app::ContextDrawer, iced_runtime::core::image::Handle as ImageHandle}; use cosmic::{ iced::{Alignment, Color, Length, window}, surface, @@ -276,15 +276,20 @@ impl page::Page for Page { Task::none() } - fn context_drawer(&self) -> Option> { - self.context_view.map(|view| match view { - ContextView::AddColor => crate::widget::color_picker_context_view( - None, - fl!("reset-to-default").into(), - Message::ColorAdd, - &self.color_model, + fn context_drawer(&self) -> Option> { + self.context_view.map(|view| { + cosmic::app::context_drawer( + match view { + ContextView::AddColor => crate::widget::color_picker_context_view( + None, + fl!("reset-to-default").into(), + Message::ColorAdd, + &self.color_model, + ) + .map(crate::pages::Message::DesktopWallpaper), + }, + crate::pages::Message::CloseContextDrawer, ) - .map(crate::pages::Message::DesktopWallpaper), }) } } diff --git a/cosmic-settings/src/pages/input/keyboard/mod.rs b/cosmic-settings/src/pages/input/keyboard/mod.rs index bbd5a75..0d846c6 100644 --- a/cosmic-settings/src/pages/input/keyboard/mod.rs +++ b/cosmic-settings/src/pages/input/keyboard/mod.rs @@ -7,6 +7,7 @@ use std::cmp; use cosmic::{ Apply, Element, Task, + app::ContextDrawer, cosmic_config::{self, ConfigSet}, iced::{Alignment, Color, Length}, iced_core::Border, @@ -296,20 +297,21 @@ impl page::Page for Page { .description(fl!("keyboard", "desc")) } - fn context_drawer(&self) -> Option> { - match self.context { - Some(Context::ShowInputSourcesContext) => Some(self.add_input_source_view()), - Some(Context::SpecialCharacter(special_key)) => self - .special_character_key_view(special_key) - .map(crate::pages::Message::Keyboard) - .apply(Some), - Some(Context::NumlockState) => self - .numlock_state_view() - .map(crate::pages::Message::Keyboard) - .apply(Some), - - None => None, - } + fn context_drawer(&self) -> Option> { + self.context.as_ref().map(|context| { + cosmic::app::context_drawer( + match context { + Context::ShowInputSourcesContext => self.add_input_source_view(), + Context::SpecialCharacter(special_key) => self + .special_character_key_view(*special_key) + .map(crate::pages::Message::Keyboard), + Context::NumlockState => self + .numlock_state_view() + .map(crate::pages::Message::Keyboard), + }, + crate::pages::Message::CloseContextDrawer, + ) + }) } fn on_enter(&mut self) -> Task { diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs index 455efc3..b1eff05 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs @@ -1,6 +1,7 @@ // Copyright 2024 System76 // SPDX-License-Identifier: GPL-3.0-only +use cosmic::app::ContextDrawer; use cosmic::iced::{Alignment, Length}; use cosmic::widget::{self, button, icon, settings, text}; use cosmic::{Apply, Element, Task, theme}; @@ -168,15 +169,22 @@ impl Model { self.shortcuts_config_set(shortcuts); } - pub(super) fn context_drawer(&self) -> Option> { + pub(super) fn context_drawer( + &self, + apply: fn(ShortcutMessage) -> crate::pages::Message, + ) -> Option> { self.shortcut_context.as_ref().map(|id| { - context_drawer( - &self.shortcut_title, - &self.shortcut_models, - self.editing, - self.add_keybindings_button_id.clone(), - *id, - self.custom, + cosmic::app::context_drawer( + context_drawer( + &self.shortcut_title, + &self.shortcut_models, + self.editing, + self.add_keybindings_button_id.clone(), + *id, + self.custom, + ) + .map(apply), + crate::pages::Message::CloseContextDrawer, ) }) } diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs index 745b636..e66e6df 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs @@ -5,6 +5,7 @@ use std::str::FromStr; use super::{ShortcutBinding, ShortcutMessage, ShortcutModel}; +use cosmic::app::ContextDrawer; use cosmic::iced::{Alignment, Length}; use cosmic::widget::{self, button, icon}; use cosmic::{Apply, Element, Task}; @@ -360,15 +361,18 @@ impl page::Page for Page { .map(|el| el.map(|m| crate::pages::Message::CustomShortcuts(Message::Shortcut(m)))) } - fn context_drawer(&self) -> Option> { + fn context_drawer(&self) -> Option> { if self.add_shortcut.active { - Some(self.add_keybinding_context()) + Some(cosmic::app::context_drawer( + self.add_keybinding_context() + .map(crate::pages::Message::CustomShortcuts), + crate::pages::Message::CloseContextDrawer, + )) } else { - self.model - .context_drawer() - .map(|el| el.map(Message::Shortcut)) + self.model.context_drawer(|msg| { + crate::pages::Message::CustomShortcuts(Message::Shortcut(msg)) + }) } - .map(|el| el.map(crate::pages::Message::CustomShortcuts)) } fn on_context_drawer_close(&mut self) -> Task { diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/manage_windows.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/manage_windows.rs index ca39fae..77ff512 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/manage_windows.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/manage_windows.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-only use super::{ShortcutMessage, ShortcutModel}; -use cosmic::{Element, Task}; +use cosmic::{Element, Task, app::ContextDrawer}; use cosmic_settings_config::shortcuts::Action; use cosmic_settings_config::shortcuts::action::ResizeDirection; use cosmic_settings_page::{self as page, Section, section}; @@ -47,10 +47,9 @@ impl page::Page for Page { Some(vec![sections.insert(shortcuts())]) } - fn context_drawer(&self) -> Option> { + fn context_drawer(&self) -> Option> { self.model - .context_drawer() - .map(|el| el.map(crate::pages::Message::ManageWindowShortcuts)) + .context_drawer(crate::pages::Message::ManageWindowShortcuts) } fn dialog(&self) -> Option> { diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs index 7b81a41..7764179 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs @@ -12,6 +12,7 @@ pub mod nav; pub mod system; pub mod tiling; +use cosmic::app::ContextDrawer; use cosmic::iced::Length; use cosmic::widget::{self, icon, settings, text}; use cosmic::{Apply, Element, Task, theme}; @@ -122,12 +123,12 @@ impl page::Page for Page { .description(fl!("keyboard-shortcuts", "desc")) } - fn context_drawer(&self) -> Option> { + fn context_drawer(&self) -> Option> { if self.search_model.shortcut_models.is_empty() { None } else { - self.search_model.context_drawer().map(|el| { - el.map(|msg| crate::pages::Message::KeyboardShortcuts(Message::SearchShortcut(msg))) + self.search_model.context_drawer(|msg| { + crate::pages::Message::KeyboardShortcuts(Message::SearchShortcut(msg)) }) } } diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/move_window.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/move_window.rs index 5b70a02..37293a8 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/move_window.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/move_window.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-only // use super::{ShortcutMessage, ShortcutModel}; -use cosmic::{Element, Task}; +use cosmic::{Element, Task, app::ContextDrawer}; use cosmic_settings_config::shortcuts::Action; use cosmic_settings_config::shortcuts::action::Direction; use cosmic_settings_page::{self as page, Section, section}; @@ -47,10 +47,9 @@ impl page::Page for Page { Some(vec![sections.insert(shortcuts())]) } - fn context_drawer(&self) -> Option> { + fn context_drawer(&self) -> Option> { self.model - .context_drawer() - .map(|el| el.map(crate::pages::Message::MoveWindowShortcuts)) + .context_drawer(crate::pages::Message::MoveWindowShortcuts) } fn dialog(&self) -> Option> { diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/nav.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/nav.rs index 43695b6..dc0bcc8 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/nav.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/nav.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-only use super::{ShortcutMessage, ShortcutModel}; +use cosmic::app::ContextDrawer; use cosmic::{Element, Task}; use cosmic_settings_config::shortcuts::Action; use cosmic_settings_config::shortcuts::action::{Direction, FocusDirection}; @@ -47,10 +48,9 @@ impl page::Page for Page { Some(vec![sections.insert(shortcuts())]) } - fn context_drawer(&self) -> Option> { + fn context_drawer(&self) -> Option> { self.model - .context_drawer() - .map(|el| el.map(crate::pages::Message::NavShortcuts)) + .context_drawer(crate::pages::Message::NavShortcuts) } fn dialog(&self) -> Option> { diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/system.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/system.rs index 345453e..a88b227 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/system.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/system.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-only use super::{ShortcutMessage, ShortcutModel}; -use cosmic::{Element, Task}; +use cosmic::{Element, Task, app::ContextDrawer}; use cosmic_settings_config::shortcuts::Action; use cosmic_settings_config::shortcuts::action::System as SystemAction; use cosmic_settings_page::{self as page, Section, section}; @@ -47,10 +47,9 @@ impl page::Page for Page { Some(vec![sections.insert(shortcuts())]) } - fn context_drawer(&self) -> Option> { + fn context_drawer(&self) -> Option> { self.model - .context_drawer() - .map(|el| el.map(crate::pages::Message::SystemShortcuts)) + .context_drawer(crate::pages::Message::SystemShortcuts) } fn dialog(&self) -> Option> { diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/tiling.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/tiling.rs index 3e107b8..d2ecc58 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/tiling.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/tiling.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-only use super::{ShortcutMessage, ShortcutModel}; -use cosmic::{Element, Task}; +use cosmic::{Element, Task, app::ContextDrawer}; use cosmic_settings_config::shortcuts::Action; use cosmic_settings_config::shortcuts::action::Orientation; use cosmic_settings_page::{self as page, Section, section}; @@ -47,10 +47,9 @@ impl page::Page for Page { Some(vec![sections.insert(shortcuts())]) } - fn context_drawer(&self) -> Option> { + fn context_drawer(&self) -> Option> { self.model - .context_drawer() - .map(|el| el.map(crate::pages::Message::TilingShortcuts)) + .context_drawer(crate::pages::Message::TilingShortcuts) } fn dialog(&self) -> Option> { diff --git a/cosmic-settings/src/pages/mod.rs b/cosmic-settings/src/pages/mod.rs index d40d3df..8ab1864 100644 --- a/cosmic-settings/src/pages/mod.rs +++ b/cosmic-settings/src/pages/mod.rs @@ -24,6 +24,7 @@ pub mod time; #[derive(Clone, Debug)] pub enum Message { + // Page-specific messages #[cfg(feature = "page-accessibility")] Accessibility(accessibility::Message), #[cfg(feature = "page-accessibility")] @@ -96,6 +97,9 @@ pub enum Message { WindowManagement(desktop::window_management::Message), #[cfg(feature = "page-networking")] Wired(networking::wired::Message), + + // Common page functionality + CloseContextDrawer, } impl From for crate::Message { diff --git a/cosmic-settings/src/pages/time/date.rs b/cosmic-settings/src/pages/time/date.rs index 63c3789..d4e2df2 100644 --- a/cosmic-settings/src/pages/time/date.rs +++ b/cosmic-settings/src/pages/time/date.rs @@ -6,6 +6,7 @@ use std::str::FromStr; use chrono::{Datelike, Timelike}; use cosmic::{ Apply, Element, Task, + app::ContextDrawer, cosmic_config::{self, ConfigGet, ConfigSet}, iced_core::text::Wrapping, surface, @@ -165,9 +166,13 @@ impl page::Page for Page { .map(crate::pages::Message::DateAndTime) } - fn context_drawer(&self) -> Option> { + fn context_drawer(&self) -> Option> { if self.timezone_context { - return Some(self.timezone_context_view()); + return Some(cosmic::app::context_drawer( + self.timezone_context_view() + .map(crate::pages::Message::from), + crate::pages::Message::CloseContextDrawer, + )); } None @@ -259,14 +264,14 @@ impl Page { Message::Error(why) => { tracing::error!(why, "failed to set timezone"); self.timezone_context = false; - return cosmic::task::message(crate::Message::CloseContextDrawer); + return cosmic::task::message(crate::pages::Message::CloseContextDrawer); } Message::UpdateTime => { self.set_ntp(true); self.update_local_time(); self.timezone_context = false; - return cosmic::task::message(crate::Message::CloseContextDrawer); + return cosmic::task::message(crate::pages::Message::CloseContextDrawer); } Message::Refresh(info) => { diff --git a/cosmic-settings/src/pages/time/region.rs b/cosmic-settings/src/pages/time/region.rs index 95da815..24cd8aa 100644 --- a/cosmic-settings/src/pages/time/region.rs +++ b/cosmic-settings/src/pages/time/region.rs @@ -6,6 +6,7 @@ use std::rc::Rc; use std::str::FromStr; use std::sync::Arc; +use cosmic::app::ContextDrawer; use cosmic::iced::{Alignment, Border, Color, Length}; use cosmic::iced_core::text::Wrapping; use cosmic::widget::{self, button, container}; @@ -152,11 +153,15 @@ impl page::Page for Page { cosmic::Task::none() } - fn context_drawer(&self) -> Option> { - Some(match self.context.as_ref()? { - ContextView::AddLanguage => self.add_language_view(), - ContextView::Region => self.region_view(), - }) + fn context_drawer(&self) -> Option> { + Some(cosmic::app::context_drawer( + match self.context.as_ref()? { + ContextView::AddLanguage => self.add_language_view(), + ContextView::Region => self.region_view(), + } + .map(crate::pages::Message::from), + crate::pages::Message::CloseContextDrawer, + )) } } diff --git a/page/src/binder.rs b/page/src/binder.rs index 902153e..834dd87 100644 --- a/page/src/binder.rs +++ b/page/src/binder.rs @@ -5,6 +5,7 @@ use crate::section::{self, Section}; use crate::{Content, Info, Page}; use cosmic::Element; use cosmic::Task; +use cosmic::app::ContextDrawer; use regex::Regex; use slotmap::{SecondaryMap, SlotMap, SparseSecondaryMap}; use std::{ @@ -40,7 +41,7 @@ impl Default for Binder { } } -impl Binder { +impl Binder { /// Check if a page exists in the model. #[must_use] #[inline] @@ -149,7 +150,7 @@ impl Binder { /// Create a context drawer for the given page. #[must_use] #[inline] - pub fn context_drawer(&self, id: crate::Entity) -> Option> { + pub fn context_drawer(&self, id: crate::Entity) -> Option> { let page = self.page.get(id)?; page.context_drawer() } @@ -239,7 +240,7 @@ impl Binder { } } -pub trait AutoBind: Page + Default + 'static { +pub trait AutoBind: Page + Default + 'static { /// Attaches sub-pages to the page. #[allow(clippy::must_use_candidate)] #[inline] diff --git a/page/src/insert.rs b/page/src/insert.rs index f6347b0..a476146 100644 --- a/page/src/insert.rs +++ b/page/src/insert.rs @@ -9,7 +9,7 @@ pub struct Insert<'a, Message> { pub id: Entity, } -impl Insert<'_, Message> { +impl Insert<'_, Message> { #[must_use] #[inline] pub fn id(self) -> Entity { diff --git a/page/src/lib.rs b/page/src/lib.rs index 2c086b1..1a2465a 100644 --- a/page/src/lib.rs +++ b/page/src/lib.rs @@ -5,7 +5,7 @@ mod binder; pub use binder::{AutoBind, Binder}; mod insert; -use cosmic::{Element, Task}; +use cosmic::{Element, Task, app::ContextDrawer}; use downcast_rs::{Downcast, impl_downcast}; pub use insert::Insert; @@ -24,7 +24,7 @@ slotmap::new_key_type! { /// A collection of sections which a page may be comprised of. pub type Content = Vec; -pub trait Page: Downcast { +pub trait Page: Downcast { /// Information about the page fn info(&self) -> Info; @@ -41,7 +41,7 @@ pub trait Page: Downcast { /// Display a context drawer for the page. #[must_use] #[inline] - fn context_drawer(&self) -> Option> { + fn context_drawer(&self) -> Option> { None } @@ -101,7 +101,7 @@ pub trait Page: Downcast { } } -impl_downcast!(Page); +impl_downcast!(Page where Message: Clone); /// Information about a page; including its title, icon, and description. #[derive(Setters)] diff --git a/page/src/section.rs b/page/src/section.rs index 1737215..3492e3a 100644 --- a/page/src/section.rs +++ b/page/src/section.rs @@ -52,7 +52,7 @@ impl Default for Section { } } -impl Section { +impl Section { #[must_use] #[inline] pub fn search_matches(&self, rule: &Regex) -> bool {