From df7e95e30a67b0dd694542229132ac4749c353a8 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Fri, 14 Mar 2025 12:11:19 -0400 Subject: [PATCH] feat: dropdown popups --- .vscode/settings.json | 4 +- Cargo.lock | 34 +++--- Cargo.toml | 8 +- cosmic-settings/src/app.rs | 26 +++-- .../src/pages/accessibility/magnifier.rs | 14 ++- cosmic-settings/src/pages/desktop/dock/mod.rs | 17 ++- .../src/pages/desktop/panel/inner.rs | 33 +++++- .../src/pages/desktop/panel/mod.rs | 14 ++- .../src/pages/desktop/wallpaper/mod.rs | 41 +++++-- .../src/pages/desktop/window_management.rs | 31 ++++-- cosmic-settings/src/pages/display/mod.rs | 46 +++++++- .../pages/input/keyboard/shortcuts/common.rs | 2 +- .../pages/input/keyboard/shortcuts/custom.rs | 6 +- .../src/pages/networking/vpn/mod.rs | 2 +- cosmic-settings/src/pages/networking/wifi.rs | 2 +- cosmic-settings/src/pages/power/mod.rs | 18 ++- cosmic-settings/src/pages/sound.rs | 49 ++++---- cosmic-settings/src/pages/system/about.rs | 2 +- .../src/pages/system/default_apps.rs | 105 +++++++++++++----- cosmic-settings/src/pages/system/users/mod.rs | 6 +- cosmic-settings/src/pages/time/date.rs | 49 +++++--- 21 files changed, 352 insertions(+), 157 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index fd4ea64..6555122 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - "rust-analyzer.check.overrideCommand": ["just", "check-json"] -} + // "rust-analyzer.check.overrideCommand": ["just", "check-json"] +} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 93eaf12..7e7b937 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1519,7 +1519,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1541,7 +1541,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "quote", "syn 1.0.109", @@ -1822,8 +1822,8 @@ dependencies = [ [[package]] name = "cosmic-text" -version = "0.13.1" -source = "git+https://github.com/pop-os/cosmic-text.git#60f2c2b0c2e7cf8734b3ad0fc94ef7bce94f649b" +version = "0.13.2" +source = "git+https://github.com/pop-os/cosmic-text.git#500a8fc6d172de5c9e08c6013070b6b7fcdf79dd" dependencies = [ "bitflags 2.8.0", "fontdb 0.16.2", @@ -1845,7 +1845,7 @@ dependencies = [ [[package]] name = "cosmic-theme" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "almost", "cosmic-config", @@ -3189,7 +3189,7 @@ dependencies = [ [[package]] name = "iced" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "dnd", "iced_accessibility", @@ -3207,7 +3207,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "accesskit", "accesskit_winit", @@ -3216,7 +3216,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "bitflags 2.8.0", "bytes", @@ -3241,7 +3241,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "futures", "iced_core", @@ -3267,7 +3267,7 @@ dependencies = [ [[package]] name = "iced_graphics" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "bitflags 2.8.0", "bytemuck", @@ -3289,7 +3289,7 @@ dependencies = [ [[package]] name = "iced_renderer" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "iced_graphics", "iced_tiny_skia", @@ -3301,7 +3301,7 @@ dependencies = [ [[package]] name = "iced_runtime" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "bytes", "cosmic-client-toolkit", @@ -3317,7 +3317,7 @@ dependencies = [ [[package]] name = "iced_tiny_skia" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "bytemuck", "cosmic-text", @@ -3333,7 +3333,7 @@ dependencies = [ [[package]] name = "iced_wgpu" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "as-raw-xcb-connection", "bitflags 2.8.0", @@ -3364,7 +3364,7 @@ dependencies = [ [[package]] name = "iced_widget" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -3383,7 +3383,7 @@ dependencies = [ [[package]] name = "iced_winit" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "cosmic-client-toolkit", "dnd", @@ -4389,7 +4389,7 @@ checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libcosmic" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463" +source = "git+https://github.com/pop-os/libcosmic#337b80d4ca02a63631668212bccbace22b8bb49f" dependencies = [ "apply", "ashpd 0.9.2", diff --git a/Cargo.toml b/Cargo.toml index bc7526b..657d254 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,11 +57,9 @@ cosmic-client-toolkit = { git = "https://github.com/pop-os/cosmic-protocols//", # For development and testing purposes # [patch.'https://github.com/pop-os/libcosmic'] -# libcosmic = { git = "https://github.com/pop-os/libcosmic//", branch = "font" } -# cosmic-config = { git = "https://github.com/pop-os/libcosmic//", branch = "font" } -# cosmic-theme = { git = "https://github.com/pop-os/libcosmic//", branch = "font" } -# iced_futures = { git = "https://github.com/pop-os/libcosmic//", branch = "font" } - +# libcosmic = { git = "https://github.com/pop-os/libcosmic//", branch = "drop-menu-tree-changes" } +# cosmic-config = { git = "https://github.com/pop-os/libcosmic//", branch = "drop-menu-tree-changes" } +# cosmic-theme = { git = "https://github.com/pop-os/libcosmic//", branch = "drop-menu-tree-changes" } # libcosmic = { path = "../libcosmic" } # cosmic-config = { path = "../libcosmic/cosmic-config" } # cosmic-theme = { path = "../libcosmic/cosmic-theme" } diff --git a/cosmic-settings/src/app.rs b/cosmic-settings/src/app.rs index ac9fef2..65f4592 100644 --- a/cosmic-settings/src/app.rs +++ b/cosmic-settings/src/app.rs @@ -21,10 +21,7 @@ use crate::pages::{self, system, time}; use crate::subscription::desktop_files; use crate::widget::{page_title, search_header}; use crate::PageCommands; -use cosmic::app::command::set_theme; use cosmic::app::context_drawer::ContextDrawer; -#[cfg(feature = "single-instance")] -use cosmic::app::DbusActivationMessage; #[cfg(feature = "wayland")] use cosmic::cctk::{sctk::output::OutputInfo, wayland_client::protocol::wl_output::WlOutput}; use cosmic::iced::Subscription; @@ -37,6 +34,7 @@ use cosmic::{ window, Length, }, prelude::*, + surface, widget::{ column, container, icon, id_container, nav_bar, scrollable, segmented_button, settings, }, @@ -164,6 +162,7 @@ pub enum Message { SearchSubmit, SetTheme(cosmic::theme::Theme), SetWindowTitle, + Surface(surface::Action), } impl cosmic::Application for SettingsApp { @@ -244,7 +243,7 @@ impl cosmic::Application for SettingsApp { .id(self.search_id.clone()) .on_clear(Message::SearchClear) .on_input(Message::SearchChanged) - .on_submit(Message::SearchSubmit) + .on_submit(|_| Message::SearchSubmit) .into() } else { icon::from_name("system-search-symbolic") @@ -581,7 +580,9 @@ impl cosmic::Application for SettingsApp { #[cfg(feature = "page-power")] crate::pages::Message::Power(message) => { - page::update!(self.pages, message, power::Page); + if let Some(page) = self.pages.page_mut::() { + return page.update(message).map(Into::into); + } } #[cfg(feature = "page-networking")] @@ -725,7 +726,7 @@ impl cosmic::Application for SettingsApp { } } - Message::SetTheme(t) => return set_theme(t), + Message::SetTheme(t) => return cosmic::command::set_theme(t), Message::OpenContextDrawer(page, title) => { self.core.window.show_context = true; @@ -741,17 +742,22 @@ impl cosmic::Application for SettingsApp { Message::Error(error) => { tracing::error!(error, "error occurred"); } + Message::Surface(a) => { + return cosmic::task::message(cosmic::Action::Cosmic( + cosmic::app::Action::Surface(a), + )); + } } Task::none() } #[cfg(feature = "single-instance")] - fn dbus_activation(&mut self, msg: DbusActivationMessage) -> Task { + fn dbus_activation(&mut self, msg: cosmic::dbus_activation::Message) -> Task { match msg.msg { - cosmic::app::DbusActivationDetails::Activate - | cosmic::app::DbusActivationDetails::Open { .. } => None, - cosmic::app::DbusActivationDetails::ActivateAction { action, .. } => { + cosmic::dbus_activation::Details::Activate + | cosmic::dbus_activation::Details::Open { .. } => None, + cosmic::dbus_activation::Details::ActivateAction { action, .. } => { PageCommands::from_str(&action) .ok() .and_then(|action| self.subtask_to_page(&action)) diff --git a/cosmic-settings/src/pages/accessibility/magnifier.rs b/cosmic-settings/src/pages/accessibility/magnifier.rs index 427e625..c15ca68 100644 --- a/cosmic-settings/src/pages/accessibility/magnifier.rs +++ b/cosmic-settings/src/pages/accessibility/magnifier.rs @@ -3,6 +3,7 @@ use std::collections::HashSet; use cosmic::{ iced::{Element, Length}, iced_core::text::Wrapping, + surface, widget::{self, icon, settings, svg, text}, Apply, }; @@ -42,6 +43,7 @@ pub enum Message { SetIncrement(usize), SetSignin(bool), SetMovement(ZoomMovement), + Surface(surface::Action), } impl Default for Page { @@ -219,10 +221,17 @@ pub fn magnifier( ) .add(settings::item( &descriptions[increment], - widget::dropdown( + widget::dropdown::popup_dropdown( &page.increment_values, page.increment_idx, Message::SetIncrement, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::AccessibilityMagnifier(a), + ) + }, ), )) .add(settings::item( @@ -365,6 +374,9 @@ impl Page { )); } } + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } } cosmic::iced::Task::none() diff --git a/cosmic-settings/src/pages/desktop/dock/mod.rs b/cosmic-settings/src/pages/desktop/dock/mod.rs index a32f85e..bd73835 100644 --- a/cosmic-settings/src/pages/desktop/dock/mod.rs +++ b/cosmic-settings/src/pages/desktop/dock/mod.rs @@ -66,12 +66,17 @@ impl Page { Task::none() } - Message::Inner(inner) => self - .inner - .update(inner) - .map(Message::Inner) - .map(crate::pages::Message::Dock) - .map(crate::app::Message::PageMessage), + Message::Inner(inner) => { + if let inner::Message::Surface(a) = inner { + return cosmic::task::message(crate::app::Message::Surface(a)); + } else { + self.inner + .update(inner) + .map(Message::Inner) + .map(crate::pages::Message::Dock) + .map(crate::app::Message::PageMessage) + } + } } } } diff --git a/cosmic-settings/src/pages/desktop/panel/inner.rs b/cosmic-settings/src/pages/desktop/panel/inner.rs index a59f72b..e8e1956 100644 --- a/cosmic-settings/src/pages/desktop/panel/inner.rs +++ b/cosmic-settings/src/pages/desktop/panel/inner.rs @@ -2,7 +2,7 @@ use cosmic::{ cctk::sctk::reexports::client::{backend::ObjectId, protocol::wl_output::WlOutput, Proxy}, cosmic_config::{self, CosmicConfigEntry}, iced::{Alignment, Length}, - theme, + surface, theme, widget::{ button, container, dropdown, horizontal_space, icon, row, settings, slider, text, toggler, }, @@ -122,15 +122,22 @@ pub(crate) fn behavior_and_position< )) .add(settings::item( &descriptions[position], - dropdown( + dropdown::popup_dropdown( page.anchors.as_slice(), Some(panel_config.anchor as usize), Message::PanelAnchor, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Panel( + super::Message(a), + )) + }, ), )) .add(settings::item( &descriptions[display], - dropdown( + dropdown::popup_dropdown( page.outputs.as_slice(), match &panel_config.output { CosmicPanelOuput::All => Some(0), @@ -138,6 +145,13 @@ pub(crate) fn behavior_and_position< CosmicPanelOuput::Name(n) => page.outputs.iter().position(|o| o == n), }, Message::Output, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Panel( + super::Message(a), + )) + }, ), )) .apply(Element::from) @@ -181,7 +195,7 @@ pub(crate) fn style< )) .add(settings::item( &descriptions[appearance], - dropdown( + dropdown::popup_dropdown( inner.backgrounds.as_slice(), match panel_config.background { CosmicPanelBackground::ThemeDefault => Some(0), @@ -190,6 +204,13 @@ pub(crate) fn style< CosmicPanelBackground::Color(_) => None, }, Message::Appearance, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Panel( + super::Message(a), + )) + }, ), )) .add(settings::flex_item( @@ -423,6 +444,7 @@ pub enum Message { PanelConfig(CosmicPanelConfig), ResetPanel, FullReset, + Surface(surface::Action), } impl PageInner { @@ -570,6 +592,9 @@ impl PageInner { return Task::none(); } Message::ResetPanel | Message::FullReset => {} + Message::Surface(a) => { + unimplemented!() + } } if panel_config.anchor_gap || !panel_config.expand_to_edges { diff --git a/cosmic-settings/src/pages/desktop/panel/mod.rs b/cosmic-settings/src/pages/desktop/panel/mod.rs index ae0bffe..a56fc09 100644 --- a/cosmic-settings/src/pages/desktop/panel/mod.rs +++ b/cosmic-settings/src/pages/desktop/panel/mod.rs @@ -23,11 +23,15 @@ pub struct Message(pub inner::Message); impl Page { pub fn update(&mut self, message: Message) -> Task { - self.inner - .update(message.0) - .map(Message) - .map(crate::pages::Message::Panel) - .map(crate::app::Message::PageMessage) + if let inner::Message::Surface(a) = message.0 { + return cosmic::task::message(crate::app::Message::Surface(a)); + } else { + self.inner + .update(message.0) + .map(Message) + .map(crate::pages::Message::Panel) + .map(crate::app::Message::PageMessage) + } } } diff --git a/cosmic-settings/src/pages/desktop/wallpaper/mod.rs b/cosmic-settings/src/pages/desktop/wallpaper/mod.rs index e66d19d..f752512 100644 --- a/cosmic-settings/src/pages/desktop/wallpaper/mod.rs +++ b/cosmic-settings/src/pages/desktop/wallpaper/mod.rs @@ -16,13 +16,16 @@ use std::{ #[cfg(feature = "xdg-portal")] use cosmic::dialog::file_chooser; -use cosmic::iced::{Alignment, Color, Length}; use cosmic::iced_runtime::core::image::Handle as ImageHandle; use cosmic::widget::{ button, dropdown, list_column, row, segmented_button::{self, SingleSelectModel}, settings, tab_bar, text, toggler, }; +use cosmic::{ + iced::{window, Alignment, Color, Length}, + surface, +}; use cosmic::{ widget::{color_picker::ColorPickerUpdate, icon, ColorPickerModel}, Apply, Element, Task, @@ -106,6 +109,7 @@ pub enum Message { Slideshow(bool), /// State change from cosmic-bg UpdateState(cosmic_bg_config::state::State), + Surface(surface::Action), } impl From for crate::app::Message { @@ -990,6 +994,9 @@ impl Page { ))), ); } + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } } self.config_apply(); @@ -1236,8 +1243,14 @@ pub fn settings() -> Section { children.push(element.into()); } - let wallpaper_fit = - cosmic::widget::dropdown(&page.fit_options, Some(page.selected_fit), Message::Fit); + let wallpaper_fit = cosmic::widget::dropdown::popup_dropdown( + &page.fit_options, + Some(page.selected_fit), + Message::Fit, + window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::DesktopWallpaper(a)), + ); children.push({ let mut column = list_column() @@ -1258,14 +1271,26 @@ pub fn settings() -> Section { // The rotation frequency dropdown should only be shown when the slideshow is enabled. if slideshow_enabled { column - .add(settings::item( - &descriptions[change_label], - dropdown( + .add(settings::item(&descriptions[change_label], { + let dropdown = dropdown( &page.rotation_options, Some(page.selected_rotation), Message::RotationFrequency, - ), - )) + ); + #[cfg(feature = "wayland")] + let dropdown = { + dropdown.with_popup( + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::DesktopWallpaper(a), + ) + }, + ) + }; + dropdown + })) .into() } else { column.into() diff --git a/cosmic-settings/src/pages/desktop/window_management.rs b/cosmic-settings/src/pages/desktop/window_management.rs index 33c4baf..2089d3e 100644 --- a/cosmic-settings/src/pages/desktop/window_management.rs +++ b/cosmic-settings/src/pages/desktop/window_management.rs @@ -3,8 +3,9 @@ use cosmic::{ iced::Length, + surface, widget::{self, settings, toggler}, - Apply, Element, + Apply, Element, Task, }; use cosmic_config::{ConfigGet, ConfigSet}; @@ -26,6 +27,7 @@ pub enum Message { ShowMaximizeButton(bool), ShowMinimizeButton(bool), SetEdgeSnapThreshold(u32), + Surface(surface::Action), } pub struct Page { @@ -107,7 +109,7 @@ impl Default for Page { } impl Page { - pub fn update(&mut self, message: Message) { + pub fn update(&mut self, message: Message) -> cosmic::iced::Task { match message { Message::SuperKey(id) => { let action = match id { @@ -115,7 +117,7 @@ impl Page { 1 => Some(shortcuts::action::System::WorkspaceOverview), 2 => Some(shortcuts::action::System::AppLibrary), 3 => None, - _ => return, + _ => return cosmic::iced::Task::none(), }; self.super_key_active = Some(id); @@ -186,7 +188,11 @@ impl Page { error!(?err, "Failed to set config 'edge_snap_threshold'"); } } - } + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } + }; + cosmic::iced::Task::none() } } @@ -233,13 +239,20 @@ pub fn window_management() -> Section { settings::section() .title(§ion.title) - .add( - settings::item::builder(&descriptions[super_key]).control(widget::dropdown( + .add(settings::item::builder(&descriptions[super_key]).control( + widget::dropdown::popup_dropdown( &page.super_key_selections, page.super_key_active, Message::SuperKey, - )), - ) + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::WindowManagement(a), + ) + }, + ), + )) .add(settings::flex_item( &descriptions[edge_gravity], toggler(page.edge_snap_threshold != 0).on_toggle(|is_enabled| { @@ -310,7 +323,7 @@ pub fn focus_navigation() -> Section { }) .select_on_focus(true) .on_input(Message::SetFocusFollowsCursorDelay) - .on_submit(Message::SaveFocusFollowsCursorDelay(true)) + .on_submit(|_| Message::SaveFocusFollowsCursorDelay(true)) .width(Length::Fixed(80.0)), )) .add(settings::item( diff --git a/cosmic-settings/src/pages/display/mod.rs b/cosmic-settings/src/pages/display/mod.rs index 287bf5a..0c6dc62 100644 --- a/cosmic-settings/src/pages/display/mod.rs +++ b/cosmic-settings/src/pages/display/mod.rs @@ -11,7 +11,7 @@ use cosmic::iced_widget::scrollable::{Direction, RelativeOffset, Scrollbar}; use cosmic::widget::{ self, column, container, dropdown, list_column, segmented_button, tab_bar, text, toggler, }; -use cosmic::{Apply, Element, Task}; +use cosmic::{surface, Apply, Element, Task}; use cosmic_config::{ConfigGet, ConfigSet}; use cosmic_randr_shell::{ AdaptiveSyncAvailability, AdaptiveSyncState, List, Output, OutputKey, Transform, @@ -108,6 +108,7 @@ pub enum Message { randr: Arc>, }, SetXwaylandDescaling(bool), + Surface(surface::Action), } impl From for app::Message { @@ -626,6 +627,10 @@ impl Page { error!(?err, "Failed to set config 'descale_xwayland'"); } } + + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } } self.last_pan = 0.5; @@ -1226,18 +1231,28 @@ pub fn display_configuration() -> Section { let mut items = vec![ widget::settings::item( &descriptions[resolution], - dropdown( + dropdown::popup_dropdown( &page.cache.resolutions, page.cache.resolution_selected, Message::Resolution, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Displays(a)) + }, ), ), widget::settings::item( &descriptions[refresh_rate], - dropdown( + dropdown::popup_dropdown( &page.cache.refresh_rates, page.cache.refresh_rate_selected, Message::RefreshRate, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Displays(a)) + }, ), ), ]; @@ -1245,10 +1260,15 @@ pub fn display_configuration() -> Section { if let Some(vrr_selected) = page.cache.vrr_selected { items.push(widget::settings::item( &descriptions[vrr], - dropdown( + dropdown::popup_dropdown( &page.cache.vrr_modes, Some(vrr_selected), Message::VariableRefreshRate, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Displays(a)) + }, ), )); } @@ -1256,7 +1276,16 @@ pub fn display_configuration() -> Section { items.extend(vec![ widget::settings::item( &descriptions[scale], - dropdown(&DPI_SCALE_LABELS, page.cache.scale_selected, Message::Scale), + dropdown::popup_dropdown( + &DPI_SCALE_LABELS, + page.cache.scale_selected, + Message::Scale, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Displays(a)) + }, + ), ), widget::settings::item( &descriptions[additional_scale_options], @@ -1271,7 +1300,7 @@ pub fn display_configuration() -> Section { ), widget::settings::item( &descriptions[orientation], - dropdown( + dropdown::popup_dropdown( &page.cache.orientations, page.cache.orientation_selected, |id| { @@ -1282,6 +1311,11 @@ pub fn display_configuration() -> Section { _ => Transform::Rotate270, }) }, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage(crate::pages::Message::Displays(a)) + }, ), ), ]); diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs index f304680..ff0c850 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs @@ -516,7 +516,7 @@ fn context_drawer( }) .select_on_focus(true) .on_input(move |text| ShortcutMessage::InputBinding(bind_id, text)) - .on_submit(ShortcutMessage::SubmitBinding(bind_id)) + .on_submit(move |_| ShortcutMessage::SubmitBinding(bind_id)) .padding([0, space_xs]) .id(shortcut.id.clone()) .into(); diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs index d9b9e83..07b523a 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs @@ -231,13 +231,13 @@ impl Page { let name_input = widget::text_input("", &self.add_shortcut.name) .padding([6, 12]) .on_input(Message::NameInput) - .on_submit(Message::NameSubmit) + .on_submit(|_| Message::NameSubmit) .id(self.name_id.clone()); let task_input = widget::text_input("", &self.add_shortcut.task) .padding([6, 12]) .on_input(Message::TaskInput) - .on_submit(Message::EditCombination) + .on_submit(|_| Message::EditCombination) .id(self.task_id.clone()); let name_control = widget::column() @@ -267,7 +267,7 @@ impl Page { ) .padding([0, 12]) .on_input(move |input| Message::KeyInput(id, input)) - .on_submit(Message::AddKeybinding) + .on_submit(|_| Message::AddKeybinding) .id(widget_id.clone()) .apply(widget::container) .padding([8, 24]); diff --git a/cosmic-settings/src/pages/networking/vpn/mod.rs b/cosmic-settings/src/pages/networking/vpn/mod.rs index dc04812..3d173f9 100644 --- a/cosmic-settings/src/pages/networking/vpn/mod.rs +++ b/cosmic-settings/src/pages/networking/vpn/mod.rs @@ -250,7 +250,7 @@ impl page::Page for Page { *password_hidden, ) .on_input(|input| Message::PasswordUpdate(SecureString::from(input))) - .on_submit(Message::ConnectWithPassword); + .on_submit(|_| Message::ConnectWithPassword); let controls = widget::column::with_capacity(2) .spacing(12) diff --git a/cosmic-settings/src/pages/networking/wifi.rs b/cosmic-settings/src/pages/networking/wifi.rs index b4020ee..dd3347c 100644 --- a/cosmic-settings/src/pages/networking/wifi.rs +++ b/cosmic-settings/src/pages/networking/wifi.rs @@ -145,7 +145,7 @@ impl page::Page for Page { *password_hidden, ) .on_input(|input| Message::PasswordUpdate(SecureString::from(input))) - .on_submit(Message::ConnectWithPassword); + .on_submit(|_| Message::ConnectWithPassword); let primary_action = widget::button::suggested(fl!("connect")) .on_press(Message::ConnectWithPassword); diff --git a/cosmic-settings/src/pages/power/mod.rs b/cosmic-settings/src/pages/power/mod.rs index dc515e8..e5e8ef2 100644 --- a/cosmic-settings/src/pages/power/mod.rs +++ b/cosmic-settings/src/pages/power/mod.rs @@ -7,8 +7,8 @@ use chrono::TimeDelta; use cosmic::iced::{Alignment, Length}; use cosmic::iced_widget::{column, row}; use cosmic::widget::{self, radio, settings, text}; -use cosmic::Apply; use cosmic::Task; +use cosmic::{surface, Apply}; use cosmic_config::{Config, CosmicConfigEntry}; use cosmic_idle_config::CosmicIdleConfig; use cosmic_settings_page::{self as page, section, Section}; @@ -193,10 +193,11 @@ pub enum Message { ScreenOffTimeChange(Option), SuspendOnAcTimeChange(Option), SuspendOnBatteryTimeChange(Option), + Surface(surface::Action), } impl Page { - pub fn update(&mut self, message: Message) { + pub fn update(&mut self, message: Message) -> Task { let runtime = tokio::runtime::Runtime::new().unwrap(); let backend = runtime.block_on(backend::get_backend()); @@ -241,7 +242,11 @@ impl Page { Message::DeviceConnect(connected_device) => { self.connected_devices.push(connected_device) } + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } }; + Task::none() } } @@ -417,7 +422,14 @@ fn power_saving_row<'a>( settings::item( label, - widget::dropdown(labels, selected, move |i| on_select(times.get(i).copied())), + widget::dropdown::popup_dropdown( + labels, + selected, + move |i| on_select(times.get(i).copied()), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::Power(a)), + ), ) .into() } diff --git a/cosmic-settings/src/pages/sound.rs b/cosmic-settings/src/pages/sound.rs index 5b41a3b..83f92d6 100644 --- a/cosmic-settings/src/pages/sound.rs +++ b/cosmic-settings/src/pages/sound.rs @@ -4,7 +4,8 @@ use std::{collections::BTreeMap, time::Duration}; use cosmic::{ - iced::{Alignment, Length}, + iced::{window, Alignment, Length}, + surface, widget::{self, settings}, Element, Task, }; @@ -48,6 +49,8 @@ pub enum Message { SourceVolumeApply(NodeId), /// Toggle the mute status of the input output. SourceMuteToggle, + /// Surface Action + Surface(surface::Action), } #[derive(Debug)] @@ -315,7 +318,6 @@ impl Page { return command; } } - Message::Pulse(pulse::Event::SourceVolume(volume)) => { if self.sink_volume_debounce { return Task::none(); @@ -324,7 +326,6 @@ impl Page { self.source_volume = volume; self.source_volume_text = volume.to_string(); } - Message::SinkVolumeChanged(volume) => { self.sink_volume = volume; self.sink_volume_text = volume.to_string(); @@ -345,7 +346,6 @@ impl Page { return command; } } - Message::Pulse(pulse::Event::SinkVolume(volume)) => { if self.sink_volume_debounce { return Task::none(); @@ -354,27 +354,22 @@ impl Page { self.sink_volume = volume; self.sink_volume_text = volume.to_string(); } - Message::Pulse(pulse::Event::DefaultSink(sink)) => { if !self.changing_sink_profile { self.set_default_sink(sink); } } - Message::Pulse(pulse::Event::DefaultSource(source)) => { if !self.changing_source_profile { self.set_default_source(source); } } - Message::Pulse(pulse::Event::SinkMute(mute)) => { self.sink_mute = mute; } - Message::Pulse(pulse::Event::SourceMute(mute)) => { self.source_mute = mute; } - Message::Pulse(pulse::Event::CardInfo(card)) => { let device_id = match card.variant { pulse::DeviceVariant::Alsa { alsa_card, .. } => DeviceId::Alsa(alsa_card), @@ -386,7 +381,6 @@ impl Page { self.active_profiles .insert(device_id, card.active_profile.map(|p| p.name)); } - Message::Pipewire(pipewire::DeviceEvent::Add(device)) => { let device_id = match device.variant { pipewire::DeviceVariant::Alsa { alsa_card, .. } => DeviceId::Alsa(alsa_card), @@ -439,7 +433,6 @@ impl Page { card.devices .sort_unstable_by(|_, av, _, bv| av.description.cmp(&bv.description)); } - Message::Pipewire(pipewire::DeviceEvent::Remove(node_id)) => { let mut remove = None; for (card_id, card) in &mut self.devices { @@ -473,7 +466,6 @@ impl Page { } } } - Message::SinkChanged(pos) => { if let Some(node_id) = self.sink_ids.get(pos) { for card in self.devices.values() { @@ -488,7 +480,6 @@ impl Page { } } } - Message::SourceChanged(pos) => { if let Some(node_id) = self.source_ids.get(pos) { for card in self.devices.values() { @@ -503,31 +494,26 @@ impl Page { } } } - Message::SinkVolumeApply(node_id) => { self.sink_volume_debounce = false; wpctl_set_volume(node_id, self.sink_volume); } - Message::SourceVolumeApply(node_id) => { self.source_volume_debounce = false; wpctl_set_volume(node_id, self.source_volume); } - Message::SinkMuteToggle => { self.sink_mute = !self.sink_mute; if let Some(&node_id) = self.sink_ids.get(self.active_sink.unwrap_or(0)) { wpctl_set_mute(node_id, self.sink_mute); } } - Message::SourceMuteToggle => { self.source_mute = !self.source_mute; if let Some(&node_id) = self.source_ids.get(self.active_source.unwrap_or(0)) { wpctl_set_mute(node_id, self.source_mute); } } - Message::SinkProfileChanged(profile) => { self.active_sink_profile = Some(profile); @@ -548,7 +534,6 @@ impl Page { } } } - Message::SinkProfileSelect(device_id) => { self.changing_sink_profile = false; let sink_pos = self.active_sink.unwrap_or(0); @@ -560,7 +545,6 @@ impl Page { } } } - Message::SourceProfileChanged(profile) => { self.active_source_profile = Some(profile); if let Some(profile) = self.source_profile_names.get(profile).cloned() { @@ -580,7 +564,6 @@ impl Page { } } } - Message::SourceProfileSelect(device_id) => { self.changing_source_profile = false; let source_pos = self.active_source.unwrap_or(0); @@ -592,6 +575,9 @@ impl Page { } } } + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } } Task::none() } @@ -629,11 +615,13 @@ fn input() -> Section { widget::slider(0..=150, page.source_volume, Message::SourceVolumeChanged) .breakpoints(&[100]), ); - - let devices = widget::dropdown( + let mut devices = widget::dropdown::popup_dropdown( &page.sources, Some(page.active_source.unwrap_or(0)), Message::SourceChanged, + window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::Sound(a)), ); let mut controls = settings::section() @@ -645,10 +633,13 @@ fn input() -> Section { .add(settings::item(&*section.descriptions[device], devices)); if !page.source_profiles.is_empty() { - let dropdown = widget::dropdown( + let mut dropdown = widget::dropdown::popup_dropdown( &page.source_profiles, page.active_source_profile, Message::SourceProfileChanged, + window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::Sound(a)), ); controls = controls.add(settings::item(&*section.descriptions[profile], dropdown)); @@ -692,10 +683,13 @@ fn output() -> Section { .breakpoints(&[100]), ); - let devices = widget::dropdown( + let devices = widget::dropdown::popup_dropdown( &page.sinks, Some(page.active_sink.unwrap_or(0)), Message::SinkChanged, + window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::Sound(a)), ); let mut controls = settings::section() @@ -707,10 +701,13 @@ fn output() -> Section { .add(settings::item(&*section.descriptions[device], devices)); if !page.sink_profiles.is_empty() { - let dropdown = widget::dropdown( + let dropdown = widget::dropdown::popup_dropdown( &page.sink_profiles, page.active_sink_profile, Message::SinkProfileChanged, + window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::Sound(a)), ); controls = controls.add(settings::item(&*section.descriptions[profile], dropdown)); diff --git a/cosmic-settings/src/pages/system/about.rs b/cosmic-settings/src/pages/system/about.rs index d48e2d3..f7a2a0c 100644 --- a/cosmic-settings/src/pages/system/about.rs +++ b/cosmic-settings/src/pages/system/about.rs @@ -182,7 +182,7 @@ fn device() -> Section { ) .width(250) .on_input(Message::HostnameInput) - .on_submit(Message::HostnameSubmit); + .on_submit(|_| Message::HostnameSubmit); let device_name = settings::item::builder(&*desc[device]) .description(&*desc[device_desc]) diff --git a/cosmic-settings/src/pages/system/default_apps.rs b/cosmic-settings/src/pages/system/default_apps.rs index f73ac55..5fec682 100644 --- a/cosmic-settings/src/pages/system/default_apps.rs +++ b/cosmic-settings/src/pages/system/default_apps.rs @@ -9,6 +9,7 @@ use std::{ }; use cosmic::{ + surface, widget::{self, dropdown, icon, settings}, Apply, Element, Task, }; @@ -50,6 +51,7 @@ pub enum Category { pub enum Message { SetDefault(Category, usize), Update(CachedMimeApps), + Surface(surface::Action), } impl From for crate::app::Message { @@ -267,10 +269,12 @@ impl Page { _ = std::process::Command::new("update-desktop-database").status(); } } - Message::Update(mime_apps) => { self.mime_apps = Some(mime_apps); } + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } } Task::none() @@ -289,9 +293,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_WEB_BROWSER]; settings::flex_item( fl!("default-apps", "web-browser"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::WebBrowser, id) - }) + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::WebBrowser, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), + ) .icons(&meta.icons), ) .min_item_width(300.0) @@ -300,9 +309,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_FILE_MANAGER]; settings::flex_item( fl!("default-apps", "file-manager"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::FileManager, id) - }) + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::FileManager, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), + ) .icons(&meta.icons), ) }) @@ -310,9 +324,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_MAIL]; settings::flex_item( fl!("default-apps", "mail-client"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::Mail, id) - }) + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::Mail, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), + ) .icons(&meta.icons), ) }) @@ -320,9 +339,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_MUSIC]; settings::flex_item( fl!("default-apps", "music"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::Audio, id) - }) + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::Audio, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), + ) .icons(&meta.icons), ) }) @@ -330,9 +354,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_VIDEO]; settings::flex_item( fl!("default-apps", "video"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::Video, id) - }) + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::Video, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), + ) .icons(&meta.icons), ) }) @@ -340,9 +369,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_PHOTO]; settings::flex_item( fl!("default-apps", "photos"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::Image, id) - }) + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::Image, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), + ) .icons(&meta.icons), ) }) @@ -350,9 +384,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_CALENDAR]; settings::flex_item( fl!("default-apps", "calendar"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::Calendar, id) - }) + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::Calendar, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), + ) .icons(&meta.icons), ) }) @@ -360,9 +399,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_TERMINAL]; settings::flex_item( fl!("default-apps", "terminal"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::Terminal, id) - }) + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::Terminal, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), + ) .icons(&meta.icons), ) }) @@ -370,9 +414,14 @@ fn apps() -> Section { let meta = &mime_apps.apps[DROPDOWN_TEXT_EDITOR]; settings::flex_item( fl!("default-apps", "text-editor"), - dropdown(&meta.apps, meta.selected, |id| { - Message::SetDefault(Category::TextEditor, id) - }) + dropdown::popup_dropdown( + &meta.apps, + meta.selected, + |id| Message::SetDefault(Category::TextEditor, id), + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), + ) .icons(&meta.icons), ) }) diff --git a/cosmic-settings/src/pages/system/users/mod.rs b/cosmic-settings/src/pages/system/users/mod.rs index 89f86e0..b670447 100644 --- a/cosmic-settings/src/pages/system/users/mod.rs +++ b/cosmic-settings/src/pages/system/users/mod.rs @@ -600,14 +600,14 @@ fn user_list() -> Section { Message::ToggleEdit(idx, EditorField::Username) }) .on_input(move |name| Message::Edit(idx, EditorField::Username, name)) - .on_submit(Message::ApplyEdit(idx, EditorField::Username)); + .on_submit(move |_| Message::ApplyEdit(idx, EditorField::Username)); let password = widget::editable_input("", &user.password, user.password_edit, move |_| { Message::ToggleEdit(idx, EditorField::Password) }) .on_input(move |pass| Message::Edit(idx, EditorField::Password, pass)) - .on_submit(Message::ApplyEdit(idx, EditorField::Password)) + .on_submit(move |_| Message::ApplyEdit(idx, EditorField::Password)) .password(); let fullname = widget::editable_input( @@ -617,7 +617,7 @@ fn user_list() -> Section { move |_| Message::ToggleEdit(idx, EditorField::FullName), ) .on_input(move |name| Message::Edit(idx, EditorField::FullName, name)) - .on_submit(Message::ApplyEdit(idx, EditorField::FullName)); + .on_submit(move |_| Message::ApplyEdit(idx, EditorField::FullName)); let fullname_text = text::body(&user.full_name); diff --git a/cosmic-settings/src/pages/time/date.rs b/cosmic-settings/src/pages/time/date.rs index 9547883..e951076 100644 --- a/cosmic-settings/src/pages/time/date.rs +++ b/cosmic-settings/src/pages/time/date.rs @@ -7,6 +7,7 @@ use chrono::{Datelike, Timelike}; use cosmic::{ cosmic_config::{self, ConfigGet, ConfigSet}, iced_core::text::Wrapping, + surface, widget::{self, dropdown, settings}, Apply, Element, Task, }; @@ -276,6 +277,10 @@ impl Page { self.update_local_time(); } + Message::Surface(a) => { + return cosmic::task::message(crate::app::Message::Surface(a)); + } + Message::None => (), } @@ -365,6 +370,7 @@ pub enum Message { TimezoneContext, TimezoneSearch(String), UpdateTime, + Surface(surface::Action), } impl page::AutoBind for Page {} @@ -416,23 +422,32 @@ fn format() -> Section { ) // First day of week .add( - settings::item::builder(§ion.descriptions[first]).control(dropdown( - &*WEEKDAYS, - match page.first_day_of_week { - 4 => Some(0), // friday - 5 => Some(1), // saturday - 0 => Some(3), // monday - _ => Some(2), // sunday - }, - |v| { - match v { - 0 => Message::FirstDayOfWeek(4), // friday - 1 => Message::FirstDayOfWeek(5), // saturday - 3 => Message::FirstDayOfWeek(0), // monday - _ => Message::FirstDayOfWeek(6), // sunday - } - }, - )), + settings::item::builder(§ion.descriptions[first]).control( + dropdown::popup_dropdown( + &*WEEKDAYS, + match page.first_day_of_week { + 4 => Some(0), // friday + 5 => Some(1), // saturday + 0 => Some(3), // monday + _ => Some(2), // sunday + }, + |v| { + match v { + 0 => Message::FirstDayOfWeek(4), // friday + 1 => Message::FirstDayOfWeek(5), // saturday + 3 => Message::FirstDayOfWeek(0), // monday + _ => Message::FirstDayOfWeek(6), // sunday + } + }, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |a| { + crate::app::Message::PageMessage( + crate::pages::Message::DateAndTime(a), + ) + }, + ), + ), ) // Date on top panel toggle .add(