1
0
Fork 0
mirror of synced 2024-05-03 03:52:58 +12:00
This commit is contained in:
Rafał Mikrut 2024-02-03 18:47:00 +01:00
parent 7d0446bd92
commit 7029d9aac0
14 changed files with 330 additions and 326 deletions

323
Cargo.lock generated
View file

@ -18,15 +18,6 @@ version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046"
[[package]]
name = "addr2line"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
dependencies = [
"gimli",
]
[[package]]
name = "adler"
version = "1.0.2"
@ -213,6 +204,8 @@ version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ac22eda5891cc086690cb6fa10121c0390de0e3b04eb269f2d766b00d3f2d81"
dependencies = [
"async-fs 2.1.0",
"async-net",
"enumflags2",
"futures-channel",
"futures-util",
@ -220,7 +213,6 @@ dependencies = [
"rand",
"serde",
"serde_repr",
"tokio",
"url",
"zbus",
]
@ -248,6 +240,43 @@ dependencies = [
"pin-project-lite",
]
[[package]]
name = "async-executor"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c"
dependencies = [
"async-lock 3.3.0",
"async-task",
"concurrent-queue",
"fastrand 2.0.1",
"futures-lite 2.2.0",
"slab",
]
[[package]]
name = "async-fs"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06"
dependencies = [
"async-lock 2.8.0",
"autocfg",
"blocking",
"futures-lite 1.13.0",
]
[[package]]
name = "async-fs"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd1f344136bad34df1f83a47f3fd7f2ab85d75cb8a940af4ccf6d482a84ea01b"
dependencies = [
"async-lock 3.3.0",
"blocking",
"futures-lite 2.2.0",
]
[[package]]
name = "async-io"
version = "1.13.0"
@ -264,7 +293,7 @@ dependencies = [
"polling 2.8.0",
"rustix 0.37.27",
"slab",
"socket2 0.4.10",
"socket2",
"waker-fn",
]
@ -307,6 +336,17 @@ dependencies = [
"pin-project-lite",
]
[[package]]
name = "async-net"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7"
dependencies = [
"async-io 2.3.1",
"blocking",
"futures-lite 2.2.0",
]
[[package]]
name = "async-process"
version = "1.8.1"
@ -403,21 +443,6 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "backtrace"
version = "0.3.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
dependencies = [
"addr2line",
"cc",
"cfg-if",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
]
[[package]]
name = "base64"
version = "0.21.7"
@ -2056,7 +2081,10 @@ version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba"
dependencies = [
"fastrand 2.0.1",
"futures-core",
"futures-io",
"parking",
"pin-project-lite",
]
@ -2090,9 +2118,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
dependencies = [
"futures-core",
"futures-io",
"futures-macro",
"futures-sink",
"futures-task",
"memchr",
"pin-project-lite",
"pin-utils",
"slab",
@ -2253,12 +2283,6 @@ dependencies = [
"weezl",
]
[[package]]
name = "gimli"
version = "0.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
[[package]]
name = "gio"
version = "0.18.4"
@ -2662,9 +2686,9 @@ dependencies = [
[[package]]
name = "i-slint-backend-linuxkms"
version = "1.4.0"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6cd1b3324ff9f747fcca8a2b26f6ddbea318f1df82904ead9b8f6afae24bc25"
checksum = "7fff24de728432445a94f890093bd852a7c3fd01ae282e40ae0eab6ea629a66d"
dependencies = [
"calloop",
"drm 0.9.0",
@ -2683,9 +2707,9 @@ dependencies = [
[[package]]
name = "i-slint-backend-selector"
version = "1.4.0"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b0f07f619b50236543a1e0db24a479a1de8e334bf0aaca81c934e5f416dbb1b"
checksum = "1953f792a394a7ad26932b4989646719fb126910029006f7cef40ffd189633d0"
dependencies = [
"cfg-if",
"i-slint-backend-linuxkms",
@ -2697,9 +2721,9 @@ dependencies = [
[[package]]
name = "i-slint-backend-winit"
version = "1.4.0"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4a2e570357afaf8f12d1a068425b3581ac731748dfc267c6c138360777bd450"
checksum = "138c36c5c9e12f22fe07f280200cedb5d31e07641e40e3b45376fe2112ead303"
dependencies = [
"bytemuck",
"cfg-if",
@ -2732,9 +2756,9 @@ dependencies = [
[[package]]
name = "i-slint-common"
version = "1.4.0"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0314c1b4834ab8b427eb4a557962647c508774b4cd395b64506243bc5ddd5696"
checksum = "550e9282fda488b76ce057a728168d1aef947c758f3221b92ae904b167ab008c"
dependencies = [
"cfg-if",
"derive_more",
@ -2744,9 +2768,9 @@ dependencies = [
[[package]]
name = "i-slint-compiler"
version = "1.4.0"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3812db29a849bd6579c080d2b5507e7dd2105300a70aab6dd743974502d754f"
checksum = "25aa2c3525ea761b3e9251f7869e64dce5f483f7ea1a5e04fe7b9a3fb5780dd6"
dependencies = [
"by_address",
"codemap",
@ -2774,9 +2798,9 @@ dependencies = [
[[package]]
name = "i-slint-core"
version = "1.4.0"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea54d9a3e3a7f6cf4d130810d287143120ff0c24a0b2d0fbd0ac0428c8fbe31f"
checksum = "4d40990f7ed42c76799edc0e8cae9a8ffcc77569506a94e86eef81626c7387a7"
dependencies = [
"auto_enums",
"bytemuck",
@ -2818,9 +2842,9 @@ dependencies = [
[[package]]
name = "i-slint-core-macros"
version = "1.4.0"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4732fcf4e706f99b93959f4ac8f66831483d3e194a3d476b14cb78e664acfe6e"
checksum = "4f2a4e4c21ed660181abe101b6f141d920e838fec4bc1ff20f7440dc03fb5ad8"
dependencies = [
"quote",
"syn 2.0.48",
@ -2828,9 +2852,9 @@ dependencies = [
[[package]]
name = "i-slint-renderer-femtovg"
version = "1.4.0"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7cf902c7f989bd988077e2b517cfbb89981e220f5a07b7e8918554ec22dbc1d"
checksum = "337e6ec928bde01baa27d3fdeddd5a33665952aead4d0d9be9818f573a41344c"
dependencies = [
"cfg-if",
"const-field-offset",
@ -2861,9 +2885,9 @@ dependencies = [
[[package]]
name = "i-slint-renderer-skia"
version = "1.4.0"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53a4babc3b281b491a7bc2cd48ea2643d6754eeb5c38a37d33da55366e00e197"
checksum = "1189ac65d7e31129407e2cfef4009cdea500040a73d8f87505949f82af0939db"
dependencies = [
"ash",
"bytemuck",
@ -2892,8 +2916,7 @@ dependencies = [
"unicode-segmentation",
"vtable",
"vulkano",
"winapi",
"wio",
"windows 0.52.0",
]
[[package]]
@ -2934,9 +2957,9 @@ dependencies = [
[[package]]
name = "i18n-embed-fl"
version = "0.7.0"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9fc1f8715195dffc4caddcf1cf3128da15fe5d8a137606ea8856c9300047d5a2"
checksum = "8241a781f49e923415e106fcd1f89c3fab92cc9f699a521c56e95dee273903d3"
dependencies = [
"dashmap",
"find-crate",
@ -3756,17 +3779,6 @@ dependencies = [
"simd-adler32",
]
[[package]]
name = "mio"
version = "0.8.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"
dependencies = [
"libc",
"wasi",
"windows-sys 0.48.0",
]
[[package]]
name = "multicache"
version = "0.6.1"
@ -3999,15 +4011,6 @@ dependencies = [
"objc",
]
[[package]]
name = "object"
version = "0.32.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
dependencies = [
"memchr",
]
[[package]]
name = "ogg_pager"
version = "0.6.0"
@ -4659,20 +4662,6 @@ dependencies = [
"bytemuck",
]
[[package]]
name = "ring"
version = "0.17.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74"
dependencies = [
"cc",
"getrandom",
"libc",
"spin",
"untrusted",
"windows-sys 0.48.0",
]
[[package]]
name = "rle-decode-fast"
version = "1.0.3"
@ -4700,9 +4689,9 @@ checksum = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f"
[[package]]
name = "rubato"
version = "0.12.0"
version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd70209c27d5b08f5528bdc779ea3ffb418954e28987f9f9775c6eac41003f9c"
checksum = "e6dd52e80cfc21894deadf554a5673002938ae4625f7a283e536f9cf7c17b0d5"
dependencies = [
"num-complex 0.4.4",
"num-integer",
@ -4744,12 +4733,6 @@ dependencies = [
"walkdir",
]
[[package]]
name = "rustc-demangle"
version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
[[package]]
name = "rustc-hash"
version = "1.1.0"
@ -4839,28 +4822,6 @@ dependencies = [
"windows-sys 0.52.0",
]
[[package]]
name = "rustls"
version = "0.21.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba"
dependencies = [
"log",
"ring",
"rustls-webpki",
"sct",
]
[[package]]
name = "rustls-webpki"
version = "0.101.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
dependencies = [
"ring",
"untrusted",
]
[[package]]
name = "rustversion"
version = "1.0.14"
@ -4869,9 +4830,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
[[package]]
name = "rusty-chromaprint"
version = "0.1.3"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "023a224821c3208db13134f398c2d92ed81267ef4f65ac8dff670c00b829faac"
checksum = "1755646867c36ecb391776deaa0b557a76d3badf20c142de7282630c34b20440"
dependencies = [
"rubato",
"rustfft 6.2.0",
@ -4942,16 +4903,6 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "sct"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
dependencies = [
"ring",
"untrusted",
]
[[package]]
name = "sctk-adwaita"
version = "0.8.1"
@ -5118,9 +5069,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
[[package]]
name = "skia-bindings"
version = "0.69.0"
version = "0.70.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b4b5af96ee7d895763fa606f4531fddfb11de034217edd0c7beb9ea181efe5b"
checksum = "4bc61a106126a429bb4775ce5fbe23b2bcaa74d1a9c484997f4700de31480b44"
dependencies = [
"bindgen",
"cc",
@ -5131,20 +5082,18 @@ dependencies = [
"serde_json",
"tar",
"toml 0.8.9",
"ureq",
]
[[package]]
name = "skia-safe"
version = "0.69.0"
version = "0.70.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a3d25acaedea0a8ed1dac52f383fc90276f5679a68e3f84c5fb7f7bde8934ff"
checksum = "3201eba92bca1f83864f5c3a48309bcfee7e0590bebd7826e7ab0a49aa24a750"
dependencies = [
"bitflags 2.4.2",
"lazy_static",
"skia-bindings",
"winapi",
"wio",
"windows 0.52.0",
]
[[package]]
@ -5158,9 +5107,9 @@ dependencies = [
[[package]]
name = "slint"
version = "1.4.0"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc2fbd42d7728b2a48e21b8e0a8bde32275956bd8802b779e127d8fb3b9e73b6"
checksum = "7d51a972e5c6f22793f9b334eeb537121337fbf66ed73e978475fca031fd367a"
dependencies = [
"const-field-offset",
"i-slint-backend-selector",
@ -5175,9 +5124,9 @@ dependencies = [
[[package]]
name = "slint-build"
version = "1.4.0"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b65a1ded118c4848c432f9b1877eab793fcc1ef9fd9809d6f7a3cd1eefb1bb2b"
checksum = "ebf98969a520e19ec675435b8c21b883d4a06489947e137bbd30859b50ad0c36"
dependencies = [
"i-slint-compiler",
"spin_on",
@ -5187,9 +5136,9 @@ dependencies = [
[[package]]
name = "slint-macros"
version = "1.4.0"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad63c624ee686b0b1dc93b962deb9a526638d0328e89453e9554fe5e047da54a"
checksum = "564b2a25cc34007aa9cd73630394efa972b956fee86538caa5d09808b3ba0c05"
dependencies = [
"i-slint-compiler",
"proc-macro2",
@ -5289,16 +5238,6 @@ dependencies = [
"winapi",
]
[[package]]
name = "socket2"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
dependencies = [
"libc",
"windows-sys 0.48.0",
]
[[package]]
name = "softbuffer"
version = "0.3.4"
@ -5403,18 +5342,18 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "strum"
version = "0.25.0"
version = "0.26.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125"
checksum = "723b93e8addf9aa965ebe2d11da6d7540fa2283fcea14b3371ff055f7ba13f5f"
dependencies = [
"strum_macros",
]
[[package]]
name = "strum_macros"
version = "0.25.3"
version = "0.26.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0"
checksum = "7a3417fc93d76740d974a01654a09777cb500428cc874ca9f45edfe0c4d4cd18"
dependencies = [
"heck",
"proc-macro2",
@ -5745,9 +5684,9 @@ dependencies = [
[[package]]
name = "time"
version = "0.3.32"
version = "0.3.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe80ced77cbfb4cb91a94bf72b378b4b6791a0d9b7f09d0be747d1bdff4e68bd"
checksum = "00b24b79b7a07f10209f19e683ca1e289d80b1e76ffa8c2b779718566a083679"
dependencies = [
"deranged",
"itoa",
@ -5838,23 +5777,6 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
version = "1.35.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
dependencies = [
"backtrace",
"bytes",
"libc",
"mio",
"pin-project-lite",
"signal-hook-registry",
"socket2 0.5.5",
"tracing",
"windows-sys 0.48.0",
]
[[package]]
name = "toml"
version = "0.5.11"
@ -6172,28 +6094,6 @@ version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
[[package]]
name = "untrusted"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "ureq"
version = "2.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97"
dependencies = [
"base64",
"flate2",
"log",
"once_cell",
"rustls",
"rustls-webpki",
"url",
"webpki-roots",
]
[[package]]
name = "url"
version = "2.5.0"
@ -6607,12 +6507,6 @@ dependencies = [
"wasm-bindgen",
]
[[package]]
name = "webpki-roots"
version = "0.25.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10"
[[package]]
name = "weezl"
version = "0.1.8"
@ -6689,6 +6583,16 @@ dependencies = [
"windows-targets 0.48.5",
]
[[package]]
name = "windows"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
dependencies = [
"windows-core",
"windows-targets 0.52.0",
]
[[package]]
name = "windows-core"
version = "0.52.0"
@ -6946,9 +6850,9 @@ dependencies = [
[[package]]
name = "winnow"
version = "0.5.36"
version = "0.5.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "818ce546a11a9986bc24f93d0cdf38a8a1a400f1473ea8c82e59f6e0ffab9249"
checksum = "a7cad8365489051ae9f054164e459304af2e7e9bb407c958076c8bf4aef52da5"
dependencies = [
"memchr",
]
@ -7120,9 +7024,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948"
dependencies = [
"async-broadcast",
"async-executor",
"async-fs 1.6.0",
"async-io 1.13.0",
"async-lock 2.8.0",
"async-process",
"async-recursion",
"async-task",
"async-trait",
"blocking",
"byteorder",
"derivative",
"enumflags2",
@ -7139,7 +7049,6 @@ dependencies = [
"serde_repr",
"sha1",
"static_assertions",
"tokio",
"tracing",
"uds_windows",
"winapi",

View file

@ -34,7 +34,7 @@ audio_checker = "0.1"
pdf = "0.9"
# Needed by audio similarity feature
rusty-chromaprint = "0.1"
rusty-chromaprint = "0.2"
symphonia = { version = "0.5", features = ["all"] }
# Hashes for duplicate files
@ -55,7 +55,7 @@ serde_json = "1.0"
# Language
i18n-embed = { version = "0.14", features = ["fluent-system", "desktop-requester"] }
i18n-embed-fl = "0.7"
i18n-embed-fl = "0.8"
rust-embed = { version = "8.2", features = ["debug-embed"] }
once_cell = "1.19"

View file

@ -52,16 +52,11 @@ impl Extensions {
}
/// List of allowed extensions, only files with this extensions will be checking if are duplicates
/// After, extensions cannot contains any dot, commas etc.
/// After, extensions cannot contain any dot, commas etc.
pub fn set_allowed_extensions(&mut self, allowed_extensions: String) -> Messages {
let (extensions, mut messages) = Self::filter_extensions(allowed_extensions);
let (extensions, messages) = Self::filter_extensions(allowed_extensions);
self.allowed_extensions_hashset = extensions;
if self.allowed_extensions_hashset.is_empty() {
messages
.messages
.push("No valid extensions were provided, so allowing all extensions by default.".to_string());
}
messages
}

View file

@ -189,7 +189,7 @@ impl EmptyFolder {
}
}
let mut folder_entries: HashMap<String, FolderEntry> = HashMap::with_capacity(start_folder_entries.len() + new_folder_entries_list.iter().map(|e| e.len()).sum::<usize>());
let mut folder_entries: HashMap<String, FolderEntry> = HashMap::with_capacity(start_folder_entries.len() + new_folder_entries_list.iter().map(Vec::len).sum::<usize>());
for fe in start_folder_entries {
folder_entries.insert(fe.path.to_string_lossy().to_string(), fe);
}

View file

@ -43,7 +43,7 @@ fs_extra = "1.3"
# Language
i18n-embed = { version = "0.14", features = ["fluent-system", "desktop-requester"] }
i18n-embed-fl = "0.7"
i18n-embed-fl = "0.8"
rust-embed = { version = "8.2", features = ["debug-embed"] }
once_cell = "1.19"

View file

@ -17,7 +17,7 @@ chrono = "0.4.33"
open = "5.0"
crossbeam-channel = "0.5"
handsome_logger = "0.8"
rfd = { version = "0.13", default-features = false, features = ["xdg-portal", "tokio"] }
rfd = { version = "0.13", default-features = false, features = ["xdg-portal", "async-std"] }
home = "0.5"
log = "0.4.20"
serde = "1.0"
@ -30,7 +30,7 @@ rayon = "1.8"
# Translations
i18n-embed = { version = "0.14", features = ["fluent-system", "desktop-requester"] }
i18n-embed-fl = "0.7"
i18n-embed-fl = "0.8"
rust-embed = { version = "8.2", features = ["debug-embed"] }
once_cell = "1.19"

View file

@ -1,9 +1,9 @@
use std::path::PathBuf;
use slint::{ModelRc, SharedString, StandardListViewItem, VecModel};
use crate::CurrentTab;
use crate::ExcludedDirectoriesModel;
use crate::IncludedDirectoriesModel;
use crate::CurrentTab;
use slint::{ModelRc, SharedString, VecModel};
// Remember to match updated this according to ui/main_lists.slint and connect_scan.rs files
pub fn get_path_idx(active_tab: CurrentTab) -> usize {
@ -41,25 +41,27 @@ pub fn get_is_header_mode(active_tab: CurrentTab) -> bool {
// .collect::<Vec<_>>();
// ModelRc::new(VecModel::from(new_folders_standard_list_view))
// }
pub fn create_string_standard_list_view_from_pathbuf(items: &[PathBuf]) -> ModelRc<StandardListViewItem> {
let new_folders_standard_list_view = items
.iter()
.map(|x| {
let mut element = StandardListViewItem::default();
element.text = x.to_string_lossy().to_string().into();
element
})
.collect::<Vec<_>>();
ModelRc::new(VecModel::from(new_folders_standard_list_view))
}
// pub fn create_string_standard_list_view_from_pathbuf(items: &[PathBuf]) -> ModelRc<StandardListViewItem> {
// let new_folders_standard_list_view = items
// .iter()
// .map(|x| {
// let mut element = StandardListViewItem::default();
// element.text = x.to_string_lossy().to_string().into();
// element
// })
// .collect::<Vec<_>>();
// ModelRc::new(VecModel::from(new_folders_standard_list_view))
// }
pub fn create_included_directories_model_from_pathbuf(items: &[PathBuf]) -> ModelRc<IncludedDirectoriesModel> {
pub fn create_included_directories_model_from_pathbuf(items: &[PathBuf], referenced: &[PathBuf]) -> ModelRc<IncludedDirectoriesModel> {
let referenced_as_string = referenced.iter().map(|x| x.to_string_lossy().to_string()).collect::<Vec<_>>();
let converted = items
.iter()
.map(|x| {
let path_as_string = x.to_string_lossy().to_string();
IncludedDirectoriesModel {
path: x.to_string_lossy().to_string().into(),
referenced_folder: false,
referenced_folder: referenced_as_string.contains(&path_as_string),
selected_row: false,
}
})
@ -70,11 +72,9 @@ pub fn create_included_directories_model_from_pathbuf(items: &[PathBuf]) -> Mode
pub fn create_excluded_directories_model_from_pathbuf(items: &[PathBuf]) -> ModelRc<ExcludedDirectoriesModel> {
let converted = items
.iter()
.map(|x| {
ExcludedDirectoriesModel {
path: x.to_string_lossy().to_string().into(),
selected_row: false,
}
.map(|x| ExcludedDirectoriesModel {
path: x.to_string_lossy().to_string().into(),
selected_row: false,
})
.collect::<Vec<_>>();
ModelRc::new(VecModel::from(converted))

View file

@ -12,65 +12,67 @@ pub fn connect_add_remove_directories(app: &MainWindow) {
fn connect_add_manual_directories(app: &MainWindow) {
let a = app.as_weak();
app.global::<Callabler>().on_added_manual_directories(move |included_directories, list_of_files_to_add| {
let non_empty_lines = list_of_files_to_add.lines().filter(|x| !x.is_empty()).collect::<Vec<_>>();
if non_empty_lines.is_empty() {
let folders = list_of_files_to_add.lines().filter(|x| !x.is_empty()).map(str::to_string).collect::<Vec<_>>();
if folders.is_empty() {
return;
}
let app = a.upgrade().unwrap();
let settings = app.global::<Settings>();
if included_directories {
let included_model = settings.get_included_directories_model();
let mut included_model = included_model.iter().collect::<Vec<_>>();
included_model.extend(non_empty_lines.iter().map(|x| IncludedDirectoriesModel {
path: x.to_string_lossy().to_string().into(),
referenced_folder: false,
selected_row: false,
}));
included_model.sort_by_cached_key(|x| x.text.to_string());
included_model.dedup();
settings.set_included_directories_model(ModelRc::new(VecModel::from(included_model)));
add_included_directories(&settings, &folders);
} else {
let excluded_model = settings.get_excluded_directories_model();
let mut excluded_model = excluded_model.iter().collect::<Vec<_>>();
excluded_model.extend(non_empty_lines.iter().map(|x| ExcludedDirectoriesModel {
path: x.to_string_lossy().to_string().into(),
selected_row: false,
}));
excluded_model.sort_by_cached_key(|x| x.path.to_string());
excluded_model.dedup();
settings.set_excluded_directories_model(ModelRc::new(VecModel::from(excluded_model)));
add_excluded_directories(&settings, &folders);
}
});
}
fn connect_remove_directories(app: &MainWindow) {
let a = app.as_weak();
app.global::<Callabler>().on_remove_item_directories(move |included_directories, current_index| {
app.global::<Callabler>().on_remove_item_directories(move |included_directories| {
let app = a.upgrade().unwrap();
let settings = app.global::<Settings>();
let current_index = if included_directories {
settings.get_included_directories_model_selected_idx()
} else {
settings.get_excluded_directories_model_selected_idx()
};
// Nothing selected
if current_index == -1 {
return;
}
let app = a.upgrade().unwrap();
let settings = app.global::<Settings>();
if included_directories {
let included_model = settings.get_included_directories();
let included_model = settings.get_included_directories_model();
let model_count = included_model.iter().count();
if model_count > current_index as usize {
let mut included_model = included_model.iter().collect::<Vec<_>>();
included_model.remove(current_index as usize);
settings.set_included_directories(ModelRc::new(VecModel::from(included_model)));
if current_index as usize != model_count - 1 {
included_model[current_index as usize].selected_row = true;
settings.set_included_directories_model_selected_idx(current_index);
} else {
settings.set_included_directories_model_selected_idx(-1);
}
settings.set_included_directories_model(ModelRc::new(VecModel::from(included_model)));
}
} else {
let excluded_model = settings.get_excluded_directories();
let excluded_model = settings.get_excluded_directories_model();
let model_count = excluded_model.iter().count();
if model_count > current_index as usize {
let mut excluded_model = excluded_model.iter().collect::<Vec<_>>();
excluded_model.remove(current_index as usize);
settings.set_excluded_directories(ModelRc::new(VecModel::from(excluded_model)));
if current_index as usize != model_count - 1 {
excluded_model[current_index as usize].selected_row = true;
settings.set_excluded_directories_model_selected_idx(current_index);
} else {
settings.set_excluded_directories_model_selected_idx(-1);
}
settings.set_excluded_directories_model(ModelRc::new(VecModel::from(excluded_model)));
}
}
});
@ -88,33 +90,54 @@ fn connect_add_directories(app: &MainWindow) {
let Some(folders) = file_dialog.pick_folders() else {
return;
};
let folders = folders.iter().map(|x| x.to_string_lossy().to_string()).collect::<Vec<_>>();
let settings = app.global::<Settings>();
let old_folders = if included_directories {
settings.get_included_directories_model()
} else {
settings.get_excluded_directories_model()
};
let mut new_folders = old_folders.iter().map(|x| x.path.to_string()).collect::<Vec<_>>();
new_folders.extend(folders.iter().map(|x| x.to_string_lossy().to_string()));
new_folders.sort();
new_folders.dedup();
let new_folders_standard_list_view = new_folders
.iter()
.map(|x| {
let mut element = slint::StandardListViewItem::default();
element.text = x.into();
element
})
.collect::<Vec<_>>();
let new_folders_model = ModelRc::new(VecModel::from(new_folders_standard_list_view));
if included_directories {
settings.set_included_directories_model(new_folders_model);
add_included_directories(&settings, &folders);
} else {
settings.set_excluded_directories_model(new_folders_model);
add_excluded_directories(&settings, &folders);
}
});
}
fn add_included_directories(settings: &Settings, folders: &[String]) {
let old_folders = settings.get_included_directories_model();
let old_folders_path = old_folders.iter().map(|x| x.path.to_string()).collect::<Vec<_>>();
let mut new_folders = old_folders.iter().collect::<Vec<_>>();
let filtered_folders = folders.iter().filter(|x| !old_folders_path.contains(x)).collect::<Vec<_>>();
new_folders.iter_mut().for_each(|x| x.selected_row = false);
new_folders.extend(filtered_folders.iter().map(|path| IncludedDirectoriesModel {
path: (*path).into(),
referenced_folder: false,
selected_row: false,
}));
new_folders.sort_by_key(|x| x.path.clone());
let new_folders_model = ModelRc::new(VecModel::from(new_folders));
settings.set_included_directories_model(new_folders_model);
}
fn add_excluded_directories(settings: &Settings, folders: &[String]) {
let old_folders = settings.get_excluded_directories_model();
let old_folders_path = old_folders.iter().map(|x| x.path.to_string()).collect::<Vec<_>>();
let mut new_folders = old_folders.iter().collect::<Vec<_>>();
let filtered_folders = folders.iter().filter(|x| !old_folders_path.contains(x)).collect::<Vec<_>>();
new_folders.iter_mut().for_each(|x| x.selected_row = false);
new_folders.extend(filtered_folders.iter().map(|path| ExcludedDirectoriesModel {
path: (*path).into(),
selected_row: false,
}));
new_folders.sort_by_key(|x| x.path.clone());
let new_folders_model = ModelRc::new(VecModel::from(new_folders));
settings.set_excluded_directories_model(new_folders_model);
}

View file

@ -14,7 +14,7 @@ use czkawka_core::common_traits::ResultEntry;
use czkawka_core::empty_files::EmptyFiles;
use czkawka_core::empty_folder::{EmptyFolder, FolderEntry};
use czkawka_core::similar_images;
use czkawka_core::similar_images::SimilarImages;
use czkawka_core::similar_images::{ImagesEntry, SimilarImages};
use crate::settings::{collect_settings, SettingsCustom, ALLOWED_HASH_TYPE_VALUES, ALLOWED_RESIZE_ALGORITHM_VALUES};
use crate::{CurrentTab, GuiState, MainListModel, MainWindow, ProgressToSend};
@ -74,22 +74,70 @@ fn scan_similar_images(a: Weak<MainWindow>, progress_sender: Sender<ProgressData
finder.set_similarity(custom_settings.similar_images_sub_similarity as u32);
finder.find_similar_images(Some(&stop_receiver), Some(&progress_sender));
let mut vector = finder.get_similar_images().clone();
let messages = finder.get_text_messages().create_messages_text();
if finder.get_use_reference() {
let mut vector = finder.get_similar_images_referenced().clone();
let messages = finder.get_text_messages().create_messages_text();
for vec_fe in &mut vector {
vec_fe.par_sort_unstable_by_key(|e| e.similarity);
let hash_size = custom_settings.similar_images_sub_hash_size;
for (_first_entry, vec_fe) in &mut vector {
vec_fe.par_sort_unstable_by_key(|e| e.similarity);
}
a.upgrade_in_event_loop(move |app| {
write_similar_images_results_referenced(&app, vector, messages, hash_size);
})
} else {
let mut vector = finder.get_similar_images().clone();
let messages = finder.get_text_messages().create_messages_text();
let hash_size = custom_settings.similar_images_sub_hash_size;
for vec_fe in &mut vector {
vec_fe.par_sort_unstable_by_key(|e| e.similarity);
}
a.upgrade_in_event_loop(move |app| {
write_similar_images_results(&app, vector, messages, hash_size);
})
}
let hash_size = custom_settings.similar_images_sub_hash_size;
a.upgrade_in_event_loop(move |app| {
write_similar_images_results(&app, vector, messages, hash_size);
})
})
.unwrap();
}
fn write_similar_images_results(app: &MainWindow, vector: Vec<Vec<similar_images::ImagesEntry>>, messages: String, hash_size: u8) {
fn write_similar_images_results_referenced(app: &MainWindow, vector: Vec<(ImagesEntry, Vec<ImagesEntry>)>, messages: String, hash_size: u8) {
let items_found = vector.len();
let items = Rc::new(VecModel::default());
for (ref_fe, vec_fe) in vector {
let (ref_directory, ref_file) = split_path(ref_fe.get_path());
let ref_data_model = VecModel::from_slice(&[
similar_images::get_string_from_similarity(&ref_fe.similarity, hash_size).into(),
format_size(ref_fe.size, BINARY).into(),
ref_fe.dimensions.clone().into(),
ref_file.into(),
ref_directory.into(),
NaiveDateTime::from_timestamp_opt(ref_fe.get_modified_date() as i64, 0).unwrap().to_string().into(),
]);
insert_data_to_model(&items, ref_data_model, true);
for fe in vec_fe {
let (directory, file) = split_path(fe.get_path());
let data_model = VecModel::from_slice(&[
similar_images::get_string_from_similarity(&fe.similarity, hash_size).into(),
format_size(fe.size, BINARY).into(),
fe.dimensions.clone().into(),
file.into(),
directory.into(),
NaiveDateTime::from_timestamp_opt(fe.get_modified_date() as i64, 0).unwrap().to_string().into(),
]);
insert_data_to_model(&items, data_model, false);
}
}
app.set_similar_images_model(items.into());
app.invoke_scan_ended(format!("Found {items_found} similar images files").into());
app.global::<GuiState>().set_info_text(messages.into());
}
fn write_similar_images_results(app: &MainWindow, vector: Vec<Vec<ImagesEntry>>, messages: String, hash_size: u8) {
let items_found = vector.len();
let items = Rc::new(VecModel::default());
for vec_fe in vector {
@ -202,6 +250,7 @@ where
T: CommonData,
{
component.set_included_directory(custom_settings.included_directories.clone());
component.set_reference_directory(custom_settings.included_directories_referenced.clone());
component.set_excluded_directory(custom_settings.excluded_directories.clone());
component.set_recursive_search(custom_settings.recursive_search);
component.set_minimal_file_size(custom_settings.minimum_file_size as u64 * 1024);

View file

@ -12,7 +12,7 @@ use slint::{ComponentHandle, Model, ModelRc};
use czkawka_core::common::{get_available_threads, set_number_of_threads};
use czkawka_core::common_items::{DEFAULT_EXCLUDED_DIRECTORIES, DEFAULT_EXCLUDED_ITEMS};
use crate::common::{create_included_directories_model_from_pathbuf, create_excluded_directories_model_from_pathbuf, create_vec_model_from_vec_string};
use crate::common::{create_excluded_directories_model_from_pathbuf, create_included_directories_model_from_pathbuf, create_vec_model_from_vec_string};
use crate::{Callabler, GuiState, MainWindow, Settings};
pub const DEFAULT_MINIMUM_SIZE_KB: i32 = 16;
@ -44,6 +44,8 @@ pub const ALLOWED_HASH_TYPE_VALUES: &[(&str, &str, HashAlg)] = &[
pub struct SettingsCustom {
#[serde(default = "default_included_directories")]
pub included_directories: Vec<PathBuf>,
#[serde(default)]
pub included_directories_referenced: Vec<PathBuf>,
#[serde(default = "default_excluded_directories")]
pub excluded_directories: Vec<PathBuf>,
#[serde(default = "default_excluded_items")]
@ -261,7 +263,7 @@ pub fn save_base_settings_to_file(app: &MainWindow) {
pub fn save_custom_settings_to_file(app: &MainWindow) {
let current_item = app.global::<Settings>().get_settings_preset_idx();
let result = save_data_to_file(get_config_file(current_item + 1), &collect_settings(app));
let result = save_data_to_file(get_config_file(current_item), &collect_settings(app));
if let Err(e) = result {
error!("{e}");
@ -350,12 +352,12 @@ pub fn set_settings_to_gui(app: &MainWindow, custom_settings: &SettingsCustom) {
let settings = app.global::<Settings>();
// Included directories
let included_directories = create_included_directories_model_from_pathbuf(&custom_settings.included_directories);
settings.set_included_directories(included_directories);
let included_directories = create_included_directories_model_from_pathbuf(&custom_settings.included_directories, &custom_settings.included_directories_referenced);
settings.set_included_directories_model(included_directories);
// Excluded directories
let excluded_directories = create_excluded_directories_model_from_pathbuf(&custom_settings.excluded_directories);
settings.set_excluded_directories(excluded_directories);
settings.set_excluded_directories_model(excluded_directories);
settings.set_excluded_items(custom_settings.excluded_items.clone().into());
settings.set_allowed_extensions(custom_settings.allowed_extensions.clone().into());
@ -433,11 +435,16 @@ pub fn set_settings_to_gui(app: &MainWindow, custom_settings: &SettingsCustom) {
pub fn collect_settings(app: &MainWindow) -> SettingsCustom {
let settings = app.global::<Settings>();
let included_directories = settings.get_included_directories_model();
let included_directories = included_directories.iter().map(|model| PathBuf::from(model.path.as_str())).collect::<Vec<_>>();
let included_directories_model = settings.get_included_directories_model();
let included_directories = included_directories_model.iter().map(|model| PathBuf::from(model.path.as_str())).collect::<Vec<_>>();
let included_directories_referenced = included_directories_model
.iter()
.filter(|model| model.referenced_folder)
.map(|model| PathBuf::from(model.path.as_str()))
.collect::<Vec<_>>();
let excluded_directories = settings.get_excluded_directories_model();
let excluded_directories = excluded_directories.iter().map(|model| PathBuf::from(model.path.as_str())).collect::<Vec<_>>();
let excluded_directories_model = settings.get_excluded_directories_model();
let excluded_directories = excluded_directories_model.iter().map(|model| PathBuf::from(model.path.as_str())).collect::<Vec<_>>();
let excluded_items = settings.get_excluded_items().to_string();
let allowed_extensions = settings.get_allowed_extensions().to_string();
@ -482,6 +489,7 @@ pub fn collect_settings(app: &MainWindow) -> SettingsCustom {
let similar_images_sub_similarity = settings.get_similar_images_sub_current_similarity().round() as i32;
SettingsCustom {
included_directories,
included_directories_referenced,
excluded_directories,
excluded_items,
allowed_extensions,

View file

@ -25,7 +25,7 @@ component DirectoriesPanel inherits HorizontalLayout {
Button {
text: "Remove";
clicked => {
Callabler.remove_item_directories(true, included_list.current_index);
Callabler.remove_item_directories(true);
}
}
@ -66,7 +66,7 @@ component DirectoriesPanel inherits HorizontalLayout {
Button {
text: "Remove";
clicked => {
Callabler.remove_item_directories(false, excluded_list.current_index);
Callabler.remove_item_directories(false);
}
}

View file

@ -1,6 +1,6 @@
export global Callabler {
// Bottom panel operations
callback remove_item_directories(bool, int);
callback remove_item_directories(bool);
callback added_manual_directories(bool, string);
// Right click or middle click opener

View file

@ -6,8 +6,8 @@ import {ColorPalette} from "color_palette.slint";
import {Settings} from "settings.slint";
export component IncludedDirectories {
in-out property <[IncludedDirectoriesModel]> model: Settings.included_directories_model;
in-out property <int> current_index: -1;
in-out property <[IncludedDirectoriesModel]> model <=> Settings.included_directories_model;
in-out property <int> current_index <=> Settings.included_directories_model_selected_idx;
in-out property <length> size_referenced_folder: 33px;
@ -26,21 +26,43 @@ export component IncludedDirectories {
}
}
ListView {
for data in model : Rectangle {
for r[idx] in model : Rectangle {
height: 30px;
border_radius: 5px;
width: parent.width;
background: touch-area.has-hover ? (r.selected_row ? ColorPalette.list-view-normal-selected-header : ColorPalette.list_view_normal_color) : (r.selected_row ? ColorPalette.list-view-normal-selected-header : ColorPalette.list_view_normal_color);
touch_area := TouchArea {
clicked => {
if (current_index == -1) {
r.selected_row = true;
} else {
if (current_index != idx) {
model[current_index].selected_row = false;
}
r.selected_row = true;
}
current_index = idx;
}
double-clicked => {
Callabler.item_opened(r.path);
}
}
HorizontalLayout {
spacing: 5px;
width: parent.width;
CheckBox {
checked: data.referenced_folder;
checked: r.referenced_folder;
toggled => {
model[idx].referenced_folder = self.checked;
}
width: size_referenced_folder;
}
Text {
horizontal-stretch: 1.0;
text: data.path;
text: r.path;
vertical-alignment: center;
}
}
@ -50,9 +72,8 @@ export component IncludedDirectories {
}
export component ExcludedDirectories {
in-out property <[ExcludedDirectoriesModel]> model: Settings.excluded_directories_model;
in-out property <int> current_index: -1;
private property <PointerEvent> event;
in-out property <[ExcludedDirectoriesModel]> model <=> Settings.excluded_directories_model;
in-out property <int> current_index <=> Settings.excluded_directories_model_selected_idx;
min-width: 50px;
VerticalLayout {
@ -85,9 +106,6 @@ export component ExcludedDirectories {
double-clicked => {
Callabler.item_opened(r.path);
}
pointer-event(event) => {
root.event = event;
}
}
HorizontalLayout {

View file

@ -6,7 +6,9 @@ export global Settings {
in-out property <[string]> settings_presets: ["Preset 1", "Preset 2"];
in-out property <[IncludedDirectoriesModel]> included_directories_model: [{path: "/home/path", referenced_folder: false, selected_row: false}];
in-out property <int> included_directories_model_selected_idx: -1;
in-out property <[ExcludedDirectoriesModel]> excluded_directories_model: [{path:"/home/path", selected_row: false}, {path:"/home/path", selected_row: false}];
in-out property <int> excluded_directories_model_selected_idx: -1;
// Settings
in-out property <string> excluded_items: "Excluded items";