feat(date): add context drawer for date & time applet settings (#2190)

This commit is contained in:
blakewilliams1 2026-09-22 11:29:30 -07:00 • committed by GitHub
parent 7aa7807c35
commit 9a6aff11d1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 74 additions and 14 deletions

View file

@ -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<DateTime<Gregorian>>,
timezone: Option<usize>,
timezone_list: Vec<String>,
@ -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<crate::pages::Message> 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<crate::app::Message>),
@ -394,9 +454,8 @@ fn date() -> Section<crate::pages::Message> {
fn format() -> Section<crate::pages::Message> {
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<crate::pages::Message> {
settings::item::builder(&section.descriptions[military])
.toggler(page.military_time, Message::MilitaryTime),
)
// Show seconds in time format
.add(
settings::item::builder(&section.descriptions[show_seconds])
.toggler(page.show_seconds, Message::ShowSeconds),
)
// First day of week
.add(
settings::item::builder(&section.descriptions[first]).control(
@ -444,11 +498,13 @@ fn format() -> Section<crate::pages::Message> {
),
),
)
// 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(&section.descriptions[show_date])
.toggler(page.show_date_in_top_panel, Message::ShowDate),
)
crate::widget::go_next_with_item(
&section.descriptions[date_time_applet_settings_label],
"",
Message::DateAndTimeContext,
))
.apply(cosmic::Element::from)
.map(crate::pages::Message::DateAndTime)
})

View file

@ -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