Use xdg_mime::SharedMimeInfo to find icon names for mime types

This commit is contained in:
Jeremy Soller 2023-11-17 09:37:53 -07:00
parent 983e85ab89
commit ed8fd870a9
No known key found for this signature in database
GPG key ID: DCFCA852D3906975
3 changed files with 97 additions and 13 deletions

91
Cargo.lock generated
View file

@ -64,7 +64,7 @@ source = "git+https://github.com/wash2/accesskit.git?tag=winit-0.28#db6f2587f663
dependencies = [
"accesskit",
"accesskit_consumer",
"arrayvec",
"arrayvec 0.7.4",
"once_cell",
"paste",
"windows",
@ -207,6 +207,12 @@ version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545"
[[package]]
name = "arrayvec"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
[[package]]
name = "arrayvec"
version = "0.7.4"
@ -872,6 +878,7 @@ dependencies = [
"serde",
"syntect",
"two-face",
"xdg-mime",
]
[[package]]
@ -1170,6 +1177,16 @@ dependencies = [
"dirs-sys 0.4.1",
]
[[package]]
name = "dirs-next"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
dependencies = [
"cfg-if",
"dirs-sys-next",
]
[[package]]
name = "dirs-sys"
version = "0.3.7"
@ -1193,6 +1210,17 @@ dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "dirs-sys-next"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
dependencies = [
"libc",
"redox_users",
"winapi",
]
[[package]]
name = "dispatch"
version = "0.2.0"
@ -1897,6 +1925,12 @@ dependencies = [
"system-deps",
]
[[package]]
name = "glob"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
[[package]]
name = "glow"
version = "0.12.3"
@ -2553,7 +2587,7 @@ version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd85a5776cd9500c2e2059c8c76c3b01528566b7fcbaf8098b55a33fc298849b"
dependencies = [
"arrayvec",
"arrayvec 0.7.4",
]
[[package]]
@ -2568,6 +2602,19 @@ version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
[[package]]
name = "lexical-core"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe"
dependencies = [
"arrayvec 0.5.2",
"bitflags 1.3.2",
"cfg-if",
"ryu",
"static_assertions",
]
[[package]]
name = "libc"
version = "0.2.150"
@ -2745,7 +2792,7 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74df1ff0a0147282eb10699537a03baa7d31972b58984a1d44ce0624043fe8ad"
dependencies = [
"arrayvec",
"arrayvec 0.7.4",
"euclid",
"num-traits",
]
@ -3041,6 +3088,17 @@ dependencies = [
"libc",
]
[[package]]
name = "nom"
version = "5.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08959a387a676302eebf4ddbcbc611da04285579f76f88ee0506c63b1a61dd4b"
dependencies = [
"lexical-core",
"memchr",
"version_check",
]
[[package]]
name = "nom"
version = "7.1.3"
@ -4499,7 +4557,7 @@ name = "taffy"
version = "0.3.11"
source = "git+https://github.com/DioxusLabs/taffy#1876f72bee5e376023eaa518aa7b8a34c769bd1b"
dependencies = [
"arrayvec",
"arrayvec 0.7.4",
"grid",
"num-traits",
"slotmap",
@ -4600,7 +4658,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df8493a203431061e901613751931f047d1971337153f96d0e5e363d6dbf6a67"
dependencies = [
"arrayref",
"arrayvec",
"arrayvec 0.7.4",
"bytemuck",
"cfg-if",
"png",
@ -4614,7 +4672,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7db11798945fa5c3e5490c794ccca7c6de86d3afdd54b4eb324109939c6f37bc"
dependencies = [
"arrayref",
"arrayvec",
"arrayvec 0.7.4",
"bytemuck",
"cfg-if",
"log",
@ -5276,7 +5334,7 @@ version = "0.16.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "480c965c9306872eb6255fa55e4b4953be55a8b64d57e61d7ff840d3dcc051cd"
dependencies = [
"arrayvec",
"arrayvec 0.7.4",
"cfg-if",
"js-sys",
"log",
@ -5300,7 +5358,7 @@ version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f478237b4bf0d5b70a39898a66fa67ca3a007d79f2520485b8b0c3dfc46f8c2"
dependencies = [
"arrayvec",
"arrayvec 0.7.4",
"bit-vec",
"bitflags 2.4.1",
"codespan-reporting",
@ -5324,7 +5382,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ecb3258078e936deee14fd4e0febe1cfe9bbb5ffef165cb60218d2ee5eb4448"
dependencies = [
"android_system_properties",
"arrayvec",
"arrayvec 0.7.4",
"ash",
"bit-set",
"bitflags 2.4.1",
@ -5693,7 +5751,7 @@ version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7"
dependencies = [
"nom",
"nom 7.1.3",
]
[[package]]
@ -5712,6 +5770,19 @@ dependencies = [
"winapi",
]
[[package]]
name = "xdg-mime"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87bf7b69bb50588d70a36e467be29d3df3e8c32580276d62eded9738c1a797aa"
dependencies = [
"dirs-next",
"glob",
"mime",
"nom 5.1.3",
"unicase",
]
[[package]]
name = "xml-rs"
version = "0.8.19"

View file

@ -11,10 +11,12 @@ fontdb = "0.15.0"
lazy_static = "1.4.0"
log = "0.4.20"
mime_guess = "2"
#TODO: this is using gtk for file dialogues
rfd = { version = "0.12.0", optional = true }
serde = { version = "1", features = ["serde_derive"] }
syntect = "5.1.0"
two-face = "0.3.0"
xdg-mime = "0.3.3"
# Internationalization
i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] }
i18n-embed-fl = "0.6.4"

View file

@ -3,11 +3,22 @@ use std::path::Path;
pub const FALLBACK_MIME_ICON: &str = "text-x-generic";
lazy_static::lazy_static! {
static ref SHARED_MIME_INFO: xdg_mime::SharedMimeInfo = xdg_mime::SharedMimeInfo::new();
}
pub fn mime_icon<P: AsRef<Path>>(path: P, size: u16) -> icon::Icon {
let path = path.as_ref();
for mime in mime_guess::from_path(path).iter() {
//TODO: correct some common issues (like application/x-sh not being found)
let icon_name = mime.essence_str().replace("/", "-");
//TODO: SHARED_MIME_INFO.get_mime_types_from_file_name(path)
for mime_type in mime_guess::from_path(path) {
for icon_name in SHARED_MIME_INFO.lookup_icon_names(&mime_type) {
let named = icon::from_name(icon_name).size(size);
if named.clone().path().is_some() {
return named.icon();
}
}
let icon_name = mime_type.essence_str().replace("/", "-");
let named = icon::from_name(icon_name).size(size);
if named.clone().path().is_some() {
return named.icon();