diff --git a/src/app.rs b/src/app.rs index 9d8e0db..402efb5 100644 --- a/src/app.rs +++ b/src/app.rs @@ -2010,7 +2010,7 @@ impl App { match (selected.next(), selected.next()) { // At least two selected items - (Some(_), Some(_)) => Some(tab.multi_preview_view()), + (Some(_), Some(_)) => Some(tab.multi_preview_view(Some(&self.mime_app_cache))), // Exactly one selected item (Some(item), None) => { Some(item.preview_view(Some(&self.mime_app_cache), military_time)) diff --git a/src/dialog.rs b/src/dialog.rs index 80dbdda..a16b5f3 100644 --- a/src/dialog.rs +++ b/src/dialog.rs @@ -717,7 +717,7 @@ impl App { match (selected.next(), selected.next()) { // At least two selected items - (Some(_), Some(_)) => Some(self.tab.multi_preview_view()), + (Some(_), Some(_)) => Some(self.tab.multi_preview_view(None)), // Exactly one selected item (Some(item), None) => Some(item.preview_view(None, military_time)), // No selected items diff --git a/src/tab.rs b/src/tab.rs index 1e0d3ce..77ab0a1 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -6248,7 +6248,10 @@ impl Tab { dnd_dest.into() } - pub fn multi_preview_view<'a>(&'a self) -> Element<'a, Message> { + pub fn multi_preview_view<'a>( + &'a self, + mime_app_cache_opt: Option<&'a mime_app::MimeAppCache>, + ) -> Element<'a, Message> { let cosmic_theme::Spacing { space_xxxs, space_m, @@ -6362,6 +6365,43 @@ impl Tab { column = column.push(widget::button::standard(fl!("open")).on_press(Message::Open(None))); + let mut settings = Vec::new(); + if mime_types.len() == 1 { + if let Some(mime) = mime_types + .get(0) + .and_then(|(mime, _)| mime.parse::().ok()) + { + if let Some(mime_app_cache) = mime_app_cache_opt { + let mime_apps = mime_app_cache.get(&mime); + if !mime_apps.is_empty() { + let mime_closure = mime.clone(); + settings.push( + widget::settings::item::builder(fl!("open-with")).control( + Element::from( + widget::dropdown( + mime_apps, + mime_apps.iter().position(|x| x.is_default), + move |index| (index, mime_closure.clone()), + ) + .icons(Cow::Borrowed(mime_app_cache.icons(&mime))), + ) + .map(|(index, mime)| { + let mime_app = &mime_apps[index]; + Message::SetOpenWith(mime, mime_app.id.clone()) + }), + ), + ); + } + } + } + } + + if !settings.is_empty() { + let mut section = widget::settings::section(); + section = section.extend(settings); + column = column.push(section); + } + column.into() } pub fn view<'a>(