fix(default-apps): Avoid creating dropdowns for empty categories

This commit is contained in:
Md istekhar 2026-01-30 04:31:11 +05:30 • committed by GitHub
parent c654b6764b
commit 18beed5712
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 203 additions and 100 deletions

View file

@ -285,143 +285,244 @@ fn apps() -> Section<crate::pages::Message> {
return widget::row().into(); return widget::row().into();
}; };
// Avoid creating popup_dropdown for empty app lists.
// Empty categories are rendered as non-interactive text to prevent Wayland crashes.
settings::section() settings::section()
.title(&section.title) .title(&section.title)
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_WEB_BROWSER]; let meta = &mime_apps.apps[DROPDOWN_WEB_BROWSER];
settings::flex_item( if meta.apps.is_empty() {
fl!("default-apps", "web-browser"), settings::flex_item(
dropdown::popup_dropdown( fl!("default-apps", "web-browser"),
&meta.apps, widget::text(fl!("default-apps", "not-installed")),
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(Cow::Borrowed(&meta.icons)), } else {
) settings::flex_item(
.min_item_width(300.0) fl!("default-apps", "web-browser"),
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(Cow::Borrowed(&meta.icons)),
)
.min_item_width(300.0)
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_FILE_MANAGER]; let meta = &mime_apps.apps[DROPDOWN_FILE_MANAGER];
settings::flex_item( if meta.apps.is_empty() {
fl!("default-apps", "file-manager"), settings::flex_item(
dropdown::popup_dropdown( fl!("default-apps", "file-manager"),
&meta.apps, widget::text(fl!("default-apps", "not-installed")),
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(Cow::Borrowed(&meta.icons)), } else {
) settings::flex_item(
fl!("default-apps", "file-manager"),
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(Cow::Borrowed(&meta.icons)),
)
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_MAIL]; let meta = &mime_apps.apps[DROPDOWN_MAIL];
settings::flex_item( if meta.apps.is_empty() {
fl!("default-apps", "mail-client"), settings::flex_item(
dropdown::popup_dropdown( fl!("default-apps", "mail-client"),
&meta.apps, widget::text(fl!("default-apps", "not-installed")),
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(Cow::Borrowed(&meta.icons)), } else {
) settings::flex_item(
fl!("default-apps", "mail-client"),
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(Cow::Borrowed(&meta.icons)),
)
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_MUSIC]; let meta = &mime_apps.apps[DROPDOWN_MUSIC];
settings::flex_item( if meta.apps.is_empty() {
fl!("default-apps", "music"), settings::flex_item(
dropdown::popup_dropdown( fl!("default-apps", "music"),
&meta.apps, widget::text(fl!("default-apps", "not-installed")),
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(Cow::Borrowed(&meta.icons)), } else {
) settings::flex_item(
fl!("default-apps", "music"),
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(Cow::Borrowed(&meta.icons)),
)
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_VIDEO]; let meta = &mime_apps.apps[DROPDOWN_VIDEO];
settings::flex_item( if meta.apps.is_empty() {
fl!("default-apps", "video"), settings::flex_item(
dropdown::popup_dropdown( fl!("default-apps", "video"),
&meta.apps, widget::text(fl!("default-apps", "not-installed")),
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(Cow::Borrowed(&meta.icons)), } else {
) settings::flex_item(
fl!("default-apps", "video"),
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(Cow::Borrowed(&meta.icons)),
)
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_PHOTO]; let meta = &mime_apps.apps[DROPDOWN_PHOTO];
settings::flex_item( if meta.apps.is_empty() {
fl!("default-apps", "photos"), settings::flex_item(
dropdown::popup_dropdown( fl!("default-apps", "photos"),
&meta.apps, widget::text(fl!("default-apps", "not-installed")),
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(Cow::Borrowed(&meta.icons)), } else {
) settings::flex_item(
fl!("default-apps", "photos"),
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(Cow::Borrowed(&meta.icons)),
)
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_CALENDAR]; let meta = &mime_apps.apps[DROPDOWN_CALENDAR];
settings::flex_item( if meta.apps.is_empty() {
fl!("default-apps", "calendar"), settings::flex_item(
dropdown::popup_dropdown( fl!("default-apps", "calendar"),
&meta.apps, widget::text(fl!("default-apps", "not-installed")),
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(Cow::Borrowed(&meta.icons)), } else {
) settings::flex_item(
fl!("default-apps", "calendar"),
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(Cow::Borrowed(&meta.icons)),
)
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_TERMINAL]; let meta = &mime_apps.apps[DROPDOWN_TERMINAL];
settings::flex_item( if meta.apps.is_empty() {
fl!("default-apps", "terminal"), settings::flex_item(
dropdown::popup_dropdown( fl!("default-apps", "terminal"),
&meta.apps, widget::text(fl!("default-apps", "not-installed")),
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(Cow::Borrowed(&meta.icons)), } else {
) settings::flex_item(
fl!("default-apps", "terminal"),
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(Cow::Borrowed(&meta.icons)),
)
}
}) })
.add({ .add({
let meta = &mime_apps.apps[DROPDOWN_TEXT_EDITOR]; let meta = &mime_apps.apps[DROPDOWN_TEXT_EDITOR];
settings::flex_item( if meta.apps.is_empty() {
fl!("default-apps", "text-editor"), settings::flex_item(
dropdown::popup_dropdown( fl!("default-apps", "text-editor"),
&meta.apps, widget::text(fl!("default-apps", "not-installed")),
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(Cow::Borrowed(&meta.icons)), } else {
) settings::flex_item(
fl!("default-apps", "text-editor"),
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(Cow::Borrowed(&meta.icons)),
)
}
}) })
.apply(Element::from) .apply(Element::from)
.map(crate::pages::Message::DefaultApps) .map(crate::pages::Message::DefaultApps)

View file

@ -843,6 +843,8 @@ default-apps = Default Applications
.terminal = Terminal .terminal = Terminal
.other-associations = Other associations .other-associations = Other associations
.text-editor = Text Editor .text-editor = Text Editor
.not-installed = Not installed
## Applications: Startup applications ## Applications: Startup applications