From 1d2c027478c9ab64b60c2af5fbefcb9ca0b7e688 Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy Date: Wed, 27 Nov 2024 08:08:29 +0100 Subject: [PATCH] improv(default-apps): add video players to music player selection --- .../src/pages/system/default_apps.rs | 56 +++++++++++-------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/cosmic-settings/src/pages/system/default_apps.rs b/cosmic-settings/src/pages/system/default_apps.rs index 7484e80..7d2252a 100644 --- a/cosmic-settings/src/pages/system/default_apps.rs +++ b/cosmic-settings/src/pages/system/default_apps.rs @@ -115,13 +115,13 @@ impl page::Page for Page { let assocs = mime_apps::associations::by_app(); let apps = vec![ - load_defaults(&assocs, "x-scheme-handler/http").await, - load_defaults(&assocs, "inode/directory").await, - load_defaults(&assocs, "x-scheme-handler/mailto").await, - load_defaults(&assocs, "audio/mp3").await, - load_defaults(&assocs, "video/mp4").await, - load_defaults(&assocs, "image/png").await, - load_defaults(&assocs, "text/calendar").await, + load_defaults(&assocs, &["x-scheme-handler/http"]).await, + load_defaults(&assocs, &["inode/directory"]).await, + load_defaults(&assocs, &["x-scheme-handler/mailto"]).await, + load_defaults(&assocs, &["audio/mp3", "video/mp4"]).await, + load_defaults(&assocs, &["video/mp4"]).await, + load_defaults(&assocs, &["image/png"]).await, + load_defaults(&assocs, &["text/calendar"]).await, AppMeta { selected: None, app_ids: Vec::new(), @@ -348,25 +348,37 @@ fn apps() -> Section { }) } -async fn load_defaults(assocs: &BTreeMap, Arc>, for_mime: &str) -> AppMeta { - let Ok(mime) = for_mime.parse() else { - return AppMeta { - selected: None, - app_ids: Vec::new(), - apps: Vec::new(), - icons: Vec::new(), +async fn load_defaults(assocs: &BTreeMap, Arc>, for_mimes: &[&str]) -> AppMeta { + let mut unsorted = Vec::new(); + let mut current_app = None; + + for for_mime in for_mimes { + let Ok(mime) = for_mime.parse() else { + return AppMeta { + selected: None, + app_ids: Vec::new(), + apps: Vec::new(), + icons: Vec::new(), + }; }; - }; - let current_app_entry = xdg_mime_query_default(for_mime).await; - let current_appid = current_app_entry - .as_ref() - .and_then(|entry| entry.strip_suffix(".desktop")); + let current_app_entry = xdg_mime_query_default(for_mime).await; + let current_appid = current_app_entry + .as_ref() + .and_then(|entry| entry.strip_suffix(".desktop")); - let current_app = current_appid.and_then(|appid| assocs.get(appid)); + if unsorted.is_empty() { + current_app = current_appid.and_then(|appid| assocs.get(appid)); + } - let mut unsorted = mime_apps::apps_for_mime(&mime, assocs).collect::>(); - unsorted.sort_unstable_by_key(|(_, app)| &app.name); + unsorted.extend( + mime_apps::apps_for_mime(&mime, assocs) + .map(|(app_id, app)| (app_id.clone(), app.clone())), + ); + } + + unsorted.sort_unstable_by_key(|(_, app)| app.name.clone()); + unsorted.dedup_by_key(|(app_id, _)| app_id.clone()); let mut selected = None; let mut app_ids = Vec::new();