fix(default-apps): Avoid creating dropdowns for empty categories
This commit is contained in:
parent
c654b6764b
commit
18beed5712
2 changed files with 203 additions and 100 deletions
|
|
@ -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(§ion.title)
|
.title(§ion.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)
|
||||||
|
|
|
||||||
2
i18n/en/cosmic_settings.ftl
vendored
2
i18n/en/cosmic_settings.ftl
vendored
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue