improv(applications): convert message types to reduce code gen

This commit is contained in:
Michael Aaron Murphy 2025-06-19 16:12:43 +02:00
parent e2049df678
commit 3fa3f1f3d7
No known key found for this signature in database
GPG key ID: B2732D4240C9212C
4 changed files with 53 additions and 41 deletions

View file

@ -36,6 +36,12 @@ pub enum Message {
Surface(surface::Action),
}
impl From<Message> for crate::pages::Message {
fn from(message: Message) -> Self {
crate::pages::Message::LegacyApplications(message)
}
}
pub struct Page {
refresh_pending: Arc<AtomicBool>,
randr_handle: Option<(oneshot::Sender<()>, cosmic::iced::task::Handle)>,
@ -272,13 +278,13 @@ pub fn legacy_application_global_shortcuts() -> Section<crate::pages::Message> {
let title = widget::text::body(&section.title).font(cosmic::font::bold());
let description = widget::text::body(&section.descriptions[desc]);
let content = widget::settings::section()
let content = widget::settings::section::<'_, crate::pages::Message>()
.add(widget::settings::item_row(vec![
widget::radio(
text::body(&section.descriptions[none]),
EavesdroppingKeyboardMode::None,
Some(page.comp_config_xwayland_eavesdropping.keyboard),
Message::SetXwaylandKeyboardMode,
|t| Message::SetXwaylandKeyboardMode(t).into(),
)
.width(Length::Fill)
.into(),
@ -288,7 +294,7 @@ pub fn legacy_application_global_shortcuts() -> Section<crate::pages::Message> {
text::body(&section.descriptions[modifiers]),
EavesdroppingKeyboardMode::Modifiers,
Some(page.comp_config_xwayland_eavesdropping.keyboard),
Message::SetXwaylandKeyboardMode,
|t| Message::SetXwaylandKeyboardMode(t).into(),
)
.width(Length::Fill)
.into(),
@ -298,7 +304,7 @@ pub fn legacy_application_global_shortcuts() -> Section<crate::pages::Message> {
text::body(&section.descriptions[combination]),
EavesdroppingKeyboardMode::Combinations,
Some(page.comp_config_xwayland_eavesdropping.keyboard),
Message::SetXwaylandKeyboardMode,
|t| Message::SetXwaylandKeyboardMode(t).into(),
)
.width(Length::Fill)
.into(),
@ -308,7 +314,7 @@ pub fn legacy_application_global_shortcuts() -> Section<crate::pages::Message> {
text::body(&section.descriptions[all]),
EavesdroppingKeyboardMode::All,
Some(page.comp_config_xwayland_eavesdropping.keyboard),
Message::SetXwaylandKeyboardMode,
|t| Message::SetXwaylandKeyboardMode(t).into(),
)
.width(Length::Fill)
.into(),
@ -316,10 +322,8 @@ pub fn legacy_application_global_shortcuts() -> Section<crate::pages::Message> {
.add(widget::settings::item(
&section.descriptions[mouse],
widget::toggler(page.comp_config_xwayland_eavesdropping.pointer)
.on_toggle(Message::SetXwaylandMouseButtonMode),
))
.apply(Element::from)
.map(crate::pages::Message::LegacyApplications);
.on_toggle(|t| Message::SetXwaylandMouseButtonMode(t).into()),
));
widget::column::with_capacity(3)
.push(title)

View file

@ -114,16 +114,14 @@ impl page::Page<crate::pages::Message> for Page {
match &self.context {
Some(Context::AddApplication(directory_type)) => {
let search = widget::search_input(fl!("type-to-search"), &self.application_search)
.on_input(Message::ApplicationSearch)
.on_clear(Message::ApplicationSearch(String::new()))
.apply(Element::from)
.map(crate::pages::Message::from);
.on_input(|i| Message::ApplicationSearch(i).into())
.on_clear(Message::ApplicationSearch(String::new()).into())
.apply(Element::from);
Some(
cosmic::app::context_drawer(
self.add_application_context_view(directory_type.clone())
.map(crate::pages::Message::from),
crate::pages::Message::CloseContextDrawer,
self.add_application_context_view(directory_type.clone()),
crate::pages::Message::CloseContextDrawer.into(),
)
.title(fl!("startup-apps", "search-for-application"))
.header(search),
@ -158,7 +156,7 @@ impl page::Page<crate::pages::Message> for Page {
task
}
fn dialog(&self) -> Option<Element<'_, crate::pages::Message>> {
fn dialog(&self) -> Option<crate::pages::Element<'_>> {
if let Some(app_to_remove) = &self.app_to_remove {
if let Some(cached_startup_apps) = &self.cached_startup_apps {
if let Some(target_directory_type) = &self.target_directory_type {
@ -171,19 +169,21 @@ impl page::Page<crate::pages::Message> for Page {
))
.icon(icon::from_name("dialog-warning").size(64))
.body(fl!("startup-apps", "remove-dialog-description"))
.primary_action(button::suggested(fl!("remove")).on_press(
Message::RemoveStartupApplication(
target_directory_type.clone(),
app_to_remove.clone(),
true,
.primary_action(
button::suggested(fl!("remove")).on_press(
Message::RemoveStartupApplication(
target_directory_type.clone(),
app_to_remove.clone(),
true,
)
.into(),
),
))
)
.secondary_action(
button::standard(fl!("cancel"))
.on_press(Message::CancelRemoveStartupApplication),
.on_press(Message::CancelRemoveStartupApplication.into()),
)
.apply(Element::from)
.map(crate::pages::Message::StartupApps),
.apply(Element::from),
);
}
}
@ -322,7 +322,7 @@ impl Page {
pub fn add_application_context_view(
&self,
directory_type: DirectoryType,
) -> Element<'_, crate::pages::Message> {
) -> crate::pages::Element<'_> {
let cosmic::cosmic_theme::Spacing { space_xs, .. } = cosmic::theme::spacing();
let mut list = widget::list_column();
@ -350,9 +350,15 @@ impl Page {
} else {
row = row.push(text(&app.appid).width(Length::Fill));
}
row = row.push(widget::button::text(fl!("add")).on_press(
Message::AddStartupApplication(directory_type.clone(), app.clone()),
));
row = row.push(
widget::button::text(fl!("add")).on_press(
Message::AddStartupApplication(
directory_type.clone(),
app.clone(),
)
.into(),
),
);
list = list.add(row)
}
@ -361,8 +367,7 @@ impl Page {
}
}
list.apply(Element::from)
.map(crate::pages::Message::StartupApps)
list.into()
}
}
@ -409,11 +414,14 @@ fn apps() -> Section<crate::pages::Message> {
row = row.push(
button::icon(icon::from_name("edit-delete-symbolic"))
.extra_small()
.on_press(Message::RemoveStartupApplication(
directory_type.clone(),
app.clone(),
false,
)),
.on_press(
Message::RemoveStartupApplication(
directory_type.clone(),
app.clone(),
false,
)
.into(),
),
);
section = section.add(row)
@ -421,7 +429,7 @@ fn apps() -> Section<crate::pages::Message> {
}
let add_startup_app = widget::button::standard(fl!("startup-apps", "add"))
.on_press(Message::ShowApplicationSidebar(directory_type.clone()));
.on_press(Message::ShowApplicationSidebar(directory_type.clone()).into());
view = view.push(section).push(widget::container(
widget::container(add_startup_app)
@ -431,8 +439,7 @@ fn apps() -> Section<crate::pages::Message> {
}
}
view.apply(Element::from)
.map(crate::pages::Message::StartupApps)
view.into()
})
}

View file

@ -14,7 +14,6 @@ use slotmap::SlotMap;
use std::collections::{HashMap, HashSet};
use std::sync::Arc;
use std::time::Duration;
use tokio::runtime::Handle;
use zbus::zvariant::OwnedObjectPath;
enum Dialog {

View file

@ -22,6 +22,8 @@ pub mod sound;
pub mod system;
pub mod time;
pub type Element<'a> = cosmic::Element<'a, Message>;
#[derive(Clone, Debug)]
pub enum Message {
// Page-specific messages