From 7029d9aac0febf1851a880384fca6eb45d484f12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= Date: Sat, 3 Feb 2024 18:47:00 +0100 Subject: [PATCH] VD --- Cargo.lock | 323 ++++++++------------- czkawka_core/Cargo.toml | 4 +- czkawka_core/src/common_extensions.rs | 9 +- czkawka_core/src/empty_folder.rs | 2 +- czkawka_gui/Cargo.toml | 2 +- krokiet/Cargo.toml | 4 +- krokiet/src/common.rs | 40 +-- krokiet/src/connect_directories_changes.rs | 125 ++++---- krokiet/src/connect_scan.rs | 73 ++++- krokiet/src/settings.rs | 26 +- krokiet/ui/bottom_panel.slint | 4 +- krokiet/ui/callabler.slint | 2 +- krokiet/ui/included_directories.slint | 40 ++- krokiet/ui/settings.slint | 2 + 14 files changed, 330 insertions(+), 326 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bcf7392..d8879c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", diff --git a/czkawka_core/Cargo.toml b/czkawka_core/Cargo.toml index 7e41d1e..b442436 100644 --- a/czkawka_core/Cargo.toml +++ b/czkawka_core/Cargo.toml @@ -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" diff --git a/czkawka_core/src/common_extensions.rs b/czkawka_core/src/common_extensions.rs index 9704e9a..a3336e3 100644 --- a/czkawka_core/src/common_extensions.rs +++ b/czkawka_core/src/common_extensions.rs @@ -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 } diff --git a/czkawka_core/src/empty_folder.rs b/czkawka_core/src/empty_folder.rs index 0e4e1ac..89c188a 100644 --- a/czkawka_core/src/empty_folder.rs +++ b/czkawka_core/src/empty_folder.rs @@ -189,7 +189,7 @@ impl EmptyFolder { } } - let mut folder_entries: HashMap = HashMap::with_capacity(start_folder_entries.len() + new_folder_entries_list.iter().map(|e| e.len()).sum::()); + let mut folder_entries: HashMap = HashMap::with_capacity(start_folder_entries.len() + new_folder_entries_list.iter().map(Vec::len).sum::()); for fe in start_folder_entries { folder_entries.insert(fe.path.to_string_lossy().to_string(), fe); } diff --git a/czkawka_gui/Cargo.toml b/czkawka_gui/Cargo.toml index 69e0e80..697a980 100644 --- a/czkawka_gui/Cargo.toml +++ b/czkawka_gui/Cargo.toml @@ -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" diff --git a/krokiet/Cargo.toml b/krokiet/Cargo.toml index df04a35..7c895cf 100644 --- a/krokiet/Cargo.toml +++ b/krokiet/Cargo.toml @@ -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" diff --git a/krokiet/src/common.rs b/krokiet/src/common.rs index f15eee0..caf63da 100644 --- a/krokiet/src/common.rs +++ b/krokiet/src/common.rs @@ -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::>(); // ModelRc::new(VecModel::from(new_folders_standard_list_view)) // } -pub fn create_string_standard_list_view_from_pathbuf(items: &[PathBuf]) -> ModelRc { - 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::>(); - ModelRc::new(VecModel::from(new_folders_standard_list_view)) -} +// pub fn create_string_standard_list_view_from_pathbuf(items: &[PathBuf]) -> ModelRc { +// 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::>(); +// ModelRc::new(VecModel::from(new_folders_standard_list_view)) +// } -pub fn create_included_directories_model_from_pathbuf(items: &[PathBuf]) -> ModelRc { +pub fn create_included_directories_model_from_pathbuf(items: &[PathBuf], referenced: &[PathBuf]) -> ModelRc { + let referenced_as_string = referenced.iter().map(|x| x.to_string_lossy().to_string()).collect::>(); 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 { 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::>(); ModelRc::new(VecModel::from(converted)) diff --git a/krokiet/src/connect_directories_changes.rs b/krokiet/src/connect_directories_changes.rs index daf2f04..d73c6dd 100644 --- a/krokiet/src/connect_directories_changes.rs +++ b/krokiet/src/connect_directories_changes.rs @@ -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::().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::>(); - if non_empty_lines.is_empty() { + let folders = list_of_files_to_add.lines().filter(|x| !x.is_empty()).map(str::to_string).collect::>(); + if folders.is_empty() { return; } let app = a.upgrade().unwrap(); let settings = app.global::(); if included_directories { - let included_model = settings.get_included_directories_model(); - let mut included_model = included_model.iter().collect::>(); - 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::>(); - 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::().on_remove_item_directories(move |included_directories, current_index| { + app.global::().on_remove_item_directories(move |included_directories| { + let app = a.upgrade().unwrap(); + let settings = app.global::(); + + 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::(); 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::>(); 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::>(); 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::>(); let settings = app.global::(); - 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::>(); - 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::>(); - 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::>(); + let mut new_folders = old_folders.iter().collect::>(); + + let filtered_folders = folders.iter().filter(|x| !old_folders_path.contains(x)).collect::>(); + + 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::>(); + let mut new_folders = old_folders.iter().collect::>(); + + let filtered_folders = folders.iter().filter(|x| !old_folders_path.contains(x)).collect::>(); + + 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); +} diff --git a/krokiet/src/connect_scan.rs b/krokiet/src/connect_scan.rs index 53b8da2..0a32ef3 100644 --- a/krokiet/src/connect_scan.rs +++ b/krokiet/src/connect_scan.rs @@ -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, progress_sender: Sender>, messages: String, hash_size: u8) { +fn write_similar_images_results_referenced(app: &MainWindow, vector: Vec<(ImagesEntry, Vec)>, 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::().set_info_text(messages.into()); +} +fn write_similar_images_results(app: &MainWindow, vector: Vec>, 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); diff --git a/krokiet/src/settings.rs b/krokiet/src/settings.rs index 7852675..b22d9f6 100644 --- a/krokiet/src/settings.rs +++ b/krokiet/src/settings.rs @@ -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, + #[serde(default)] + pub included_directories_referenced: Vec, #[serde(default = "default_excluded_directories")] pub excluded_directories: Vec, #[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::().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::(); // 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::(); - let included_directories = settings.get_included_directories_model(); - let included_directories = included_directories.iter().map(|model| PathBuf::from(model.path.as_str())).collect::>(); + 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::>(); + let included_directories_referenced = included_directories_model + .iter() + .filter(|model| model.referenced_folder) + .map(|model| PathBuf::from(model.path.as_str())) + .collect::>(); - let excluded_directories = settings.get_excluded_directories_model(); - let excluded_directories = excluded_directories.iter().map(|model| PathBuf::from(model.path.as_str())).collect::>(); + 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::>(); 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, diff --git a/krokiet/ui/bottom_panel.slint b/krokiet/ui/bottom_panel.slint index a48cecd..3e0bd6a 100644 --- a/krokiet/ui/bottom_panel.slint +++ b/krokiet/ui/bottom_panel.slint @@ -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); } } diff --git a/krokiet/ui/callabler.slint b/krokiet/ui/callabler.slint index 3d15168..a1a82ab 100644 --- a/krokiet/ui/callabler.slint +++ b/krokiet/ui/callabler.slint @@ -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 diff --git a/krokiet/ui/included_directories.slint b/krokiet/ui/included_directories.slint index 584d7dd..6632f7d 100644 --- a/krokiet/ui/included_directories.slint +++ b/krokiet/ui/included_directories.slint @@ -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 current_index: -1; + in-out property <[IncludedDirectoriesModel]> model <=> Settings.included_directories_model; + in-out property current_index <=> Settings.included_directories_model_selected_idx; in-out property 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 current_index: -1; - private property event; + in-out property <[ExcludedDirectoriesModel]> model <=> Settings.excluded_directories_model; + in-out property 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 { diff --git a/krokiet/ui/settings.slint b/krokiet/ui/settings.slint index fd94b58..b6c18cc 100644 --- a/krokiet/ui/settings.slint +++ b/krokiet/ui/settings.slint @@ -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 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 excluded_directories_model_selected_idx: -1; // Settings in-out property excluded_items: "Excluded items";