From be269bcabfd5357567ea94126478fc6d4cf79238 Mon Sep 17 00:00:00 2001 From: Josh Megnauth Date: Fri, 31 Oct 2025 23:04:30 -0400 Subject: [PATCH] Setting to format date and time with strftime Depends on: pop-os/cosmic-applets#1129 --- cosmic-settings/src/pages/time/date.rs | 41 ++++++++++++++++++++++++-- i18n/en/cosmic_settings.ftl | 1 + 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/cosmic-settings/src/pages/time/date.rs b/cosmic-settings/src/pages/time/date.rs index 2daab6ea..83d5b36c 100644 --- a/cosmic-settings/src/pages/time/date.rs +++ b/cosmic-settings/src/pages/time/date.rs @@ -45,6 +45,7 @@ pub struct Page { show_seconds: bool, ntp_enabled: bool, show_date_in_top_panel: bool, + format_strftime: String, timezone_context: bool, local_time: Option>, timezone: Option, @@ -102,6 +103,15 @@ impl Default for Page { true }); + let format_strftime = cosmic_applet_config + .get("format_strftime") + .inspect_err(|err| { + if err.is_err() { + error!(?err, "Failed to read config 'format_strftime'"); + } + }) + .unwrap_or_default(); + Self { entity: page::Entity::null(), cosmic_applet_config, @@ -112,6 +122,7 @@ impl Default for Page { show_seconds, ntp_enabled: false, show_date_in_top_panel, + format_strftime, timezone: None, timezone_context: false, timezone_list: Vec::new(), @@ -242,6 +253,17 @@ impl Page { } } + Message::Strftime(format) => { + self.format_strftime = format; + + if let Err(err) = self + .cosmic_applet_config + .set("format_strftime", &self.format_strftime) + { + error!(?err, "Failed to set config 'format_strftime'"); + } + } + Message::TimezoneSearch(text) => { self.timezone_search = text; } @@ -382,9 +404,14 @@ impl Page { fn update_local_time(&mut self) { self.local_time = Some(update_local_time()); - self.formatted_date = match self.local_time { - Some(ref time) => format_date(time, self.military_time, self.show_seconds), - None => fl!("unknown"), + self.formatted_date = if !self.format_strftime.is_empty() { + chrono::Local::now() + .format(&self.format_strftime) + .to_string() + } else if let Some(time) = self.local_time.as_ref() { + format_date(time, self.military_time, self.show_seconds) + } else { + fl!("unknown") } } } @@ -398,6 +425,7 @@ pub enum Message { FirstDayOfWeek(usize), Refresh(Info), ShowDate(bool), + Strftime(String), Timezone(usize), TimezoneContext, TimezoneSearch(String), @@ -435,6 +463,7 @@ fn format() -> Section { let show_seconds = descriptions.insert(fl!("time-format", "show-seconds")); let first = descriptions.insert(fl!("time-format", "first")); let show_date = descriptions.insert(fl!("time-format", "show-date")); + let format_strftime = descriptions.insert(fl!("time-format", "format-strftime")); Section::default() .title(fl!("time-format")) @@ -486,6 +515,12 @@ fn format() -> Section { settings::item::builder(§ion.descriptions[show_date]) .toggler(page.show_date_in_top_panel, Message::ShowDate), ) + // Format with strftime + .add( + settings::item::builder(§ion.descriptions[format_strftime]).control( + widget::text_input("", &page.format_strftime).on_input(Message::Strftime), + ), + ) .apply(cosmic::Element::from) .map(crate::pages::Message::DateAndTime) }) diff --git a/i18n/en/cosmic_settings.ftl b/i18n/en/cosmic_settings.ftl index eaa153c0..2489a63d 100644 --- a/i18n/en/cosmic_settings.ftl +++ b/i18n/en/cosmic_settings.ftl @@ -783,6 +783,7 @@ time-format = Date & time format .show-seconds = Show seconds .first = First day of week .show-date = Show date in the time applet + .format-strftime = Format date and time with strftime .friday = Friday .saturday = Saturday .sunday = Sunday