From 9a6aff11d184788cfa7d7e9b921cea93e084dca3 Mon Sep 17 00:00:00 2001 From: blakewilliams1 Date: Tue, 22 Sep 2026 11:29:30 -0700 Subject: [PATCH] feat(date): add context drawer for date & time applet settings (#2190) --- cosmic-settings/src/pages/time/date.rs | 80 ++++++++++++++++++++++---- i18n/en/cosmic_settings.ftl | 8 ++- 2 files changed, 74 insertions(+), 14 deletions(-) diff --git a/cosmic-settings/src/pages/time/date.rs b/cosmic-settings/src/pages/time/date.rs index f4645be..611b555 100644 --- a/cosmic-settings/src/pages/time/date.rs +++ b/cosmic-settings/src/pages/time/date.rs @@ -21,7 +21,9 @@ use tracing::error; crate::cache_dynamic_lazy! { static WEEKDAYS: [String; 4] = [fl!("time-format", "friday"), fl!("time-format", "saturday"), fl!("time-format", "sunday"), fl!("time-format", "monday")]; -} + static SHOW_WEEKDAY: String = fl!("time-format", "show-weekday"); + static SHOW_SECONDS: String = fl!("time-format", "show-seconds"); + static SHOW_DATE: String = fl!("time-format", "date");} #[derive(Debug, Clone)] pub struct Info { @@ -36,9 +38,11 @@ pub struct Page { first_day_of_week: usize, military_time: bool, show_seconds: bool, + show_weekday: bool, ntp_enabled: bool, show_date_in_top_panel: bool, timezone_context: bool, + date_time_applet_context: bool, local_time: Option>, timezone: Option, timezone_list: Vec, @@ -73,6 +77,16 @@ impl Default for Page { false }); + let show_weekday = cosmic_applet_config + .get("show_weekday") + .unwrap_or_else(|err| { + if err.is_err() { + error!(?err, "Failed to read config 'show_weekday'"); + } + + false + }); + let first_day_of_week = cosmic_applet_config .get("first_day_of_week") .unwrap_or_else(|err| { @@ -103,10 +117,12 @@ impl Default for Page { local_time: None, military_time, show_seconds, + show_weekday, ntp_enabled: false, show_date_in_top_panel, timezone: None, timezone_context: false, + date_time_applet_context: false, timezone_list: Vec::new(), timezone_search: String::new(), } @@ -183,6 +199,15 @@ impl page::Page for Page { .title(fl!("time-zone")) .header(search), ); + } else if self.date_time_applet_context { + return Some( + cosmic::app::context_drawer( + self.date_time_applet_view() + .map(crate::pages::Message::from), + crate::pages::Message::CloseContextDrawer, + ) + .title(fl!("date-time-applet-settings-title")), + ); } None @@ -216,6 +241,15 @@ impl Page { } } + Message::ShowWeekday(enable) => { + self.show_weekday = enable; + self.update_local_time(); + + if let Err(err) = self.cosmic_applet_config.set("show_weekday", enable) { + error!(?err, "Failed to set config 'show_weekday'"); + } + } + Message::FirstDayOfWeek(weekday) => { self.first_day_of_week = weekday; @@ -224,6 +258,11 @@ impl Page { } } + Message::DateAndTimeContext => { + self.date_time_applet_context = true; + return cosmic::task::message(crate::app::Message::OpenContextDrawer(self.entity)); + } + Message::ShowDate(enable) => { self.show_date_in_top_panel = enable; @@ -342,6 +381,25 @@ impl Page { .map(crate::pages::Message::DateAndTime) } + fn date_time_applet_view(&self) -> Element<'_, crate::pages::Message> { + let mut list = widget::list_column(); + + list = list.add( + settings::item::builder(&*SHOW_DATE) + .toggler(self.show_date_in_top_panel, Message::ShowDate) + ) + .add( + settings::item::builder(&*SHOW_WEEKDAY) + .toggler(self.show_weekday, Message::ShowWeekday), + ) + .add( + settings::item::builder(&*SHOW_SECONDS) + .toggler(self.show_seconds, Message::ShowSeconds)); + + list.apply(Element::from) + .map(crate::pages::Message::DateAndTime) + } + fn update_local_time(&mut self) { self.local_time = Some(update_local_time()); @@ -357,12 +415,14 @@ pub enum Message { Error(String), MilitaryTime(bool), ShowSeconds(bool), + ShowWeekday(bool), None, FirstDayOfWeek(usize), Refresh(Info), ShowDate(bool), Timezone(usize), TimezoneContext, + DateAndTimeContext, TimezoneSearch(String), UpdateTime, Surface(surface::Action), @@ -394,9 +454,8 @@ fn date() -> Section { fn format() -> Section { crate::slab!(descriptions { military = fl!("time-format", "twenty-four"); - show_seconds = fl!("time-format", "show-seconds"); first = fl!("time-format", "first"); - show_date = fl!("time-format", "show-date"); + date_time_applet_settings_label = fl!("date-time-applet-settings-label"); }); Section::default() @@ -410,11 +469,6 @@ fn format() -> Section { settings::item::builder(§ion.descriptions[military]) .toggler(page.military_time, Message::MilitaryTime), ) - // Show seconds in time format - .add( - settings::item::builder(§ion.descriptions[show_seconds]) - .toggler(page.show_seconds, Message::ShowSeconds), - ) // First day of week .add( settings::item::builder(§ion.descriptions[first]).control( @@ -444,11 +498,13 @@ fn format() -> Section { ), ), ) - // Date on top panel toggle + // Show a Context Drawer which contains settings for how the Date and Time applet displays the date. .add( - settings::item::builder(§ion.descriptions[show_date]) - .toggler(page.show_date_in_top_panel, Message::ShowDate), - ) + crate::widget::go_next_with_item( + §ion.descriptions[date_time_applet_settings_label], + "", + Message::DateAndTimeContext, + )) .apply(cosmic::Element::from) .map(crate::pages::Message::DateAndTime) }) diff --git a/i18n/en/cosmic_settings.ftl b/i18n/en/cosmic_settings.ftl index 1a8c7ed..7318d9a 100644 --- a/i18n/en/cosmic_settings.ftl +++ b/i18n/en/cosmic_settings.ftl @@ -962,14 +962,18 @@ time-zone = Time zone time-format = Date & time format .twenty-four = 24-hour time - .show-seconds = Show seconds + .show-seconds = Seconds + .show-weekday = Day of week .first = First day of week - .show-date = Show date in the time applet + .date = Date .friday = Friday .saturday = Saturday .sunday = Sunday .monday = Monday +date-time-applet-settings-title = Date & time applet +date-time-applet-settings-label = Date & time applet settings + time-region = Region & language formatting = Formatting