From 43a4228ca4901e19c943bb7a6c4f508ba76477e4 Mon Sep 17 00:00:00 2001 From: norepro <30921834+norepro@users.noreply.github.com> Date: Thu, 2 Jul 2026 08:52:14 -0700 Subject: [PATCH] feat: support MIME subclasses in file chooser dialog --- src/dialog.rs | 4 +++- src/mime_icon.rs | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/dialog.rs b/src/dialog.rs index 0623da0..7b47b7a 100644 --- a/src/dialog.rs +++ b/src/dialog.rs @@ -40,7 +40,7 @@ use crate::localize::LANGUAGE_SORTER; use crate::mounter::{MOUNTERS, MounterItem, MounterItems, MounterKey, MounterMessage}; use crate::tab::{self, ItemMetadata, Location, SearchLocation, Tab}; use crate::zoom::{zoom_in_view, zoom_out_view, zoom_to_default}; -use crate::{fl, home_dir, menu}; +use crate::{fl, home_dir, menu, mime_icon}; #[derive(Clone, Debug)] pub struct DialogMessage(cosmic::Action); @@ -1919,11 +1919,13 @@ impl Application for App { items.retain(|item| { // Directories are always shown item.metadata.is_dir() + // Check for mime type match (first because it is faster) || mimes.iter().any(|filter_mime| { if filter_mime.subtype() == mime::STAR { filter_mime.type_() == item.mime.type_() } else { *filter_mime == item.mime + || mime_icon::is_mime_subclass_of(&item.mime, filter_mime) } }) // Check for glob match (last because it is slower) diff --git a/src/mime_icon.rs b/src/mime_icon.rs index 1c1bf40..26d899d 100644 --- a/src/mime_icon.rs +++ b/src/mime_icon.rs @@ -124,3 +124,11 @@ pub fn parent_mime_types(mime: &Mime) -> Option> { let mime_icon_cache = MIME_ICON_CACHE.lock().unwrap(); mime_icon_cache.shared_mime_info.get_parents_aliased(mime) } + +pub fn is_mime_subclass_of(mime_type: &Mime, base: &Mime) -> bool { + let mime_icon_cache = MIME_ICON_CACHE.lock().unwrap(); + + mime_icon_cache + .shared_mime_info + .mime_type_subclass(mime_type, base) +}