From 3ce5d4a9678257f2d78d97ccf9671e7fcba9c849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= <41945903+qarmin@users.noreply.github.com> Date: Fri, 25 Feb 2022 18:47:25 +0100 Subject: [PATCH] Change AudioTags to lofty and support moree audio things (#590) --- .github/workflows/linux.yml | 2 +- Cargo.lock | 384 +++--- czkawka_cli/src/commands.rs | 31 +- czkawka_cli/src/main.rs | 2 + czkawka_core/Cargo.toml | 5 +- czkawka_core/src/lib.rs | 1 + czkawka_core/src/same_music.rs | 295 ++-- czkawka_gui/i18n/en/czkawka_gui.ftl | 10 +- czkawka_gui/src/compute_results.rs | 89 +- .../connect_things/connect_button_search.rs | 24 +- czkawka_gui/src/create_tree_view.rs | 41 +- czkawka_gui/src/gui_structs/gui_about.rs | 2 +- .../src/gui_structs/gui_compare_images.rs | 2 +- czkawka_gui/src/gui_structs/gui_data.rs | 2 +- .../src/gui_structs/gui_main_notebook.rs | 27 +- czkawka_gui/src/gui_structs/gui_popovers.rs | 4 +- .../src/gui_structs/gui_progress_dialog.rs | 2 +- czkawka_gui/src/gui_structs/gui_settings.rs | 2 +- czkawka_gui/src/help_functions.rs | 6 +- czkawka_gui/src/initialize_gui.rs | 8 +- czkawka_gui/src/main.rs | 1 + .../{about_dialog.glade => about_dialog.ui} | 0 ...compare_images.glade => compare_images.ui} | 0 czkawka_gui/ui/czkawka.cmb | 1207 +++++++++++++++++ .../ui/{main_window.glade => main_window.ui} | 555 ++++---- ...ght_click.glade => popover_right_click.ui} | 0 ...popover_select.glade => popover_select.ui} | 0 .../ui/{progress.glade => progress.ui} | 0 .../ui/{settings.glade => settings.ui} | 0 29 files changed, 2003 insertions(+), 699 deletions(-) rename czkawka_gui/ui/{about_dialog.glade => about_dialog.ui} (100%) rename czkawka_gui/ui/{compare_images.glade => compare_images.ui} (100%) create mode 100644 czkawka_gui/ui/czkawka.cmb rename czkawka_gui/ui/{main_window.glade => main_window.ui} (98%) rename czkawka_gui/ui/{popover_right_click.glade => popover_right_click.ui} (100%) rename czkawka_gui/ui/{popover_select.glade => popover_select.ui} (100%) rename czkawka_gui/ui/{progress.glade => progress.ui} (100%) rename czkawka_gui/ui/{settings.glade => settings.ui} (100%) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 3f6471d..00864f6 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -130,7 +130,7 @@ jobs: linux-gui: strategy: matrix: - toolchain: [ stable, 1.56.0 ] + toolchain: [ stable, 1.57.0 ] type: [ release ] runs-on: ubuntu-20.04 steps: diff --git a/Cargo.lock b/Cargo.lock index 6f4a585..5cb8844 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,9 +56,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.53" +version = "1.0.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94a45b455c14666b85fc40a019e8ab9eb75e3a124e05494f5397122bc9eb06e0" +checksum = "159bb86af3a200e19a068f4224eae4c8bb2d0fa054c7e5d1cacd5cef95e684cd" [[package]] name = "arrayref" @@ -113,30 +113,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "audiotags" -version = "0.2.7182" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b87d111118f42416bb5f13c5dd2e2d879925964702a435be711d4f78fa9ce6d8" -dependencies = [ - "audiotags-dev-macro", - "id3", - "metaflac", - "mp4ameta", - "thiserror", -] - -[[package]] -name = "audiotags-dev-macro" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b79298591161f312f06327df7963063ee07466be303dcc3084a44ec293cb36e" - [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" @@ -214,7 +195,7 @@ dependencies = [ "cc", "cfg-if 1.0.0", "constant_time_eq", - "digest 0.10.1", + "digest 0.10.3", ] [[package]] @@ -234,9 +215,9 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1d36a02058e76b040de25a4464ba1c80935655595b661505c8b39b664828b95" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" dependencies = [ "generic-array", ] @@ -288,9 +269,9 @@ dependencies = [ [[package]] name = "cairo-rs" -version = "0.15.1" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b869e97a87170f96762f9f178eae8c461147e722ba21dd8814105bf5716bf14a" +checksum = "e8b14c80d8d1a02fa6d914b9d1afeeca9bc34257f8300d9696e1e331ae114223" dependencies = [ "bitflags", "cairo-sys-rs", @@ -312,9 +293,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.72" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" dependencies = [ "jobserver", ] @@ -336,9 +317,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.9.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" +checksum = "5e068cb2806bbc15b439846dc16c5f89f8599f2c3e4d73d4449d38f9b2f0b6c5" dependencies = [ "smallvec", ] @@ -370,9 +351,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa66045b9cb23c2e9c1520732030608b02ee07e5cfaa5a521ec15ded7fa24c90" +checksum = "4cc00842eed744b858222c4c9faf7243aafc6d33f92f96935263ef4d8a41ce21" dependencies = [ "glob", "libc", @@ -465,7 +446,7 @@ dependencies = [ "ndk-glue", "nix", "oboe", - "parking_lot", + "parking_lot 0.11.2", "stdweb", "thiserror", "web-sys", @@ -483,9 +464,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2209c310e29876f7f0b2721e7e26b84aff178aa3da5d091f9bfbf47669e60e3" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if 1.0.0", ] @@ -513,9 +494,9 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97242a70df9b89a65d0b6df3c4bf5b9ce03c5b7309019777fbde37e7537f8762" +checksum = "c00d6d2ea26e8b151d99093005cb442fb9a37aeaca582a03ec70946f49ab5ed9" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -526,9 +507,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcae03edb34f947e64acdb1c33ec169824e20657e9ecb61cef6c8c74dcb8120" +checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" dependencies = [ "cfg-if 1.0.0", "lazy_static", @@ -536,11 +517,12 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d6b536309245c849479fba3da410962a43ed8e51c26b729208ec0ac2798d0" +checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" dependencies = [ "generic-array", + "typenum", ] [[package]] @@ -566,7 +548,6 @@ dependencies = [ name = "czkawka_core" version = "4.0.0" dependencies = [ - "audiotags", "bincode", "bitflags", "bk-tree", @@ -583,6 +564,7 @@ dependencies = [ "image", "imagepipe", "img_hash", + "lofty", "once_cell", "rawloader", "rayon", @@ -659,12 +641,13 @@ dependencies = [ [[package]] name = "dashmap" -version = "4.0.2" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" +checksum = "c0834a35a3fce649144119e18da2a4d8ed12ef3862f47183fd46f625d072d96c" dependencies = [ "cfg-if 1.0.0", "num_cpus", + "parking_lot 0.12.0", ] [[package]] @@ -688,13 +671,12 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b697d66081d42af4fba142d56918a3cb21dc8eb63372c6b85d14f44fb9c5979b" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" dependencies = [ - "block-buffer 0.10.0", + "block-buffer 0.10.2", "crypto-common", - "generic-array", "subtle", ] @@ -747,15 +729,16 @@ dependencies = [ [[package]] name = "ffmpeg_cmdline_utils" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f156b1f5ba5f16135ec1efd32d9f90d0dad3ef8f8b77ca9928d4d0e3b24dd41" +checksum = "b5cab6fb4997f82b6cb54ee905df6a4b954365ee01985f7a4e13cbc305923085" dependencies = [ "image", "rayon", "serde", "serde_json", "thiserror", + "winapi", ] [[package]] @@ -847,9 +830,9 @@ checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" [[package]] name = "futures" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28560757fe2bb34e79f907794bb6b22ae8b0e5c669b638a1132f2592b19035b4" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" dependencies = [ "futures-channel", "futures-core", @@ -862,9 +845,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" dependencies = [ "futures-core", "futures-sink", @@ -872,15 +855,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" [[package]] name = "futures-executor" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29d6d2ff5bb10fb95c85b8ce46538a2e5f5e7fdc755623a7d4529ab8a4ed9d2a" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" dependencies = [ "futures-core", "futures-task", @@ -889,15 +872,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f9d34af5a1aac6fb380f735fe510746c38067c5bf16c7fd250280503c971b2" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" [[package]] name = "futures-macro" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbd947adfffb0efc70599b3ddcf7b5597bb5fa9e245eb99f62b3a5f7bb8bd3c" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" dependencies = [ "proc-macro2", "quote", @@ -906,21 +889,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3055baccb68d74ff6480350f8d6eb8fcfa3aa11bdc1a1ae3afdd0514617d508" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" [[package]] name = "futures-task" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ee7c6485c30167ce4dfb83ac568a849fe53274c831081476ee13e0dce1aad72" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" [[package]] name = "futures-util" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" dependencies = [ "futures-channel", "futures-core", @@ -936,9 +919,9 @@ dependencies = [ [[package]] name = "gdk" -version = "0.15.2" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614258e81ec35ed8770e64a0838f3a47f95b398bc51e724d3b3fa09c1ee0f8d5" +checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" dependencies = [ "bitflags", "cairo-rs", @@ -952,9 +935,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.15.4" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73aa2f5de1b45710da90a55863276667dc3a3264aaf6a2aeace62bb015244d49" +checksum = "d8750501d75f318c2ec0314701bc8403901303210def80bafd13f6b6059a3f45" dependencies = [ "bitflags", "gdk-pixbuf-sys", @@ -1005,9 +988,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" +checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" dependencies = [ "cfg-if 1.0.0", "libc", @@ -1026,9 +1009,9 @@ dependencies = [ [[package]] name = "gio" -version = "0.15.4" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f906022fe89505b4e7b6c59a62d4ca3c090904f286cf61f1b245afcb20897d" +checksum = "96efd8a1c00d890f6b45671916e165b5e43ccec61957d443aff6d7e44f62d348" dependencies = [ "bitflags", "futures-channel", @@ -1043,9 +1026,9 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.15.4" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97225e1b9c7c48ed7fec4377fdc72702965bfbfd3a944b928ccbb5d8ed82ccc9" +checksum = "1d0fa5052773f5a56b8ae47dab09d040f5d9ce1311f4f99006e16e9a08269296" dependencies = [ "glib-sys", "gobject-sys", @@ -1056,9 +1039,9 @@ dependencies = [ [[package]] name = "glib" -version = "0.15.4" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e385b6c17a1add7d0fbc64d38e2e742346d3e8b22e5fa3734e5cdca2be24028d" +checksum = "aa570813c504bdf7539a9400180c2dd4b789a819556fb86da7226d7d1b037b49" dependencies = [ "bitflags", "futures-channel", @@ -1076,9 +1059,9 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.15.3" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e58b262ff65ef771003873cea8c10e0fe854f1c508d48d62a4111a1ff163f7d1" +checksum = "41bfd8d227dead0829ac142454e97531b93f576d0805d779c42bfd799c65c572" dependencies = [ "anyhow", "heck 0.4.0", @@ -1091,9 +1074,9 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.15.4" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4f08dd67f74b223fedbbb30e73145b9acd444e67cc4d77d0598659b7eebe7e" +checksum = "f4366377bd56697de8aaee24e673c575d2694d72e7756324ded2b0428829a7b8" dependencies = [ "libc", "system-deps", @@ -1107,9 +1090,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "gobject-sys" -version = "0.15.1" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb1f0b3e4c08e2a0a490d1082ba9e902cdff8ff07091e85c6caec60d17e2ab" +checksum = "df6859463843c20cf3837e3a9069b6ab2051aeeadf4c899d33344f4aea83189a" dependencies = [ "glib-sys", "libc", @@ -1118,9 +1101,9 @@ dependencies = [ [[package]] name = "gtk" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7978eaec05bea63947c801d29a21372f2ed39aec0bf56bf7725d3599094675e" +checksum = "5f2d1326b36af927fe46ae2f89a8fec38c6f0d279ebc5ef07ffeeabb70300bfc" dependencies = [ "atk", "bitflags", @@ -1159,9 +1142,9 @@ dependencies = [ [[package]] name = "gtk3-macros" -version = "0.15.1" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c891188af69e77a1e8a0b1746fbd03b9b396e7d34d518c5331b15950259f541" +checksum = "24f518afe90c23fba585b2d7697856f9e6a7bbc62f65588035e66f6afb01a2e9" dependencies = [ "anyhow", "proc-macro-crate", @@ -1207,12 +1190,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - [[package]] name = "hound" version = "3.4.0" @@ -1241,9 +1218,9 @@ dependencies = [ [[package]] name = "i18n-embed" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39a0b4598fcd199eb5da38f70ece82903b178ad638839661c00612719bcfc0ad" +checksum = "e7f21ed76e44de8ac3dfa36bb37ab2e6480be0dc75c612474949be1f3cb2c253" dependencies = [ "fluent", "fluent-langneg", @@ -1253,7 +1230,7 @@ dependencies = [ "lazy_static", "locale_config", "log", - "parking_lot", + "parking_lot 0.12.0", "rust-embed", "thiserror", "unic-langid", @@ -1262,9 +1239,9 @@ dependencies = [ [[package]] name = "i18n-embed-fl" -version = "0.6.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c1d347d2f7f9f2f977385b43b204d59ebeb1b2f93ce73cd23622df2d2da1033" +checksum = "9420a9718ef9d0ab727840a398e25408ea0daff9ba3c681707ba05485face98e" dependencies = [ "dashmap", "find-crate", @@ -1294,17 +1271,6 @@ dependencies = [ "syn", ] -[[package]] -name = "id3" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cb37ae5aa60d57c5f3412df1f3e5a48a978804f4a7e70700bb5f97e8f1a6331" -dependencies = [ - "bitflags", - "byteorder", - "flate2", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -1479,9 +1445,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.116" +version = "0.2.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "565dbd88872dbe4cc8a46e527f26483c1d1f7afa6b884a3bd6cd893d4f98da74" +checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" [[package]] name = "libloading" @@ -1521,6 +1487,21 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "lofty" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b6eb70e6fb8ce11f97426232b74ada51c246d4c611cd0e1f960cf31503ebad" +dependencies = [ + "base64", + "byteorder", + "cfg-if 1.0.0", + "flate2", + "ogg_pager", + "once_cell", + "paste", +] + [[package]] name = "log" version = "0.4.14" @@ -1563,17 +1544,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "metaflac" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1470d3cc1bb0d692af5eb3afb594330b8ba09fd91c32c4e1c6322172a5ba750" -dependencies = [ - "byteorder", - "hex", - "log", -] - [[package]] name = "minimp3" version = "0.5.1" @@ -1613,22 +1583,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "mp4ameta" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ef7a2ba51feaa9e7be2209b6e5d7472d08427ef0ce88616ed93c66dae9601b2" -dependencies = [ - "lazy_static", - "mp4ameta_proc", -] - -[[package]] -name = "mp4ameta_proc" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ae83441f6b67e3b7f009295618e90f03228b0f1a149f56ee8cd0f6bb5602c5" - [[package]] name = "multicache" version = "0.6.1" @@ -1652,15 +1606,22 @@ dependencies = [ ] [[package]] -name = "ndk-glue" -version = "0.6.0" +name = "ndk-context" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04c0d14b0858eb9962a5dac30b809b19f19da7e4547d64af2b0bb051d2e55d79" +checksum = "4e3c5cc68637e21fe8f077f6a1c9e0b9ca495bb74895226b476310f613325884" + +[[package]] +name = "ndk-glue" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9ffb7443daba48349d545028777ca98853b018b4c16624aa01223bc29e078da" dependencies = [ "lazy_static", "libc", "log", "ndk", + "ndk-context", "ndk-macro", "ndk-sys", ] @@ -1873,6 +1834,15 @@ dependencies = [ "byteorder", ] +[[package]] +name = "ogg_pager" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4507172566b8e1b4d4e3da7f33453055a223fdcf96bc7c5e5d67168f1c4b241b" +dependencies = [ + "byteorder", +] + [[package]] name = "once_cell" version = "1.9.0" @@ -1887,9 +1857,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "open" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176ee4b630d174d2da8241336763bb459281dddc0f4d87f72c3b1efc9a6109b7" +checksum = "5a82915836ef43159bb6a3c64d884c42329ccd0b8afdca737cf1e3dd701709dc" dependencies = [ "pathdiff", "winapi", @@ -1897,9 +1867,9 @@ dependencies = [ [[package]] name = "pango" -version = "0.15.2" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79211eff430c29cc38c69e0ab54bc78fa1568121ca9737707eee7f92a8417a94" +checksum = "78c7420fc01a390ec200da7395b64d705f5d82fe03e5d0708aee422c46538be7" dependencies = [ "bitflags", "glib", @@ -1928,7 +1898,17 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core", + "parking_lot_core 0.8.5", +] + +[[package]] +name = "parking_lot" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.1", ] [[package]] @@ -1945,6 +1925,25 @@ dependencies = [ "winapi", ] +[[package]] +name = "parking_lot_core" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] +name = "paste" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5" + [[package]] name = "pathdiff" version = "0.2.1" @@ -2013,9 +2012,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.1.0" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" dependencies = [ "thiserror", "toml", @@ -2065,14 +2064,13 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", - "rand_hc", ] [[package]] @@ -2094,15 +2092,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core", -] - [[package]] name = "rawloader" version = "0.37.0" @@ -2190,9 +2179,9 @@ dependencies = [ [[package]] name = "rodio" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d98f5e557b61525057e2bc142c8cd7f0e70d75dc32852309bec440e6e046bf9" +checksum = "ec0939e9f626e6c6f1989adb6226a039c855ca483053f0ee7c98b90e41cf731e" dependencies = [ "claxon", "cpal", @@ -2368,9 +2357,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085" +checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" dependencies = [ "itoa", "ryu", @@ -2498,9 +2487,9 @@ dependencies = [ [[package]] name = "system-deps" -version = "6.0.1" +version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad3a97fdef3daf935d929b3e97e5a6a680cd4622e40c2941ca0875d6566416f8" +checksum = "a1a45a1c4c9015217e12347f2a411b57ce2c4fc543913b14b6fe40483328e709" dependencies = [ "cfg-expr", "heck 0.4.0", @@ -2677,9 +2666,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" [[package]] name = "unicode-width" @@ -2847,10 +2836,53 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "xxhash-rust" -version = "0.8.2" +name = "windows-sys" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575e15bedf6e57b5c2d763ffc6c3c760143466cbd09d762d539680ab5992ded" +checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" + +[[package]] +name = "windows_i686_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" + +[[package]] +name = "windows_i686_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" + +[[package]] +name = "xxhash-rust" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "886f21441c6731b9e06a9fdacbc5e29319c17a4069c2a511d80349874864702d" [[package]] name = "yaml-rust" diff --git a/czkawka_cli/src/commands.rs b/czkawka_cli/src/commands.rs index c5f9e02..994bf5b 100644 --- a/czkawka_cli/src/commands.rs +++ b/czkawka_cli/src/commands.rs @@ -141,7 +141,7 @@ pub enum Commands { excluded_items: ExcludedItems, // #[structopt(short = "D", long, help = "Delete found files")] // delete_files: bool, TODO - #[structopt(short = "z", long, default_value = "artist,title", parse(try_from_str = parse_music_duplicate_type), help = "Search method (title, artist, album_title, album_artist, year)", long_help = "Sets which rows must be equal to set this files as duplicates(may be mixed, but must be divided by commas).")] + #[structopt(short = "z", long, default_value = "track_title,track_artist", parse(try_from_str = parse_music_duplicate_type), help = "Search method (track_title,track_artist,year,bitrate,genre,length))", long_help = "Sets which rows must be equal to set this files as duplicates(may be mixed, but must be divided by commas).")] music_similarity: MusicSimilarity, #[structopt(flatten)] file_to_save: FileToSave, @@ -414,26 +414,29 @@ fn parse_music_duplicate_type(src: &str) -> Result { let mut similarity: MusicSimilarity = MusicSimilarity::NONE; - let parts: Vec<&str> = src.split(',').collect(); + let parts: Vec = src.split(',').map(|e| e.to_lowercase().replace('_', "")).collect(); - if parts.iter().any(|e| e.to_lowercase().contains("title") && !e.to_lowercase().contains("album")) { - similarity |= MusicSimilarity::TITLE; + if parts.iter().any(|e| e.contains("tracktitle")) { + similarity |= MusicSimilarity::TRACK_TITLE; } - if parts.iter().any(|e| e.to_lowercase().contains("artist") && !e.to_lowercase().contains("album")) { - similarity |= MusicSimilarity::ARTIST; + if parts.iter().any(|e| e.contains("trackartist")) { + similarity |= MusicSimilarity::TRACK_ARTIST; } - if parts.iter().any(|e| e.to_lowercase().contains("title") && e.to_lowercase().contains("album")) { - similarity |= MusicSimilarity::ALBUM_TITLE; - } - if parts.iter().any(|e| e.to_lowercase().contains("artist") && e.to_lowercase().contains("album")) { - similarity |= MusicSimilarity::ALBUM_ARTIST; - } - if parts.iter().any(|e| e.to_lowercase().contains("year")) { + if parts.iter().any(|e| e.contains("year")) { similarity |= MusicSimilarity::YEAR; } + if parts.iter().any(|e| e.contains("bitrate")) { + similarity |= MusicSimilarity::BITRATE; + } + if parts.iter().any(|e| e.contains("genre")) { + similarity |= MusicSimilarity::GENRE; + } + if parts.iter().any(|e| e.contains("length")) { + similarity |= MusicSimilarity::LENGTH; + } if similarity == MusicSimilarity::NONE { - return Err("Couldn't parse the music search method (allowed: title,artist,album_title,album_artist,year)".to_string()); + return Err("Couldn't parse the music search method (allowed: track_title,track_artist,year,bitrate,genre,length)".to_string()); } Ok(similarity) diff --git a/czkawka_cli/src/main.rs b/czkawka_cli/src/main.rs index 5a951da..69b609d 100644 --- a/czkawka_cli/src/main.rs +++ b/czkawka_cli/src/main.rs @@ -1,3 +1,5 @@ +#![allow(clippy::needless_late_init)] + use std::process; use structopt::StructOpt; diff --git a/czkawka_core/Cargo.toml b/czkawka_core/Cargo.toml index 9bda505..d438b55 100644 --- a/czkawka_core/Cargo.toml +++ b/czkawka_core/Cargo.toml @@ -25,14 +25,14 @@ hamming = "0.1.3" # Needed by same music bitflags = "1.3.2" -audiotags = "0.2.7182" +lofty="0.5.0" # Futures - needed by async progress sender futures = "0.3.19" # Needed by broken files zip = "0.5.13" -rodio = { version = "0.14.0", optional = true } +rodio = { version = "0.15.0", optional = true } # Hashes for duplicate files blake3 = "1.2.0" @@ -60,6 +60,7 @@ once_cell = "1.9.0" rawloader = "0.37.0" imagepipe = "0.4.0" + [features] default = [] diff --git a/czkawka_core/src/lib.rs b/czkawka_core/src/lib.rs index e3be126..8de40ea 100644 --- a/czkawka_core/src/lib.rs +++ b/czkawka_core/src/lib.rs @@ -1,5 +1,6 @@ #![allow(clippy::collapsible_else_if)] #![allow(clippy::type_complexity)] +#![allow(clippy::needless_late_init)] #[macro_use] extern crate bitflags; diff --git a/czkawka_core/src/same_music.rs b/czkawka_core/src/same_music.rs index 533837e..c6946ae 100644 --- a/czkawka_core/src/same_music.rs +++ b/czkawka_core/src/same_music.rs @@ -9,8 +9,8 @@ use std::thread::sleep; use std::time::{Duration, SystemTime}; use std::{mem, thread}; -use audiotags::Tag; use crossbeam_channel::Receiver; +use lofty::{read_from_path, ItemKey}; use rayon::prelude::*; use serde::{Deserialize, Serialize}; @@ -33,14 +33,12 @@ bitflags! { pub struct MusicSimilarity : u32 { const NONE = 0; - const TITLE = 0b1; - const ARTIST = 0b10; - - const ALBUM_TITLE = 0b100; - const ALBUM_ARTIST = 0b1000; - - const YEAR = 0b10000; - // const Time = 0b100000; + const TRACK_TITLE = 0b1; + const TRACK_ARTIST = 0b10; + const YEAR = 0b100; + const LENGTH = 0b1000; + const GENRE = 0b10000; + const BITRATE = 0b100000; } } @@ -51,14 +49,12 @@ pub struct MusicEntry { pub path: PathBuf, pub modified_date: u64, - pub title: String, - pub artist: String, - - pub album_title: String, - pub album_artist: String, - - pub year: i32, - // pub time: u32, + pub track_title: String, + pub track_artist: String, + pub year: String, + pub length: String, + pub genre: String, + pub bitrate: u32, } impl FileEntry { @@ -68,12 +64,12 @@ impl FileEntry { path: self.path.clone(), modified_date: self.modified_date, - title: "".to_string(), - - artist: "".to_string(), - album_title: "".to_string(), - album_artist: "".to_string(), - year: 0, + track_title: "".to_string(), + track_artist: "".to_string(), + year: "".to_string(), + length: "".to_string(), + genre: "".to_string(), + bitrate: 0, } } } @@ -133,7 +129,7 @@ impl SameMusic { duplicated_music_entries: vec![], music_to_check: Default::default(), approximate_comparison: true, - use_cache: true, + use_cache: false, delete_outdated_cache: true, use_reference_folders: false, duplicated_music_entries_referenced: vec![], @@ -361,28 +357,52 @@ impl SameMusic { return None; } - let tag = match Tag::new().read_from_path(&path) { + let tagged_file = match read_from_path(&path, true) { Ok(t) => t, - Err(_inspected) => return Some(Some(music_entry)), // Data not in utf-8, etc., TODO this should be probably added to warnings, errors + Err(_inspected) => { + // println!("Failed to open {}", path); + return Some(Some(music_entry)); + } }; - music_entry.title = match tag.title() { - Some(t) => t.to_string(), - None => "".to_string(), + let properties = tagged_file.properties(); + + let tag = match tagged_file.primary_tag() { + Some(t) => t, + None => { + // println!("File {} don't have valid tag", path); + return Some(Some(music_entry)); + } }; - music_entry.artist = match tag.artist() { - Some(t) => t.to_string(), - None => "".to_string(), - }; - music_entry.album_title = match tag.album_title() { - Some(t) => t.to_string(), - None => "".to_string(), - }; - music_entry.album_artist = match tag.album_artist() { - Some(t) => t.to_string(), - None => "".to_string(), - }; - music_entry.year = tag.year().unwrap_or(0); + + // println!("{:?}", tag.items()); + + let track_title = tag.get_string(&ItemKey::TrackTitle).unwrap_or("").to_string(); + let track_artist = tag.get_string(&ItemKey::TrackArtist).unwrap_or("").to_string(); + let year = tag.get_string(&ItemKey::Year).unwrap_or("").to_string(); + let mut length = tag.get_string(&ItemKey::Length).unwrap_or("").to_string(); + let genre = tag.get_string(&ItemKey::Genre).unwrap_or("").to_string(); + let bitrate = properties.audio_bitrate().unwrap_or(0); + + if let Ok(mut length_number) = length.parse::() { + length_number /= 60; + let minutes = length_number / 1000; + let seconds = (length_number % 1000) * 6 / 100; + if minutes != 0 && seconds != 0 { + length = format!("{}:{:02}", minutes, seconds); + } else { + length = "".to_string(); + } + } else { + length = "".to_string(); + } + + music_entry.track_title = track_title; + music_entry.track_artist = track_artist; + music_entry.year = year; + music_entry.length = length; + music_entry.genre = genre; + music_entry.bitrate = bitrate; Some(Some(music_entry)) }) @@ -460,7 +480,7 @@ impl SameMusic { let mut old_duplicates: Vec> = vec![self.music_entries.clone()]; let mut new_duplicates: Vec> = Vec::new(); - if (self.music_similarity & MusicSimilarity::TITLE) == MusicSimilarity::TITLE { + if (self.music_similarity & MusicSimilarity::TRACK_TITLE) == MusicSimilarity::TRACK_TITLE { for vec_file_entry in old_duplicates { atomic_file_counter.fetch_add(1, Ordering::Relaxed); if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { @@ -471,13 +491,13 @@ impl SameMusic { } let mut hash_map: BTreeMap> = Default::default(); for file_entry in vec_file_entry { - let mut title = file_entry.title.to_lowercase().trim().to_string(); + let mut thing = file_entry.track_title.to_lowercase().trim().to_string(); if self.approximate_comparison { - get_approximate_conversion(&mut title); + get_approximate_conversion(&mut thing); } - if !title.is_empty() { - hash_map.entry(title.clone()).or_insert_with(Vec::new); - hash_map.get_mut(title.as_str()).unwrap().push(file_entry); + if !thing.is_empty() { + hash_map.entry(thing.clone()).or_insert_with(Vec::new); + hash_map.get_mut(thing.as_str()).unwrap().push(file_entry); } } for (_title, vec_file_entry) in hash_map { @@ -489,8 +509,7 @@ impl SameMusic { old_duplicates = new_duplicates; new_duplicates = Vec::new(); } - - if (self.music_similarity & MusicSimilarity::ARTIST) == MusicSimilarity::ARTIST { + if (self.music_similarity & MusicSimilarity::TRACK_ARTIST) == MusicSimilarity::TRACK_ARTIST { for vec_file_entry in old_duplicates { atomic_file_counter.fetch_add(1, Ordering::Relaxed); if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { @@ -501,16 +520,16 @@ impl SameMusic { } let mut hash_map: BTreeMap> = Default::default(); for file_entry in vec_file_entry { - let mut artist = file_entry.artist.to_lowercase().trim().to_string(); + let mut thing = file_entry.track_artist.to_lowercase().trim().to_string(); if self.approximate_comparison { - get_approximate_conversion(&mut artist); + get_approximate_conversion(&mut thing); } - if !artist.is_empty() { - hash_map.entry(artist.clone()).or_insert_with(Vec::new); - hash_map.get_mut(artist.as_str()).unwrap().push(file_entry); + if !thing.is_empty() { + hash_map.entry(thing.clone()).or_insert_with(Vec::new); + hash_map.get_mut(thing.as_str()).unwrap().push(file_entry); } } - for (_artist, vec_file_entry) in hash_map { + for (_title, vec_file_entry) in hash_map { if vec_file_entry.len() > 1 { new_duplicates.push(vec_file_entry); } @@ -519,67 +538,6 @@ impl SameMusic { old_duplicates = new_duplicates; new_duplicates = Vec::new(); } - - if (self.music_similarity & MusicSimilarity::ALBUM_TITLE) == MusicSimilarity::ALBUM_TITLE { - for vec_file_entry in old_duplicates { - atomic_file_counter.fetch_add(1, Ordering::Relaxed); - if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { - // End thread which send info to gui - progress_thread_run.store(false, Ordering::Relaxed); - progress_thread_handle.join().unwrap(); - return false; - } - let mut hash_map: BTreeMap> = Default::default(); - for file_entry in vec_file_entry { - let mut album_title = file_entry.album_title.to_lowercase().trim().to_string(); - if self.approximate_comparison { - get_approximate_conversion(&mut album_title); - } - if !album_title.is_empty() { - hash_map.entry(album_title.clone()).or_insert_with(Vec::new); - hash_map.get_mut(album_title.as_str()).unwrap().push(file_entry); - } - } - for (_album_title, vec_file_entry) in hash_map { - if vec_file_entry.len() > 1 { - new_duplicates.push(vec_file_entry); - } - } - } - old_duplicates = new_duplicates; - new_duplicates = Vec::new(); - } - - if (self.music_similarity & MusicSimilarity::ALBUM_ARTIST) == MusicSimilarity::ALBUM_ARTIST { - for vec_file_entry in old_duplicates { - atomic_file_counter.fetch_add(1, Ordering::Relaxed); - if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { - // End thread which send info to gui - progress_thread_run.store(false, Ordering::Relaxed); - progress_thread_handle.join().unwrap(); - return false; - } - let mut hash_map: BTreeMap> = Default::default(); - for file_entry in vec_file_entry { - let mut album_artist = file_entry.album_artist.to_lowercase().trim().to_string(); - if self.approximate_comparison { - get_approximate_conversion(&mut album_artist); - } - if !album_artist.is_empty() { - hash_map.entry(album_artist.clone()).or_insert_with(Vec::new); - hash_map.get_mut(album_artist.as_str()).unwrap().push(file_entry); - } - } - for (_album_artist, vec_file_entry) in hash_map { - if vec_file_entry.len() > 1 { - new_duplicates.push(vec_file_entry); - } - } - } - old_duplicates = new_duplicates; - new_duplicates = Vec::new(); - } - if (self.music_similarity & MusicSimilarity::YEAR) == MusicSimilarity::YEAR { for vec_file_entry in old_duplicates { atomic_file_counter.fetch_add(1, Ordering::Relaxed); @@ -589,15 +547,95 @@ impl SameMusic { progress_thread_handle.join().unwrap(); return false; } - let mut hash_map: BTreeMap> = Default::default(); + let mut hash_map: BTreeMap> = Default::default(); for file_entry in vec_file_entry { - let year = file_entry.year; - if year != 0 { - hash_map.entry(year).or_insert_with(Vec::new); - hash_map.get_mut(&year).unwrap().push(file_entry); + let thing = file_entry.year.to_lowercase().trim().to_string(); + if !thing.is_empty() { + hash_map.entry(thing.clone()).or_insert_with(Vec::new); + hash_map.get_mut(thing.as_str()).unwrap().push(file_entry); } } - for (_year, vec_file_entry) in hash_map { + for (_title, vec_file_entry) in hash_map { + if vec_file_entry.len() > 1 { + new_duplicates.push(vec_file_entry); + } + } + } + old_duplicates = new_duplicates; + new_duplicates = Vec::new(); + } + if (self.music_similarity & MusicSimilarity::LENGTH) == MusicSimilarity::LENGTH { + for vec_file_entry in old_duplicates { + atomic_file_counter.fetch_add(1, Ordering::Relaxed); + if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { + // End thread which send info to gui + progress_thread_run.store(false, Ordering::Relaxed); + progress_thread_handle.join().unwrap(); + return false; + } + let mut hash_map: BTreeMap> = Default::default(); + for file_entry in vec_file_entry { + let thing = file_entry.length.to_lowercase().trim().to_string(); + if !thing.is_empty() { + hash_map.entry(thing.clone()).or_insert_with(Vec::new); + hash_map.get_mut(thing.as_str()).unwrap().push(file_entry); + } + } + for (_title, vec_file_entry) in hash_map { + if vec_file_entry.len() > 1 { + new_duplicates.push(vec_file_entry); + } + } + } + old_duplicates = new_duplicates; + new_duplicates = Vec::new(); + } + if (self.music_similarity & MusicSimilarity::GENRE) == MusicSimilarity::GENRE { + for vec_file_entry in old_duplicates { + atomic_file_counter.fetch_add(1, Ordering::Relaxed); + if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { + // End thread which send info to gui + progress_thread_run.store(false, Ordering::Relaxed); + progress_thread_handle.join().unwrap(); + return false; + } + let mut hash_map: BTreeMap> = Default::default(); + for file_entry in vec_file_entry { + let thing = file_entry.genre.to_lowercase().trim().to_string(); + if !thing.is_empty() { + hash_map.entry(thing.clone()).or_insert_with(Vec::new); + hash_map.get_mut(thing.as_str()).unwrap().push(file_entry); + } + } + for (_title, vec_file_entry) in hash_map { + if vec_file_entry.len() > 1 { + new_duplicates.push(vec_file_entry); + } + } + } + old_duplicates = new_duplicates; + new_duplicates = Vec::new(); + } + if (self.music_similarity & MusicSimilarity::BITRATE) == MusicSimilarity::BITRATE { + for vec_file_entry in old_duplicates { + atomic_file_counter.fetch_add(1, Ordering::Relaxed); + if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { + // End thread which send info to gui + progress_thread_run.store(false, Ordering::Relaxed); + progress_thread_handle.join().unwrap(); + return false; + } + let mut hash_map: BTreeMap> = Default::default(); + for file_entry in vec_file_entry { + if file_entry.bitrate != 0 { + let thing = file_entry.bitrate.to_string(); + if !thing.is_empty() { + hash_map.entry(thing.clone()).or_insert_with(Vec::new); + hash_map.get_mut(thing.as_str()).unwrap().push(file_entry); + } + } + } + for (_title, vec_file_entry) in hash_map { if vec_file_entry.len() > 1 { new_duplicates.push(vec_file_entry); } @@ -841,12 +879,13 @@ impl PrintResults for SameMusic { for vec_file_entry in self.duplicated_music_entries.iter() { for file_entry in vec_file_entry { println!( - "T: {} - A: {} - Y: {} - AT: {} - AA: {} - P: {}", - file_entry.title, - file_entry.artist, + "TT: {} - TA: {} - Y: {} - L: {} - G: {} - B: {} - P: {}", + file_entry.track_title, + file_entry.track_artist, file_entry.year, - file_entry.album_title, - file_entry.album_artist, + file_entry.length, + file_entry.genre, + file_entry.bitrate, file_entry.path.display() ); } diff --git a/czkawka_gui/i18n/en/czkawka_gui.ftl b/czkawka_gui/i18n/en/czkawka_gui.ftl index 517fb4d..5942841 100644 --- a/czkawka_gui/i18n/en/czkawka_gui.ftl +++ b/czkawka_gui/i18n/en/czkawka_gui.ftl @@ -11,9 +11,10 @@ general_close_button = Close # Main window music_title_checkbox = Title music_artist_checkbox = Artist -music_album_title_checkbox = Album Title -music_album_artist_checkbox = Album Artist music_year_checkbox = Year +music_bitrate_checkbox = Bitrate +music_genre_checkbox = Genre +music_length_checkbox = Length music_comparison_checkbox = Approximate Comparison music_comparison_checkbox_tooltip = @@ -83,8 +84,9 @@ main_tree_view_column_dimensions = Dimensions main_tree_view_column_title = Title main_tree_view_column_artist = Artist main_tree_view_column_year = Year -main_tree_view_column_album_title = Album Title -main_tree_view_column_album_artist = Album Artist +main_tree_view_column_bitrate = Bitrate +main_tree_view_column_length = Length +main_tree_view_column_genre = Genre main_tree_view_column_symlink_file_name = Symlink File Name main_tree_view_column_symlink_folder = Symlnik Folder main_tree_view_column_destination_path = Destination Path diff --git a/czkawka_gui/src/compute_results.rs b/czkawka_gui/src/compute_results.rs index 56ef101..417dd20 100644 --- a/czkawka_gui/src/compute_results.rs +++ b/czkawka_gui/src/compute_results.rs @@ -1168,11 +1168,12 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< let music_similarity = *mf.get_music_similarity(); - let is_title = (MusicSimilarity::TITLE & music_similarity) != MusicSimilarity::NONE; - let is_artist = (MusicSimilarity::ARTIST & music_similarity) != MusicSimilarity::NONE; - let is_album_title = (MusicSimilarity::ALBUM_TITLE & music_similarity) != MusicSimilarity::NONE; - let is_album_artist = (MusicSimilarity::ALBUM_ARTIST & music_similarity) != MusicSimilarity::NONE; + let is_track_title = (MusicSimilarity::TRACK_TITLE & music_similarity) != MusicSimilarity::NONE; + let is_track_artist = (MusicSimilarity::TRACK_ARTIST & music_similarity) != MusicSimilarity::NONE; let is_year = (MusicSimilarity::YEAR & music_similarity) != MusicSimilarity::NONE; + let is_bitrate = (MusicSimilarity::BITRATE & music_similarity) != MusicSimilarity::NONE; + let is_length = (MusicSimilarity::LENGTH & music_similarity) != MusicSimilarity::NONE; + let is_genre = (MusicSimilarity::GENRE & music_similarity) != MusicSimilarity::NONE; if mf.get_use_reference() { let vector = mf.get_similar_music_referenced(); @@ -1191,18 +1192,20 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< }; let (directory, file) = split_path(&base_file_entry.path); - let values: [(u32, &dyn ToValue); 15] = [ + let values: [(u32, &dyn ToValue); 17] = [ (ColumnsSameMusic::ActivatableSelectButton as u32, &false), (ColumnsSameMusic::SelectionButton as u32, &false), (ColumnsSameMusic::Size as u32, &base_file_entry.size.file_size(options::BINARY).unwrap()), (ColumnsSameMusic::SizeAsBytes as u32, &base_file_entry.size), (ColumnsSameMusic::Name as u32, &file), (ColumnsSameMusic::Path as u32, &directory), - (ColumnsSameMusic::Title as u32, &base_file_entry.title), - (ColumnsSameMusic::Artist as u32, &base_file_entry.artist), - (ColumnsSameMusic::AlbumTitle as u32, &base_file_entry.album_title), - (ColumnsSameMusic::AlbumArtist as u32, &base_file_entry.album_artist), + (ColumnsSameMusic::Title as u32, &base_file_entry.track_title), + (ColumnsSameMusic::Artist as u32, &base_file_entry.track_artist), (ColumnsSameMusic::Year as u32, &base_file_entry.year.to_string()), + (ColumnsSameMusic::Genre as u32, &base_file_entry.genre), + (ColumnsSameMusic::Bitrate as u32, &(format!("{} kbps", base_file_entry.bitrate))), + (ColumnsSameMusic::BitrateAsNumber as u32, &(base_file_entry.bitrate)), + (ColumnsSameMusic::Length as u32, &base_file_entry.length), ( ColumnsSameMusic::Modification as u32, &(NaiveDateTime::from_timestamp(base_file_entry.modified_date as i64, 0).to_string()), @@ -1214,18 +1217,20 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< list_store.set(&list_store.append(), &values); for file_entry in vec_file_entry { let (directory, file) = split_path(&file_entry.path); - let values: [(u32, &dyn ToValue); 15] = [ + let values: [(u32, &dyn ToValue); 17] = [ (ColumnsSameMusic::ActivatableSelectButton as u32, &true), (ColumnsSameMusic::SelectionButton as u32, &false), (ColumnsSameMusic::Size as u32, &file_entry.size.file_size(options::BINARY).unwrap()), (ColumnsSameMusic::SizeAsBytes as u32, &file_entry.size), (ColumnsSameMusic::Name as u32, &file), (ColumnsSameMusic::Path as u32, &directory), - (ColumnsSameMusic::Title as u32, &file_entry.title), - (ColumnsSameMusic::Artist as u32, &file_entry.artist), - (ColumnsSameMusic::AlbumTitle as u32, &file_entry.album_title), - (ColumnsSameMusic::AlbumArtist as u32, &file_entry.album_artist), - (ColumnsSameMusic::Year as u32, &file_entry.year.to_string()), + (ColumnsSameMusic::Title as u32, &base_file_entry.track_title), + (ColumnsSameMusic::Artist as u32, &base_file_entry.track_artist), + (ColumnsSameMusic::Year as u32, &base_file_entry.year.to_string()), + (ColumnsSameMusic::Genre as u32, &base_file_entry.genre), + (ColumnsSameMusic::Bitrate as u32, &(format!("{} kbps", base_file_entry.bitrate))), + (ColumnsSameMusic::BitrateAsNumber as u32, &(base_file_entry.bitrate)), + (ColumnsSameMusic::Length as u32, &base_file_entry.length), ( ColumnsSameMusic::Modification as u32, &(NaiveDateTime::from_timestamp(file_entry.modified_date as i64, 0).to_string()), @@ -1255,7 +1260,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< vec_file_entry.clone() }; - let values: [(u32, &dyn ToValue); 15] = [ + let values: [(u32, &dyn ToValue); 17] = [ (ColumnsSameMusic::ActivatableSelectButton as u32, &false), (ColumnsSameMusic::SelectionButton as u32, &false), (ColumnsSameMusic::Size as u32, &"".to_string()), @@ -1264,28 +1269,14 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< (ColumnsSameMusic::Path as u32, &"".to_string()), ( ColumnsSameMusic::Title as u32, - &(match is_title { + &(match is_track_title { true => text.clone(), false => "".to_string(), }), ), ( ColumnsSameMusic::Artist as u32, - &(match is_artist { - true => text.clone(), - false => "".to_string(), - }), - ), - ( - ColumnsSameMusic::AlbumTitle as u32, - &(match is_album_title { - true => text.clone(), - false => "".to_string(), - }), - ), - ( - ColumnsSameMusic::AlbumArtist as u32, - &(match is_album_artist { + &(match is_track_artist { true => text.clone(), false => "".to_string(), }), @@ -1297,6 +1288,28 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< false => "".to_string(), }), ), + ( + ColumnsSameMusic::Bitrate as u32, + &(match is_bitrate { + true => text.clone(), + false => "".to_string(), + }), + ), + (ColumnsSameMusic::BitrateAsNumber as u32, &(0)), + ( + ColumnsSameMusic::Genre as u32, + &(match is_genre { + true => text.clone(), + false => "".to_string(), + }), + ), + ( + ColumnsSameMusic::Length as u32, + &(match is_length { + true => text.clone(), + false => "".to_string(), + }), + ), (ColumnsSameMusic::Modification as u32, &"".to_string()), (ColumnsSameMusic::ModificationAsSecs as u32, &(0)), (ColumnsSameMusic::Color as u32, &(HEADER_ROW_COLOR.to_string())), @@ -1305,18 +1318,20 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< list_store.set(&list_store.append(), &values); for file_entry in vec_file_entry { let (directory, file) = split_path(&file_entry.path); - let values: [(u32, &dyn ToValue); 15] = [ + let values: [(u32, &dyn ToValue); 17] = [ (ColumnsSameMusic::ActivatableSelectButton as u32, &true), (ColumnsSameMusic::SelectionButton as u32, &false), (ColumnsSameMusic::Size as u32, &file_entry.size.file_size(options::BINARY).unwrap()), (ColumnsSameMusic::SizeAsBytes as u32, &file_entry.size), (ColumnsSameMusic::Name as u32, &file), (ColumnsSameMusic::Path as u32, &directory), - (ColumnsSameMusic::Title as u32, &file_entry.title), - (ColumnsSameMusic::Artist as u32, &file_entry.artist), - (ColumnsSameMusic::AlbumTitle as u32, &file_entry.album_title), - (ColumnsSameMusic::AlbumArtist as u32, &file_entry.album_artist), + (ColumnsSameMusic::Title as u32, &file_entry.track_title), + (ColumnsSameMusic::Artist as u32, &file_entry.track_artist), (ColumnsSameMusic::Year as u32, &file_entry.year.to_string()), + (ColumnsSameMusic::Genre as u32, &file_entry.genre), + (ColumnsSameMusic::Bitrate as u32, &(format!("{} kbps", file_entry.bitrate))), + (ColumnsSameMusic::BitrateAsNumber as u32, &(file_entry.bitrate)), + (ColumnsSameMusic::Length as u32, &file_entry.length), ( ColumnsSameMusic::Modification as u32, &(NaiveDateTime::from_timestamp(file_entry.modified_date as i64, 0).to_string()), diff --git a/czkawka_gui/src/connect_things/connect_button_search.rs b/czkawka_gui/src/connect_things/connect_button_search.rs index b06f694..5ddde02 100644 --- a/czkawka_gui/src/connect_things/connect_button_search.rs +++ b/czkawka_gui/src/connect_things/connect_button_search.rs @@ -53,11 +53,12 @@ pub fn connect_button_search( let buttons_names = gui_data.bottom_buttons.buttons_names; let buttons_search_clone = gui_data.bottom_buttons.buttons_search.clone(); let check_button_duplicates_use_prehash_cache = gui_data.settings.check_button_duplicates_use_prehash_cache.clone(); - let check_button_music_album_artist: gtk::CheckButton = gui_data.main_notebook.check_button_music_album_artist.clone(); - let check_button_music_album_title: gtk::CheckButton = gui_data.main_notebook.check_button_music_album_title.clone(); let check_button_music_artist: gtk::CheckButton = gui_data.main_notebook.check_button_music_artist.clone(); let check_button_music_title: gtk::CheckButton = gui_data.main_notebook.check_button_music_title.clone(); let check_button_music_year: gtk::CheckButton = gui_data.main_notebook.check_button_music_year.clone(); + let check_button_music_genre: gtk::CheckButton = gui_data.main_notebook.check_button_music_genre.clone(); + let check_button_music_length: gtk::CheckButton = gui_data.main_notebook.check_button_music_length.clone(); + let check_button_music_bitrate: gtk::CheckButton = gui_data.main_notebook.check_button_music_bitrate.clone(); let check_button_recursive = gui_data.upper_notebook.check_button_recursive.clone(); let check_button_settings_duplicates_delete_outdated_cache = gui_data.settings.check_button_settings_duplicates_delete_outdated_cache.clone(); let check_button_settings_hide_hard_links = gui_data.settings.check_button_settings_hide_hard_links.clone(); @@ -385,20 +386,23 @@ pub fn connect_button_search( let mut music_similarity: MusicSimilarity = MusicSimilarity::NONE; if check_button_music_title.is_active() { - music_similarity |= MusicSimilarity::TITLE; + music_similarity |= MusicSimilarity::TRACK_TITLE; } if check_button_music_artist.is_active() { - music_similarity |= MusicSimilarity::ARTIST; - } - if check_button_music_album_title.is_active() { - music_similarity |= MusicSimilarity::ALBUM_TITLE; - } - if check_button_music_album_artist.is_active() { - music_similarity |= MusicSimilarity::ALBUM_ARTIST; + music_similarity |= MusicSimilarity::TRACK_ARTIST; } if check_button_music_year.is_active() { music_similarity |= MusicSimilarity::YEAR; } + if check_button_music_bitrate.is_active() { + music_similarity |= MusicSimilarity::BITRATE; + } + if check_button_music_genre.is_active() { + music_similarity |= MusicSimilarity::GENRE; + } + if check_button_music_length.is_active() { + music_similarity |= MusicSimilarity::LENGTH; + } if music_similarity != MusicSimilarity::NONE { let futures_sender_same_music = futures_sender_same_music.clone(); diff --git a/czkawka_gui/src/create_tree_view.rs b/czkawka_gui/src/create_tree_view.rs index 04072e1..4ac70a8 100644 --- a/czkawka_gui/src/create_tree_view.rs +++ b/czkawka_gui/src/create_tree_view.rs @@ -538,17 +538,6 @@ pub fn create_tree_view_same_music(tree_view: >k::TreeView) { column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32); tree_view.append_column(&column); - let renderer = gtk::CellRendererText::new(); - let column: gtk::TreeViewColumn = TreeViewColumn::new(); - column.pack_start(&renderer, true); - column.set_title("Path"); - column.set_resizable(true); - column.set_min_width(50); - column.add_attribute(&renderer, "text", ColumnsSameMusic::Path as i32); - column.add_attribute(&renderer, "background", ColumnsSameMusic::Color as i32); - column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32); - tree_view.append_column(&column); - let renderer = gtk::CellRendererText::new(); let column: gtk::TreeViewColumn = TreeViewColumn::new(); column.pack_start(&renderer, true); @@ -585,10 +574,10 @@ pub fn create_tree_view_same_music(tree_view: >k::TreeView) { let renderer = gtk::CellRendererText::new(); let column: gtk::TreeViewColumn = TreeViewColumn::new(); column.pack_start(&renderer, true); - column.set_title("Album Title"); + column.set_title("Bitrate"); column.set_resizable(true); column.set_min_width(50); - column.add_attribute(&renderer, "text", ColumnsSameMusic::AlbumTitle as i32); + column.add_attribute(&renderer, "text", ColumnsSameMusic::Bitrate as i32); column.add_attribute(&renderer, "background", ColumnsSameMusic::Color as i32); column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32); tree_view.append_column(&column); @@ -596,10 +585,32 @@ pub fn create_tree_view_same_music(tree_view: >k::TreeView) { let renderer = gtk::CellRendererText::new(); let column: gtk::TreeViewColumn = TreeViewColumn::new(); column.pack_start(&renderer, true); - column.set_title("Album Artist"); + column.set_title("Length"); column.set_resizable(true); column.set_min_width(50); - column.add_attribute(&renderer, "text", ColumnsSameMusic::AlbumArtist as i32); + column.add_attribute(&renderer, "text", ColumnsSameMusic::Length as i32); + column.add_attribute(&renderer, "background", ColumnsSameMusic::Color as i32); + column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32); + tree_view.append_column(&column); + + let renderer = gtk::CellRendererText::new(); + let column: gtk::TreeViewColumn = TreeViewColumn::new(); + column.pack_start(&renderer, true); + column.set_title("Genre"); + column.set_resizable(true); + column.set_min_width(50); + column.add_attribute(&renderer, "text", ColumnsSameMusic::Genre as i32); + column.add_attribute(&renderer, "background", ColumnsSameMusic::Color as i32); + column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32); + tree_view.append_column(&column); + + let renderer = gtk::CellRendererText::new(); + let column: gtk::TreeViewColumn = TreeViewColumn::new(); + column.pack_start(&renderer, true); + column.set_title("Path"); + column.set_resizable(true); + column.set_min_width(50); + column.add_attribute(&renderer, "text", ColumnsSameMusic::Path as i32); column.add_attribute(&renderer, "background", ColumnsSameMusic::Color as i32); column.add_attribute(&renderer, "foreground", ColumnsSameMusic::TextColor as i32); tree_view.append_column(&column); diff --git a/czkawka_gui/src/gui_structs/gui_about.rs b/czkawka_gui/src/gui_structs/gui_about.rs index f4ed4de..8d4b53b 100644 --- a/czkawka_gui/src/gui_structs/gui_about.rs +++ b/czkawka_gui/src/gui_structs/gui_about.rs @@ -16,7 +16,7 @@ pub struct GuiAbout { impl GuiAbout { pub fn create_from_builder(window_main: &Window, logo: &Pixbuf) -> Self { - let glade_src = include_str!("../../ui/about_dialog.glade").to_string(); + let glade_src = include_str!("../../ui/about_dialog.ui").to_string(); let builder = Builder::from_string(glade_src.as_str()); let about_dialog: gtk::AboutDialog = builder.object("about_dialog").unwrap(); diff --git a/czkawka_gui/src/gui_structs/gui_compare_images.rs b/czkawka_gui/src/gui_structs/gui_compare_images.rs index 2b250d1..d49d7c1 100644 --- a/czkawka_gui/src/gui_structs/gui_compare_images.rs +++ b/czkawka_gui/src/gui_structs/gui_compare_images.rs @@ -30,7 +30,7 @@ pub struct GuiCompareImages { impl GuiCompareImages { pub fn create_from_builder(window_main: >k::Window) -> Self { - let glade_src = include_str!("../../ui/compare_images.glade").to_string(); + let glade_src = include_str!("../../ui/compare_images.ui").to_string(); let builder = Builder::from_string(glade_src.as_str()); let window_compare: gtk::Window = builder.object("window_compare").unwrap(); diff --git a/czkawka_gui/src/gui_structs/gui_data.rs b/czkawka_gui/src/gui_structs/gui_data.rs index daaa22c..a27061a 100644 --- a/czkawka_gui/src/gui_structs/gui_data.rs +++ b/czkawka_gui/src/gui_structs/gui_data.rs @@ -88,7 +88,7 @@ pub struct GuiData { impl GuiData { pub fn new_with_application(application: >k::Application) -> Self { //// Loading glade file content and build with it help UI - let glade_src = include_str!("../../ui/main_window.glade").to_string(); + let glade_src = include_str!("../../ui/main_window.ui").to_string(); let builder = Builder::from_string(glade_src.as_str()); //// Windows diff --git a/czkawka_gui/src/gui_structs/gui_main_notebook.rs b/czkawka_gui/src/gui_structs/gui_main_notebook.rs index 66201a1..7ae62a7 100644 --- a/czkawka_gui/src/gui_structs/gui_main_notebook.rs +++ b/czkawka_gui/src/gui_structs/gui_main_notebook.rs @@ -104,9 +104,10 @@ pub struct GuiMainNotebook { // Music pub check_button_music_title: gtk::CheckButton, pub check_button_music_artist: gtk::CheckButton, - pub check_button_music_album_title: gtk::CheckButton, - pub check_button_music_album_artist: gtk::CheckButton, pub check_button_music_year: gtk::CheckButton, + pub check_button_music_bitrate: gtk::CheckButton, + pub check_button_music_genre: gtk::CheckButton, + pub check_button_music_length: gtk::CheckButton, pub check_button_music_approximate_comparison: gtk::CheckButton, } @@ -199,9 +200,10 @@ impl GuiMainNotebook { //// Check Buttons let check_button_music_title: gtk::CheckButton = builder.object("check_button_music_title").unwrap(); let check_button_music_artist: gtk::CheckButton = builder.object("check_button_music_artist").unwrap(); - let check_button_music_album_title: gtk::CheckButton = builder.object("check_button_music_album_title").unwrap(); - let check_button_music_album_artist: gtk::CheckButton = builder.object("check_button_music_album_artist").unwrap(); let check_button_music_year: gtk::CheckButton = builder.object("check_button_music_year").unwrap(); + let check_button_music_bitrate: gtk::CheckButton = builder.object("check_button_music_bitrate").unwrap(); + let check_button_music_genre: gtk::CheckButton = builder.object("check_button_music_genre").unwrap(); + let check_button_music_length: gtk::CheckButton = builder.object("check_button_music_length").unwrap(); let check_button_music_approximate_comparison: gtk::CheckButton = builder.object("check_button_music_approximate_comparison").unwrap(); //// Radio Buttons @@ -270,9 +272,10 @@ impl GuiMainNotebook { entry_big_files_number, check_button_music_title, check_button_music_artist, - check_button_music_album_title, - check_button_music_album_artist, check_button_music_year, + check_button_music_bitrate, + check_button_music_genre, + check_button_music_length, check_button_music_approximate_comparison, scale_similarity_similar_images, scale_similarity_similar_videos, @@ -319,9 +322,10 @@ impl GuiMainNotebook { pub fn update_language(&self) { self.check_button_music_title.set_label(&flg!("music_title_checkbox")); self.check_button_music_artist.set_label(&flg!("music_artist_checkbox")); - self.check_button_music_album_title.set_label(&flg!("music_album_title_checkbox")); - self.check_button_music_album_artist.set_label(&flg!("music_album_artist_checkbox")); self.check_button_music_year.set_label(&flg!("music_year_checkbox")); + self.check_button_music_bitrate.set_label(&flg!("music_bitrate_checkbox")); + self.check_button_music_genre.set_label(&flg!("music_genre_checkbox")); + self.check_button_music_length.set_label(&flg!("music_length_checkbox")); self.check_button_music_approximate_comparison.set_label(&flg!("music_comparison_checkbox")); self.check_button_music_approximate_comparison @@ -460,12 +464,13 @@ impl GuiMainNotebook { vec![ flg!("main_tree_view_column_size"), flg!("main_tree_view_column_file_name"), - flg!("main_tree_view_column_path"), flg!("main_tree_view_column_title"), flg!("main_tree_view_column_artist"), flg!("main_tree_view_column_year"), - flg!("main_tree_view_column_album_title"), - flg!("main_tree_view_column_album_artist"), + flg!("main_tree_view_column_bitrate"), + flg!("main_tree_view_column_length"), + flg!("main_tree_view_column_genre"), + flg!("main_tree_view_column_path"), flg!("main_tree_view_column_modification"), ], // Music Dupliactes vec![ diff --git a/czkawka_gui/src/gui_structs/gui_popovers.rs b/czkawka_gui/src/gui_structs/gui_popovers.rs index a905ab6..f27e556 100644 --- a/czkawka_gui/src/gui_structs/gui_popovers.rs +++ b/czkawka_gui/src/gui_structs/gui_popovers.rs @@ -31,7 +31,7 @@ pub struct GuiPopovers { impl GuiPopovers { pub fn create_from_builder() -> Self { - let glade_src = include_str!("../../ui/popover_select.glade").to_string(); + let glade_src = include_str!("../../ui/popover_select.ui").to_string(); let builder = Builder::from_string(glade_src.as_str()); let buttons_popover_select_all: gtk::Button = builder.object("buttons_popover_select_all").unwrap(); @@ -54,7 +54,7 @@ impl GuiPopovers { let popover_select: gtk::Popover = builder.object("popover_select").unwrap(); // Popover right click(not implemented for now) - let glade_src = include_str!("../../ui/popover_right_click.glade").to_string(); + let glade_src = include_str!("../../ui/popover_right_click.ui").to_string(); let builder = Builder::from_string(glade_src.as_str()); let buttons_popover_right_click_open_file: gtk::Button = builder.object("buttons_popover_right_click_open_file").unwrap(); diff --git a/czkawka_gui/src/gui_structs/gui_progress_dialog.rs b/czkawka_gui/src/gui_structs/gui_progress_dialog.rs index 4077b8e..acfd27a 100644 --- a/czkawka_gui/src/gui_structs/gui_progress_dialog.rs +++ b/czkawka_gui/src/gui_structs/gui_progress_dialog.rs @@ -24,7 +24,7 @@ pub struct GuiProgressDialog { impl GuiProgressDialog { pub fn create_from_builder(window_main: &Window) -> Self { - let glade_src = include_str!("../../ui/progress.glade").to_string(); + let glade_src = include_str!("../../ui/progress.ui").to_string(); let builder = Builder::from_string(glade_src.as_str()); let window_progress: gtk::Dialog = builder.object("window_progress").unwrap(); diff --git a/czkawka_gui/src/gui_structs/gui_settings.rs b/czkawka_gui/src/gui_structs/gui_settings.rs index 53effd4..9a68817 100644 --- a/czkawka_gui/src/gui_structs/gui_settings.rs +++ b/czkawka_gui/src/gui_structs/gui_settings.rs @@ -53,7 +53,7 @@ pub struct GuiSettings { impl GuiSettings { pub fn create_from_builder(window_main: &Window) -> Self { - let glade_src = include_str!("../../ui/settings.glade").to_string(); + let glade_src = include_str!("../../ui/settings.ui").to_string(); let builder = Builder::from_string(glade_src.as_str()); let window_settings: gtk::Window = builder.object("window_settings").unwrap(); diff --git a/czkawka_gui/src/help_functions.rs b/czkawka_gui/src/help_functions.rs index 515d74a..eb86518 100644 --- a/czkawka_gui/src/help_functions.rs +++ b/czkawka_gui/src/help_functions.rs @@ -318,9 +318,11 @@ pub enum ColumnsSameMusic { Path, Title, Artist, - AlbumTitle, - AlbumArtist, Year, + Bitrate, + BitrateAsNumber, + Length, + Genre, Modification, ModificationAsSecs, Color, diff --git a/czkawka_gui/src/initialize_gui.rs b/czkawka_gui/src/initialize_gui.rs index 09e8e1a..6abcf73 100644 --- a/czkawka_gui/src/initialize_gui.rs +++ b/czkawka_gui/src/initialize_gui.rs @@ -311,7 +311,7 @@ pub fn initialize_gui(gui_data: &mut GuiData) { let scrolled_window = gui_data.main_notebook.scrolled_window_same_music_finder.clone(); let tree_view = gui_data.main_notebook.tree_view_same_music_finder.clone(); - let col_types: [glib::types::Type; 15] = [ + let col_types: [glib::types::Type; 17] = [ glib::types::Type::BOOL, // ActivatableSelectButton glib::types::Type::BOOL, // SelectionButton glib::types::Type::STRING, // Size @@ -320,9 +320,11 @@ pub fn initialize_gui(gui_data: &mut GuiData) { glib::types::Type::STRING, // Path glib::types::Type::STRING, // Title glib::types::Type::STRING, // Artist - glib::types::Type::STRING, // AlbumTitle - glib::types::Type::STRING, // AlbumArtist glib::types::Type::STRING, // Year + glib::types::Type::STRING, // Bitrate + glib::types::Type::U64, // BitrateAsNumber + glib::types::Type::STRING, // Length + glib::types::Type::STRING, // Genre glib::types::Type::STRING, // Modification glib::types::Type::U64, // ModificationAsSecs glib::types::Type::STRING, // Color diff --git a/czkawka_gui/src/main.rs b/czkawka_gui/src/main.rs index 2cd6031..1c0ca34 100644 --- a/czkawka_gui/src/main.rs +++ b/czkawka_gui/src/main.rs @@ -3,6 +3,7 @@ #![allow(clippy::collapsible_else_if)] #![allow(clippy::too_many_arguments)] #![allow(clippy::type_complexity)] +#![allow(clippy::needless_late_init)] use gtk::prelude::*; diff --git a/czkawka_gui/ui/about_dialog.glade b/czkawka_gui/ui/about_dialog.ui similarity index 100% rename from czkawka_gui/ui/about_dialog.glade rename to czkawka_gui/ui/about_dialog.ui diff --git a/czkawka_gui/ui/compare_images.glade b/czkawka_gui/ui/compare_images.ui similarity index 100% rename from czkawka_gui/ui/compare_images.glade rename to czkawka_gui/ui/compare_images.ui diff --git a/czkawka_gui/ui/czkawka.cmb b/czkawka_gui/ui/czkawka.cmb new file mode 100644 index 0000000..2af2d15 --- /dev/null +++ b/czkawka_gui/ui/czkawka.cmb @@ -0,0 +1,1207 @@ + + + + + (5,None,"Czkawka","main_window.ui","Czkawka is simple and fast app to find duplicates, empty folders, similar images etc.",None,"Rafa\\305\\202 Mikrut","mit_x11",None," Generated with glade 3.39.0 \n\nThe MIT License (MIT)\n\nCopyright (c) \n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\nAuthor: Rafał Mikrut\n\n") + + + (5,"gtk+","3.24",None) + + + (5,1,"GtkAdjustment","adjustment1",None,None,None,None,None), + (5,2,"GtkWindow","window_main",None,None,None,None,None), + (5,3,"GtkBox",None,2,None,None,None,None), + (5,4,"GtkPaned",None,3,None,None,None,None), + (5,5,"GtkNotebook","notebook_upper",4,None,None,None,None), + (5,6,"GtkBox","notebook_upper_included_directories",5,None,None,None,None), + (5,7,"GtkBox",None,6,None,None,None,None), + (5,8,"GtkButton","buttons_add_included_directory",7,None,None,None,None), + (5,9,"GtkBox",None,8,None,None,None,None), + (5,10,"GtkImage",None,9,None,None,None,None), + (5,11,"GtkLabel",None,9,None,None,None,1), + (5,12,"GtkButton","buttons_remove_included_directory",7,None,None,None,1), + (5,13,"GtkBox",None,12,None,None,None,None), + (5,14,"GtkImage",None,13,None,None,None,None), + (5,15,"GtkLabel",None,13,None,None,None,1), + (5,16,"GtkButton","buttons_manual_add_included_directory",7,None,None,None,2), + (5,17,"GtkBox",None,16,None,None,None,None), + (5,18,"GtkImage",None,17,None,None,None,None), + (5,19,"GtkLabel",None,17,None,None,None,1), + (5,20,"GtkScrolledWindow","scrolled_window_included_directories",6,None,None,None,1), + (5,21,"GtkCheckButton","check_button_recursive",6,None,None,None,2), + (5,22,"GtkLabel",None,5,None,"tab",None,1), + (5,23,"GtkBox","notebook_upper_excluded_directories",5,None,None,None,2), + (5,24,"GtkBox",None,23,None,None,None,None), + (5,25,"GtkButton","buttons_add_excluded_directory",24,None,None,None,None), + (5,26,"GtkBox",None,25,None,None,None,None), + (5,27,"GtkImage",None,26,None,None,None,None), + (5,28,"GtkLabel",None,26,None,None,None,1), + (5,29,"GtkButton","buttons_remove_excluded_directory",24,None,None,None,1), + (5,30,"GtkBox",None,29,None,None,None,None), + (5,31,"GtkImage",None,30,None,None,None,None), + (5,32,"GtkLabel",None,30,None,None,None,1), + (5,33,"GtkButton","buttons_manual_add_excluded_directory",24,None,None,None,2), + (5,34,"GtkBox",None,33,None,None,None,None), + (5,35,"GtkImage",None,34,None,None,None,None), + (5,36,"GtkLabel",None,34,None,None,None,1), + (5,37,"GtkScrolledWindow","scrolled_window_excluded_directories",23,None,None,None,1), + (5,38,"GtkLabel",None,5,None,"tab",None,3), + (5,39,"GtkBox","notebook_upper_excluded_items",5,None,None,None,4), + (5,40,"GtkBox",None,39,None,None,None,None), + (5,41,"GtkLabel","label_excluded_items",40,None,None,None,None), + (5,42,"GtkEntry","entry_excluded_items",40,None,None,None,1), + (5,43,"GtkBox",None,39,None,None,None,1), + (5,44,"GtkLabel","label_allowed_extensions",43,None,None,None,None), + (5,45,"GtkEntry","entry_allowed_extensions",43,None,None,None,1), + (5,46,"GtkBox",None,39,None,None,None,2), + (5,47,"GtkLabel","label_general_size_bytes",46,None,None,None,None), + (5,48,"GtkLabel","label_general_min_size",46,None,None,None,1), + (5,49,"GtkEntry","entry_general_minimal_size",46,None,None,None,2), + (5,50,"GtkLabel","label_general_max_size",46,None,None,None,3), + (5,51,"GtkEntry","entry_general_maximal_size",46,None,None,None,4), + (5,52,"GtkLabel",None,5,None,"tab",None,5), + (5,53,"GtkNotebook","notebook_main",4,None,None,None,1), + (5,54,"GtkBox",None,53,None,None,None,None), + (5,55,"GtkBox",None,54,None,None,None,None), + (5,56,"GtkBox",None,55,None,None,None,None), + (5,57,"GtkLabel","label_duplicate_check_method",56,None,None,None,None), + (5,58,"GtkComboBoxText","combo_box_duplicate_check_method",56,None,None,None,1), + (5,59,"GtkLabel","label_duplicate_hash_type",56,None,None,None,2), + (5,60,"GtkComboBoxText","combo_box_duplicate_hash_type",56,None,None,None,3), + (5,61,"GtkScrolledWindow","scrolled_window_duplicate_finder",55,None,None,None,1), + (5,62,"GtkImage","image_preview_duplicates",54,None,None,None,1), + (5,63,"GtkLabel",None,53,None,"tab",None,1), + (5,64,"GtkScrolledWindow","scrolled_window_empty_folder_finder",53,None,None,None,2), + (5,65,"GtkLabel",None,53,None,"tab",None,3), + (5,66,"GtkBox",None,53,None,None,None,4), + (5,67,"GtkBox",None,66,None,None,None,None), + (5,68,"GtkLabel","label_big_shown_files",67,None,None,None,None), + (5,69,"GtkEntry","entry_big_files_number",67,None,None,None,1), + (5,70,"GtkScrolledWindow","scrolled_window_big_files_finder",66,None,None,None,1), + (5,71,"GtkLabel",None,53,None,"tab",None,5), + (5,72,"GtkScrolledWindow","scrolled_window_empty_files_finder",53,None,None,None,6), + (5,73,"GtkLabel",None,53,None,"tab",None,7), + (5,74,"GtkScrolledWindow","scrolled_window_temporary_files_finder",53,None,None,None,8), + (5,75,"GtkLabel",None,53,None,"tab",None,9), + (5,76,"GtkBox",None,53,None,None,None,10), + (5,77,"GtkBox",None,76,None,None,None,None), + (5,78,"GtkBox",None,77,None,None,None,None), + (5,79,"GtkLabel","label_image_resize_algorithm",78,None,None,None,None), + (5,80,"GtkComboBoxText","combo_box_image_resize_algorithm",78,None,None,None,1), + (5,81,"GtkLabel","label_image_hash_size",78,None,None,None,2), + (5,82,"GtkComboBoxText","combo_box_image_hash_size",78,None,None,None,3), + (5,83,"GtkLabel","label_image_hash_type",78,None,None,None,4), + (5,84,"GtkComboBoxText","combo_box_image_hash_algorithm",78,None,None,None,5), + (5,85,"GtkBox",None,77,None,None,None,1), + (5,86,"GtkLabel","label_image_similarity",85,None,None,None,None), + (5,87,"GtkLabel","label_image_similarity_max",85,None,None,None,1), + (5,88,"GtkScale","scale_similarity_similar_images",85,None,None,None,2), + (5,89,"GtkLabel","label_similar_images_minimal_similarity",85,None,None,None,3), + (5,90,"GtkCheckButton","check_button_image_ignore_same_size",85,None,None,None,4), + (5,91,"GtkCheckButton","check_button_image_fast_compare",85,None,None,None,5), + (5,92,"GtkScrolledWindow","scrolled_window_similar_images_finder",77,None,None,None,2), + (5,93,"GtkImage","image_preview_similar_images",76,None,None,None,1), + (5,94,"GtkLabel",None,53,None,"tab",None,11), + (5,95,"GtkBox",None,53,None,None,None,12), + (5,96,"GtkBox",None,95,None,None,None,None), + (5,97,"GtkLabel","label_video_similarity",96,None,None,None,None), + (5,98,"GtkLabel","label_video_similarity_max",96,None,None,None,1), + (5,99,"GtkScale","scale_similarity_similar_videos",96,None,None,None,2), + (5,100,"GtkLabel","label_video_similarity_min",96,None,None,None,3), + (5,101,"GtkCheckButton","check_button_video_ignore_same_size",96,None,None,None,4), + (5,102,"GtkScrolledWindow","scrolled_window_similar_videos_finder",95,None,None,None,1), + (5,103,"GtkLabel",None,53,None,"tab",None,13), + (5,104,"GtkBox",None,53,None,None,None,14), + (5,105,"GtkBox",None,104,None,None,None,None), + (5,106,"GtkCheckButton","check_button_music_title",105,None,None,None,None), + (5,107,"GtkCheckButton","check_button_music_artist",105,None,None,None,1), + (5,108,"GtkCheckButton","check_button_music_year",105,None,None,None,2), + (5,109,"GtkCheckButton","check_button_music_bitrate",105,None,None,None,3), + (5,110,"GtkCheckButton","check_button_music_genre",105,None,None,None,4), + (5,111,"GtkBox",None,104,None,None,None,1), + (5,112,"GtkCheckButton","check_button_music_approximate_comparison",111,None,None,None,None), + (5,113,"GtkScrolledWindow","scrolled_window_same_music_finder",104,None,None,None,2), + (5,114,"GtkLabel",None,53,None,"tab",None,15), + (5,115,"GtkScrolledWindow","scrolled_window_invalid_symlinks",53,None,None,None,16), + (5,116,"GtkLabel",None,53,None,"tab",None,17), + (5,117,"GtkScrolledWindow","scrolled_window_broken_files",53,None,None,None,18), + (5,118,"GtkLabel",None,53,None,"tab",None,19), + (5,119,"GtkBox","buttons",3,None,None,None,1), + (5,120,"GtkBox","control_buttons",119,None,None,None,None), + (5,121,"GtkButton","buttons_search",120,None,None,None,None), + (5,122,"GtkBox",None,121,None,None,None,None), + (5,123,"GtkImage",None,122,None,None,None,None), + (5,124,"GtkLabel",None,122,None,None,None,1), + (5,125,"GtkButton","buttons_show_errors",119,None,None,None,1), + (5,126,"GtkImage",None,125,None,None,None,None), + (5,127,"GtkButton","buttons_show_upper_notebook",119,None,None,None,2), + (5,128,"GtkImage",None,127,None,None,None,None), + (5,129,"GtkBox","action_buttons",119,None,None,None,3), + (5,130,"GtkMenuButton","buttons_select",129,None,None,None,None), + (5,131,"GtkBox",None,130,None,None,None,None), + (5,132,"GtkImage",None,131,None,None,None,None), + (5,133,"GtkLabel",None,131,None,None,None,1), + (5,134,"GtkButton","buttons_compare",129,None,None,None,1), + (5,135,"GtkBox",None,134,None,None,None,None), + (5,136,"GtkImage",None,135,None,None,None,None), + (5,137,"GtkLabel",None,135,None,None,None,1), + (5,138,"GtkButton","buttons_delete",129,None,None,None,2), + (5,139,"GtkBox",None,138,None,None,None,None), + (5,140,"GtkImage",None,139,None,None,None,None), + (5,141,"GtkLabel",None,139,None,None,None,1), + (5,142,"GtkButton","buttons_move",129,None,None,None,3), + (5,143,"GtkBox",None,142,None,None,None,None), + (5,144,"GtkImage",None,143,None,None,None,None), + (5,145,"GtkLabel",None,143,None,None,None,1), + (5,146,"GtkButton","buttons_save",129,None,None,None,4), + (5,147,"GtkBox",None,146,None,None,None,None), + (5,148,"GtkImage",None,147,None,None,None,None), + (5,149,"GtkLabel",None,147,None,None,None,1), + (5,150,"GtkButton","buttons_symlink",129,None,None,None,5), + (5,151,"GtkBox",None,150,None,None,None,None), + (5,152,"GtkImage",None,151,None,None,None,None), + (5,153,"GtkLabel",None,151,None,None,None,1), + (5,154,"GtkButton","buttons_hardlink",129,None,None,None,6), + (5,155,"GtkBox",None,154,None,None,None,None), + (5,156,"GtkImage",None,155,None,None,None,None), + (5,157,"GtkLabel",None,155,None,None,None,1), + (5,158,"GtkBox",None,3,None,None,None,2), + (5,159,"GtkEntry","entry_info",158,None,None,None,None), + (5,160,"GtkEntry",None,158,None,None,None,1), + (5,161,"GtkScrolledWindow","scrolled_window_errors",3,None,None,None,3), + (5,162,"GtkTextView","text_view_errors",161,None,None,None,None), + (5,163,"GtkHeaderBar",None,2,None,"titlebar",None,1), + (5,164,"GtkBox",None,163,None,None,None,None), + (5,165,"GtkButton","button_settings",164,None,None,None,None), + (5,166,"GtkImage",None,165,None,None,None,None), + (5,167,"GtkButton","button_app_info",164,None,None,None,1), + (5,168,"GtkImage",None,167,None,None,None,None), + (5,169,"GtkCheckButton","check_button_music_length",105,None,None,None,4) + + + (5,1,"GtkAdjustment","page-increment","10",None,None,None,None,None), + (5,1,"GtkAdjustment","step-increment","1",None,None,None,None,None), + (5,1,"GtkAdjustment","upper","100",None,None,None,None,None), + (5,2,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,2,"GtkWindow","default-height","800",None,None,None,None,None), + (5,2,"GtkWindow","default-width","1100",None,None,None,None,None), + (5,3,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (5,3,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,3,"GtkWidget","visible","True",None,None,None,None,None), + (5,4,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (5,4,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,4,"GtkWidget","visible","True",None,None,None,None,None), + (5,5,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,5,"GtkWidget","visible","True",None,None,None,None,None), + (5,6,"GtkBox","spacing","5",None,None,None,None,None), + (5,6,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,6,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,6,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,6,"GtkWidget","visible","True",None,None,None,None,None), + (5,7,"GtkBox","spacing","1",None,None,None,None,None), + (5,7,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (5,7,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,7,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,7,"GtkWidget","visible","True",None,None,None,None,None), + (5,8,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,8,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,8,"GtkWidget","visible","True",None,None,None,None,None), + (5,9,"GtkBox","spacing","4",None,None,None,None,None), + (5,9,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,9,"GtkWidget","halign","center",None,None,None,None,None), + (5,9,"GtkWidget","visible","True",None,None,None,None,None), + (5,10,"GtkImage","icon-name","list-add",None,None,None,None,None), + (5,10,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,10,"GtkWidget","visible","True",None,None,None,None,None), + (5,11,"GtkLabel","label","Add ","yes",None,None,None,None), + (5,11,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,11,"GtkWidget","visible","True",None,None,None,None,None), + (5,12,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,12,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,12,"GtkWidget","visible","True",None,None,None,None,None), + (5,13,"GtkBox","spacing","4",None,None,None,None,None), + (5,13,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,13,"GtkWidget","halign","center",None,None,None,None,None), + (5,13,"GtkWidget","visible","True",None,None,None,None,None), + (5,14,"GtkImage","icon-name","list-remove",None,None,None,None,None), + (5,14,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,14,"GtkWidget","visible","True",None,None,None,None,None), + (5,15,"GtkLabel","label","Remove ","yes",None,None,None,None), + (5,15,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,15,"GtkWidget","visible","True",None,None,None,None,None), + (5,16,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,16,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,16,"GtkWidget","visible","True",None,None,None,None,None), + (5,17,"GtkBox","spacing","4",None,None,None,None,None), + (5,17,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,17,"GtkWidget","halign","center",None,None,None,None,None), + (5,17,"GtkWidget","visible","True",None,None,None,None,None), + (5,18,"GtkImage","icon-name","insert-link",None,None,None,None,None), + (5,18,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,18,"GtkWidget","visible","True",None,None,None,None,None), + (5,19,"GtkLabel","label","Manual Add","yes",None,None,None,None), + (5,19,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,19,"GtkWidget","visible","True",None,None,None,None,None), + (5,20,"GtkScrolledWindow","shadow-type","in",None,None,None,None,None), + (5,20,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,20,"GtkWidget","visible","True",None,None,None,None,None), + (5,21,"GtkButton","label","Recursive","yes",None,None,None,None), + (5,21,"GtkToggleButton","active","True",None,None,None,None,None), + (5,21,"GtkToggleButton","draw-indicator","True",None,None,None,None,None), + (5,21,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,21,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,21,"GtkWidget","receives-default","False",None,None,None,None,None), + (5,21,"GtkWidget","visible","True",None,None,None,None,None), + (5,22,"GtkLabel","label","Included Directories","yes",None,None,None,None), + (5,22,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,22,"GtkWidget","visible","True",None,None,None,None,None), + (5,23,"GtkBox","spacing","6",None,None,None,None,None), + (5,23,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,23,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,23,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,23,"GtkWidget","visible","True",None,None,None,None,None), + (5,24,"GtkBox","spacing","1",None,None,None,None,None), + (5,24,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (5,24,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,24,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,24,"GtkWidget","visible","True",None,None,None,None,None), + (5,25,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,25,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,25,"GtkWidget","visible","True",None,None,None,None,None), + (5,26,"GtkBox","spacing","4",None,None,None,None,None), + (5,26,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,26,"GtkWidget","halign","center",None,None,None,None,None), + (5,26,"GtkWidget","visible","True",None,None,None,None,None), + (5,27,"GtkImage","icon-name","list-add",None,None,None,None,None), + (5,27,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,27,"GtkWidget","visible","True",None,None,None,None,None), + (5,28,"GtkLabel","label","Add ","yes",None,None,None,None), + (5,28,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,28,"GtkWidget","visible","True",None,None,None,None,None), + (5,29,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,29,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,29,"GtkWidget","visible","True",None,None,None,None,None), + (5,30,"GtkBox","spacing","4",None,None,None,None,None), + (5,30,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,30,"GtkWidget","halign","center",None,None,None,None,None), + (5,30,"GtkWidget","visible","True",None,None,None,None,None), + (5,31,"GtkImage","icon-name","list-remove",None,None,None,None,None), + (5,31,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,31,"GtkWidget","visible","True",None,None,None,None,None), + (5,32,"GtkLabel","label","Remove ","yes",None,None,None,None), + (5,32,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,32,"GtkWidget","visible","True",None,None,None,None,None), + (5,33,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,33,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,33,"GtkWidget","visible","True",None,None,None,None,None), + (5,34,"GtkBox","spacing","4",None,None,None,None,None), + (5,34,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,34,"GtkWidget","halign","center",None,None,None,None,None), + (5,34,"GtkWidget","visible","True",None,None,None,None,None), + (5,35,"GtkImage","icon-name","insert-link",None,None,None,None,None), + (5,35,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,35,"GtkWidget","visible","True",None,None,None,None,None), + (5,36,"GtkLabel","label","Manual Add","yes",None,None,None,None), + (5,36,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,36,"GtkWidget","visible","True",None,None,None,None,None), + (5,37,"GtkScrolledWindow","shadow-type","in",None,None,None,None,None), + (5,37,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,37,"GtkWidget","visible","True",None,None,None,None,None), + (5,38,"GtkLabel","label","Excluded Directories","yes",None,None,None,None), + (5,38,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,38,"GtkWidget","visible","True",None,None,None,None,None), + (5,39,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (5,39,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,39,"GtkWidget","valign","center",None,None,None,None,None), + (5,39,"GtkWidget","visible","True",None,None,None,None,None), + (5,40,"GtkBox","spacing","5",None,None,None,None,None), + (5,40,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,40,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,40,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,40,"GtkWidget","visible","True",None,None,None,None,None), + (5,41,"GtkLabel","label","Excluded items","yes",None,None,None,None), + (5,41,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,41,"GtkWidget","visible","True",None,None,None,None,None), + (5,42,"GtkEntry","text","*/.git,*/node_modules,*/lost+found","yes",None,None,None,None), + (5,42,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,42,"GtkWidget","visible","True",None,None,None,None,None), + (5,43,"GtkBox","spacing","5",None,None,None,None,None), + (5,43,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,43,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,43,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,43,"GtkWidget","visible","True",None,None,None,None,None), + (5,44,"GtkLabel","label","Allowed Extensions","yes",None,None,None,None), + (5,44,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,44,"GtkWidget","visible","True",None,None,None,None,None), + (5,45,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,45,"GtkWidget","visible","True",None,None,None,None,None), + (5,46,"GtkBox","spacing","8",None,None,None,None,None), + (5,46,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,46,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,46,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,46,"GtkWidget","visible","True",None,None,None,None,None), + (5,47,"GtkLabel","label","File Size(bytes)","yes",None,None,None,None), + (5,47,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,47,"GtkWidget","visible","True",None,None,None,None,None), + (5,48,"GtkLabel","label","Min:","yes",None,None,None,None), + (5,48,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,48,"GtkWidget","visible","True",None,None,None,None,None), + (5,49,"GtkEntry","caps-lock-warning","False",None,None,None,None,None), + (5,49,"GtkEntry","input-purpose","number",None,None,None,None,None), + (5,49,"GtkEntry","max-length","15",None,None,None,None,None), + (5,49,"GtkEntry","text","8192","yes",None,None,None,None), + (5,49,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,49,"GtkWidget","visible","True",None,None,None,None,None), + (5,50,"GtkLabel","label","Max:","yes",None,None,None,None), + (5,50,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,50,"GtkWidget","visible","True",None,None,None,None,None), + (5,51,"GtkEntry","caps-lock-warning","False",None,None,None,None,None), + (5,51,"GtkEntry","input-purpose","number",None,None,None,None,None), + (5,51,"GtkEntry","max-length","15",None,None,None,None,None), + (5,51,"GtkEntry","text","1099512000000","yes",None,None,None,None), + (5,51,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,51,"GtkWidget","visible","True",None,None,None,None,None), + (5,52,"GtkLabel","label","Items Configuration","yes",None,None,None,None), + (5,52,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,52,"GtkWidget","visible","True",None,None,None,None,None), + (5,53,"GtkNotebook","scrollable","True",None,None,None,None,None), + (5,53,"GtkNotebook","tab-pos","left",None,None,None,None,None), + (5,53,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,53,"GtkWidget","visible","True",None,None,None,None,None), + (5,54,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,54,"GtkWidget","visible","True",None,None,None,None,None), + (5,55,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (5,55,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,55,"GtkWidget","visible","True",None,None,None,None,None), + (5,56,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,56,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,56,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,56,"GtkWidget","margin-top","2",None,None,None,None,None), + (5,56,"GtkWidget","visible","True",None,None,None,None,None), + (5,57,"GtkLabel","label","Check method","yes",None,None,None,None), + (5,57,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,57,"GtkWidget","margin-end","3",None,None,None,None,None), + (5,57,"GtkWidget","visible","True",None,None,None,None,None), + (5,58,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,58,"GtkWidget","visible","True",None,None,None,None,None), + (5,59,"GtkLabel","label","Hash type","yes",None,None,None,None), + (5,59,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,59,"GtkWidget","margin-end","2",None,None,None,None,None), + (5,59,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,59,"GtkWidget","visible","True",None,None,None,None,None), + (5,60,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,60,"GtkWidget","visible","True",None,None,None,None,None), + (5,61,"GtkScrolledWindow","shadow-type","in",None,None,None,None,None), + (5,61,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,61,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,61,"GtkWidget","visible","True",None,None,None,None,None), + (5,62,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,62,"GtkWidget","height-request","80",None,None,None,None,None), + (5,62,"GtkWidget","valign","center",None,None,None,None,None), + (5,62,"GtkWidget","visible","True",None,None,None,None,None), + (5,62,"GtkWidget","width-request","100",None,None,None,None,None), + (5,63,"GtkLabel","label","Duplicates files","yes",None,None,None,None), + (5,63,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,63,"GtkWidget","visible","True",None,None,None,None,None), + (5,64,"GtkScrolledWindow","shadow-type","in",None,None,None,None,None), + (5,64,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,64,"GtkWidget","visible","True",None,None,None,None,None), + (5,65,"GtkLabel","label","Empty Directories","yes",None,None,None,None), + (5,65,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,65,"GtkWidget","visible","True",None,None,None,None,None), + (5,66,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (5,66,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,66,"GtkWidget","visible","True",None,None,None,None,None), + (5,67,"GtkBox","spacing","8",None,None,None,None,None), + (5,67,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,67,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,67,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,67,"GtkWidget","margin-top","2",None,None,None,None,None), + (5,67,"GtkWidget","visible","True",None,None,None,None,None), + (5,68,"GtkLabel","label","Number of shown files","yes",None,None,None,None), + (5,68,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,68,"GtkWidget","visible","True",None,None,None,None,None), + (5,69,"GtkEntry","caps-lock-warning","False",None,None,None,None,None), + (5,69,"GtkEntry","input-purpose","number",None,None,None,None,None), + (5,69,"GtkEntry","max-length","15",None,None,None,None,None), + (5,69,"GtkEntry","text","50","yes",None,None,None,None), + (5,69,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,69,"GtkWidget","visible","True",None,None,None,None,None), + (5,70,"GtkScrolledWindow","shadow-type","in",None,None,None,None,None), + (5,70,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,70,"GtkWidget","visible","True",None,None,None,None,None), + (5,71,"GtkLabel","label","Big Files","yes",None,None,None,None), + (5,71,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,71,"GtkWidget","visible","True",None,None,None,None,None), + (5,72,"GtkScrolledWindow","shadow-type","in",None,None,None,None,None), + (5,72,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,72,"GtkWidget","visible","True",None,None,None,None,None), + (5,73,"GtkLabel","label","Empty Files","yes",None,None,None,None), + (5,73,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,73,"GtkWidget","visible","True",None,None,None,None,None), + (5,74,"GtkScrolledWindow","shadow-type","in",None,None,None,None,None), + (5,74,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,74,"GtkWidget","visible","True",None,None,None,None,None), + (5,75,"GtkLabel","label","Temporary Files","yes",None,None,None,None), + (5,75,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,75,"GtkWidget","visible","True",None,None,None,None,None), + (5,76,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,76,"GtkWidget","visible","True",None,None,None,None,None), + (5,77,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (5,77,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,77,"GtkWidget","visible","True",None,None,None,None,None), + (5,78,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,78,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,78,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,78,"GtkWidget","margin-top","2",None,None,None,None,None), + (5,78,"GtkWidget","visible","True",None,None,None,None,None), + (5,79,"GtkLabel","label","Resize algorithm","yes",None,None,None,None), + (5,79,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,79,"GtkWidget","margin-end","2",None,None,None,None,None), + (5,79,"GtkWidget","visible","True",None,None,None,None,None), + (5,80,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,80,"GtkWidget","visible","True",None,None,None,None,None), + (5,81,"GtkLabel","label","Hash size:","yes",None,None,None,None), + (5,81,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,81,"GtkWidget","margin-end","2",None,None,None,None,None), + (5,81,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,81,"GtkWidget","visible","True",None,None,None,None,None), + (5,82,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,82,"GtkWidget","visible","True",None,None,None,None,None), + (5,83,"GtkLabel","label","Hash type:","yes",None,None,None,None), + (5,83,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,83,"GtkWidget","margin-end","2",None,None,None,None,None), + (5,83,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,83,"GtkWidget","visible","True",None,None,None,None,None), + (5,84,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,84,"GtkWidget","visible","True",None,None,None,None,None), + (5,85,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,85,"GtkWidget","margin-bottom","2",None,None,None,None,None), + (5,85,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,85,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,85,"GtkWidget","visible","True",None,None,None,None,None), + (5,86,"GtkLabel","label","Similarity ","yes",None,None,None,None), + (5,86,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,86,"GtkWidget","visible","True",None,None,None,None,None), + (5,87,"GtkLabel","label"," Very High ","yes",None,None,None,None), + (5,87,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,87,"GtkWidget","visible","True",None,None,None,None,None), + (5,88,"GtkRange","fill-level","100",None,None,None,None,None), + (5,88,"GtkRange","round-digits","1",None,None,None,None,None), + (5,88,"GtkScale","digits","0",None,None,None,None,None), + (5,88,"GtkScale","value-pos","right",None,None,None,None,None), + (5,88,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,88,"GtkWidget","visible","True",None,None,None,None,None), + (5,89,"GtkLabel","label","Minimal","yes",None,None,None,None), + (5,89,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,89,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,89,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,89,"GtkWidget","visible","True",None,None,None,None,None), + (5,90,"GtkButton","label","Ignore same size","yes",None,None,None,None), + (5,90,"GtkToggleButton","draw-indicator","True",None,None,None,None,None), + (5,90,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,90,"GtkWidget","margin-start","7",None,None,None,None,None), + (5,90,"GtkWidget","receives-default","False",None,None,None,None,None), + (5,90,"GtkWidget","visible","True",None,None,None,None,None), + (5,91,"GtkButton","label","Fast compare","yes",None,None,None,None), + (5,91,"GtkToggleButton","draw-indicator","True",None,None,None,None,None), + (5,91,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,91,"GtkWidget","margin-start","7",None,None,None,None,None), + (5,91,"GtkWidget","receives-default","False",None,None,None,None,None), + (5,91,"GtkWidget","visible","True",None,None,None,None,None), + (5,92,"GtkScrolledWindow","shadow-type","in",None,None,None,None,None), + (5,92,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,92,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,92,"GtkWidget","visible","True",None,None,None,None,None), + (5,93,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,93,"GtkWidget","height-request","80",None,None,None,None,None), + (5,93,"GtkWidget","valign","center",None,None,None,None,None), + (5,93,"GtkWidget","visible","True",None,None,None,None,None), + (5,93,"GtkWidget","width-request","100",None,None,None,None,None), + (5,94,"GtkLabel","label","Similar Images","yes",None,None,None,None), + (5,94,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,94,"GtkWidget","visible","True",None,None,None,None,None), + (5,95,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (5,95,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,95,"GtkWidget","visible","True",None,None,None,None,None), + (5,96,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,96,"GtkWidget","margin-bottom","2",None,None,None,None,None), + (5,96,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,96,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,96,"GtkWidget","visible","True",None,None,None,None,None), + (5,97,"GtkLabel","label","Similarity ","yes",None,None,None,None), + (5,97,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,97,"GtkWidget","visible","True",None,None,None,None,None), + (5,98,"GtkLabel","label"," Very High ","yes",None,None,None,None), + (5,98,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,98,"GtkWidget","visible","True",None,None,None,None,None), + (5,99,"GtkRange","fill-level","100",None,None,None,None,None), + (5,99,"GtkRange","round-digits","0",None,None,None,None,None), + (5,99,"GtkScale","digits","0",None,None,None,None,None), + (5,99,"GtkScale","value-pos","right",None,None,None,None,None), + (5,99,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,99,"GtkWidget","visible","True",None,None,None,None,None), + (5,100,"GtkLabel","label","Minimal","yes",None,None,None,None), + (5,100,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,100,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,100,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,100,"GtkWidget","visible","True",None,None,None,None,None), + (5,101,"GtkButton","label","Ignore same size","yes",None,None,None,None), + (5,101,"GtkToggleButton","draw-indicator","True",None,None,None,None,None), + (5,101,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,101,"GtkWidget","margin-start","7",None,None,None,None,None), + (5,101,"GtkWidget","receives-default","False",None,None,None,None,None), + (5,101,"GtkWidget","visible","True",None,None,None,None,None), + (5,102,"GtkScrolledWindow","shadow-type","in",None,None,None,None,None), + (5,102,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,102,"GtkWidget","visible","True",None,None,None,None,None), + (5,103,"GtkLabel","label","Similar Videos","yes",None,None,None,None), + (5,103,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,103,"GtkWidget","visible","True",None,None,None,None,None), + (5,104,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (5,104,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,104,"GtkWidget","visible","True",None,None,None,None,None), + (5,105,"GtkBox","spacing","8",None,None,None,None,None), + (5,105,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,105,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,105,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,105,"GtkWidget","visible","True",None,None,None,None,None), + (5,106,"GtkButton","label","Title","yes",None,None,None,None), + (5,106,"GtkToggleButton","active","True",None,None,None,None,None), + (5,106,"GtkToggleButton","draw-indicator","True",None,None,None,None,None), + (5,106,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,106,"GtkWidget","receives-default","False",None,None,None,None,None), + (5,106,"GtkWidget","visible","True",None,None,None,None,None), + (5,107,"GtkButton","label","Artist","yes",None,None,None,None), + (5,107,"GtkToggleButton","active","True",None,None,None,None,None), + (5,107,"GtkToggleButton","draw-indicator","True",None,None,None,None,None), + (5,107,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,107,"GtkWidget","receives-default","False",None,None,None,None,None), + (5,107,"GtkWidget","visible","True",None,None,None,None,None), + (5,108,"GtkButton","label","Year",None,None,None,None,None), + (5,108,"GtkToggleButton","draw-indicator","True",None,None,None,None,None), + (5,108,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,108,"GtkWidget","halign","start",None,None,None,None,None), + (5,108,"GtkWidget","receives-default","False",None,None,None,None,None), + (5,108,"GtkWidget","visible","True",None,None,None,None,None), + (5,109,"GtkButton","label","Bitrate",None,None,None,None,None), + (5,109,"GtkToggleButton","draw-indicator","True",None,None,None,None,None), + (5,109,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,109,"GtkWidget","receives-default","False",None,None,None,None,None), + (5,109,"GtkWidget","visible","True",None,None,None,None,None), + (5,110,"GtkButton","label","Genre",None,None,None,None,None), + (5,110,"GtkToggleButton","draw-indicator","True",None,None,None,None,None), + (5,110,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,110,"GtkWidget","receives-default","False",None,None,None,None,None), + (5,110,"GtkWidget","visible","True",None,None,None,None,None), + (5,111,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,111,"GtkWidget","margin-bottom","2",None,None,None,None,None), + (5,111,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,111,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,111,"GtkWidget","visible","True",None,None,None,None,None), + (5,112,"GtkButton","label","Approximate Comparison","yes",None,None,None,None), + (5,112,"GtkToggleButton","draw-indicator","True",None,None,None,None,None), + (5,112,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,112,"GtkWidget","receives-default","False",None,None,None,None,None), + (5,112,"GtkWidget","visible","True",None,None,None,None,None), + (5,113,"GtkScrolledWindow","shadow-type","in",None,None,None,None,None), + (5,113,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,113,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,113,"GtkWidget","visible","True",None,None,None,None,None), + (5,114,"GtkLabel","label","Music Duplicates","yes",None,None,None,None), + (5,114,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,114,"GtkWidget","visible","True",None,None,None,None,None), + (5,115,"GtkScrolledWindow","shadow-type","in",None,None,None,None,None), + (5,115,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,115,"GtkWidget","visible","True",None,None,None,None,None), + (5,116,"GtkLabel","label","Invalid Symlinks","yes",None,None,None,None), + (5,116,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,116,"GtkWidget","visible","True",None,None,None,None,None), + (5,117,"GtkScrolledWindow","shadow-type","in",None,None,None,None,None), + (5,117,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,117,"GtkWidget","visible","True",None,None,None,None,None), + (5,118,"GtkLabel","label","Broken Files","yes",None,None,None,None), + (5,118,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,118,"GtkWidget","visible","True",None,None,None,None,None), + (5,119,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,119,"GtkWidget","margin-bottom","5",None,None,None,None,None), + (5,119,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,119,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,119,"GtkWidget","margin-top","2",None,None,None,None,None), + (5,119,"GtkWidget","visible","True",None,None,None,None,None), + (5,120,"GtkBox","spacing","2",None,None,None,None,None), + (5,120,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,120,"GtkWidget","visible","True",None,None,None,None,None), + (5,121,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,121,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,121,"GtkWidget","visible","True",None,None,None,None,None), + (5,122,"GtkBox","spacing","2",None,None,None,None,None), + (5,122,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,122,"GtkWidget","halign","center",None,None,None,None,None), + (5,122,"GtkWidget","visible","True",None,None,None,None,None), + (5,123,"GtkImage","icon-name","edit-find",None,None,None,None,None), + (5,123,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,123,"GtkWidget","visible","True",None,None,None,None,None), + (5,124,"GtkLabel","label","Search","yes",None,None,None,None), + (5,124,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,124,"GtkWidget","visible","True",None,None,None,None,None), + (5,125,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,125,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,125,"GtkWidget","visible","True",None,None,None,None,None), + (5,126,"GtkImage","icon-name","format-justify-fill",None,None,None,None,None), + (5,126,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,126,"GtkWidget","halign","center",None,None,None,None,None), + (5,126,"GtkWidget","visible","True",None,None,None,None,None), + (5,127,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,127,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,127,"GtkWidget","visible","True",None,None,None,None,None), + (5,128,"GtkImage","icon-name","utilities-system-monitor",None,None,None,None,None), + (5,128,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,128,"GtkWidget","halign","center",None,None,None,None,None), + (5,128,"GtkWidget","visible","True",None,None,None,None,None), + (5,129,"GtkBox","spacing","2",None,None,None,None,None), + (5,129,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,129,"GtkWidget","visible","True",None,None,None,None,None), + (5,130,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,130,"GtkWidget","focus-on-click","False",None,None,None,None,None), + (5,130,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,130,"GtkWidget","visible","True",None,None,None,None,None), + (5,131,"GtkBox","spacing","2",None,None,None,None,None), + (5,131,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,131,"GtkWidget","halign","center",None,None,None,None,None), + (5,131,"GtkWidget","visible","True",None,None,None,None,None), + (5,132,"GtkImage","icon-name","edit-select-all",None,None,None,None,None), + (5,132,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,132,"GtkWidget","visible","True",None,None,None,None,None), + (5,133,"GtkLabel","label","Select","yes",None,None,None,None), + (5,133,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,133,"GtkWidget","visible","True",None,None,None,None,None), + (5,134,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,134,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,134,"GtkWidget","visible","True",None,None,None,None,None), + (5,135,"GtkBox","spacing","2",None,None,None,None,None), + (5,135,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,135,"GtkWidget","halign","center",None,None,None,None,None), + (5,135,"GtkWidget","visible","True",None,None,None,None,None), + (5,136,"GtkImage","icon-name","video-display",None,None,None,None,None), + (5,136,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,136,"GtkWidget","visible","True",None,None,None,None,None), + (5,137,"GtkLabel","label","Compare","yes",None,None,None,None), + (5,137,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,137,"GtkWidget","visible","True",None,None,None,None,None), + (5,138,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,138,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,138,"GtkWidget","visible","True",None,None,None,None,None), + (5,139,"GtkBox","spacing","2",None,None,None,None,None), + (5,139,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,139,"GtkWidget","halign","center",None,None,None,None,None), + (5,139,"GtkWidget","visible","True",None,None,None,None,None), + (5,140,"GtkImage","icon-name","list-remove",None,None,None,None,None), + (5,140,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,140,"GtkWidget","visible","True",None,None,None,None,None), + (5,141,"GtkLabel","label","Delete","yes",None,None,None,None), + (5,141,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,141,"GtkWidget","visible","True",None,None,None,None,None), + (5,142,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,142,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,142,"GtkWidget","visible","True",None,None,None,None,None), + (5,143,"GtkBox","spacing","2",None,None,None,None,None), + (5,143,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,143,"GtkWidget","halign","center",None,None,None,None,None), + (5,143,"GtkWidget","visible","True",None,None,None,None,None), + (5,144,"GtkImage","icon-name","folder",None,None,None,None,None), + (5,144,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,144,"GtkWidget","visible","True",None,None,None,None,None), + (5,145,"GtkLabel","label","Move","yes",None,None,None,None), + (5,145,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,145,"GtkWidget","visible","True",None,None,None,None,None), + (5,146,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,146,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,146,"GtkWidget","visible","True",None,None,None,None,None), + (5,147,"GtkBox","spacing","2",None,None,None,None,None), + (5,147,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,147,"GtkWidget","halign","center",None,None,None,None,None), + (5,147,"GtkWidget","visible","True",None,None,None,None,None), + (5,148,"GtkImage","icon-name","document-save",None,None,None,None,None), + (5,148,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,148,"GtkWidget","visible","True",None,None,None,None,None), + (5,149,"GtkLabel","label","Save","yes",None,None,None,None), + (5,149,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,149,"GtkWidget","visible","True",None,None,None,None,None), + (5,150,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,150,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,150,"GtkWidget","visible","True",None,None,None,None,None), + (5,151,"GtkBox","spacing","2",None,None,None,None,None), + (5,151,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,151,"GtkWidget","halign","center",None,None,None,None,None), + (5,151,"GtkWidget","visible","True",None,None,None,None,None), + (5,152,"GtkImage","icon-name","network-transmit-receive",None,None,None,None,None), + (5,152,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,152,"GtkWidget","visible","True",None,None,None,None,None), + (5,153,"GtkLabel","label","Symlink","yes",None,None,None,None), + (5,153,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,153,"GtkWidget","visible","True",None,None,None,None,None), + (5,154,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,154,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,154,"GtkWidget","visible","True",None,None,None,None,None), + (5,155,"GtkBox","spacing","2",None,None,None,None,None), + (5,155,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,155,"GtkWidget","halign","center",None,None,None,None,None), + (5,155,"GtkWidget","visible","True",None,None,None,None,None), + (5,156,"GtkImage","icon-name","text-x-generic-template",None,None,None,None,None), + (5,156,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,156,"GtkWidget","visible","True",None,None,None,None,None), + (5,157,"GtkLabel","label","Hardlink","yes",None,None,None,None), + (5,157,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,157,"GtkWidget","visible","True",None,None,None,None,None), + (5,158,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,158,"GtkWidget","margin-bottom","5",None,None,None,None,None), + (5,158,"GtkWidget","margin-end","5",None,None,None,None,None), + (5,158,"GtkWidget","margin-start","5",None,None,None,None,None), + (5,158,"GtkWidget","margin-top","5",None,None,None,None,None), + (5,158,"GtkWidget","visible","True",None,None,None,None,None), + (5,159,"GtkEntry","editable","False",None,None,None,None,None), + (5,159,"GtkEntry","has-frame","False",None,None,None,None,None), + (5,159,"GtkEntry","shadow-type","none",None,None,None,None,None), + (5,159,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,159,"GtkWidget","visible","True",None,None,None,None,None), + (5,160,"GtkEntry","caps-lock-warning","False",None,None,None,None,None), + (5,160,"GtkEntry","editable","False",None,None,None,None,None), + (5,160,"GtkEntry","has-frame","False",None,None,None,None,None), + (5,160,"GtkEntry","shadow-type","none",None,None,None,None,None), + (5,160,"GtkEntry","text","Czkawka 4.0.0","yes",None,None,None,None), + (5,160,"GtkEntry","xalign","1",None,None,None,None,None), + (5,160,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,160,"GtkWidget","visible","True",None,None,None,None,None), + (5,161,"GtkContainer","resize-mode","queue",None,None,None,None,None), + (5,161,"GtkScrolledWindow","min-content-height","100",None,None,None,None,None), + (5,161,"GtkScrolledWindow","shadow-type","in",None,None,None,None,None), + (5,161,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,161,"GtkWidget","visible","True",None,None,None,None,None), + (5,162,"GtkTextView","editable","False",None,None,None,None,None), + (5,162,"GtkTextView","monospace","True",None,None,None,None,None), + (5,162,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,162,"GtkWidget","visible","True",None,None,None,None,None), + (5,163,"GtkHeaderBar","show-close-button","True",None,None,None,None,None), + (5,163,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,163,"GtkWidget","visible","True",None,None,None,None,None), + (5,164,"GtkBox","spacing","5",None,None,None,None,None), + (5,164,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,164,"GtkWidget","visible","True",None,None,None,None,None), + (5,165,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,165,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,165,"GtkWidget","visible","True",None,None,None,None,None), + (5,166,"GtkImage","icon-name","applications-engineering",None,None,None,None,None), + (5,166,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,166,"GtkWidget","visible","True",None,None,None,None,None), + (5,167,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,167,"GtkWidget","receives-default","True",None,None,None,None,None), + (5,167,"GtkWidget","visible","True",None,None,None,None,None), + (5,168,"GtkImage","icon-name","dialog-information",None,None,None,None,None), + (5,168,"GtkWidget","can-focus","False",None,None,None,None,None), + (5,168,"GtkWidget","visible","True",None,None,None,None,None), + (5,169,"GtkButton","label","Length",None,None,None,None,None), + (5,169,"GtkButton","xalign","1.0",None,None,None,None,None), + (5,169,"GtkButton","yalign","0.9",None,None,None,None,None), + (5,169,"GtkToggleButton","draw-indicator","True",None,None,None,None,None), + (5,169,"GtkWidget","can-focus","True",None,None,None,None,None), + (5,169,"GtkWidget","receives-default","False",None,None,None,None,None), + (5,169,"GtkWidget","visible","True",None,None,None,None,None) + + + (5,3,4,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,3,4,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,3,4,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,3,119,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,3,119,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,3,119,"GtkBoxLayoutChild","position","3",None,None,None,None), + (5,3,158,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,3,158,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,3,158,"GtkBoxLayoutChild","position","4",None,None,None,None), + (5,3,161,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,3,161,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,3,161,"GtkBoxLayoutChild","pack-type","end",None,None,None,None), + (5,3,161,"GtkBoxLayoutChild","position","5",None,None,None,None), + (5,4,5,"GtkPanedLayoutChild","resize","False",None,None,None,None), + (5,4,5,"GtkPanedLayoutChild","shrink","False",None,None,None,None), + (5,4,53,"GtkPanedLayoutChild","resize","True",None,None,None,None), + (5,4,53,"GtkPanedLayoutChild","shrink","False",None,None,None,None), + (5,5,6,"GtkNotebookLayoutChild","tab-fill","False",None,None,None,None), + (5,5,22,"GtkNotebookLayoutChild","tab-fill","False",None,None,None,None), + (5,5,23,"GtkNotebookLayoutChild","position","1",None,None,None,None), + (5,5,38,"GtkNotebookLayoutChild","position","1",None,None,None,None), + (5,5,38,"GtkNotebookLayoutChild","tab-fill","False",None,None,None,None), + (5,5,39,"GtkNotebookLayoutChild","position","2",None,None,None,None), + (5,5,52,"GtkNotebookLayoutChild","position","2",None,None,None,None), + (5,5,52,"GtkNotebookLayoutChild","tab-fill","False",None,None,None,None), + (5,6,7,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,6,7,"GtkBoxLayoutChild","fill","False",None,None,None,None), + (5,6,7,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,6,20,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,6,20,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,6,20,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,6,21,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,6,21,"GtkBoxLayoutChild","fill","False",None,None,None,None), + (5,6,21,"GtkBoxLayoutChild","position","2",None,None,None,None), + (5,7,8,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,7,8,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,7,8,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,7,12,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,7,12,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,7,12,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,7,16,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,7,16,"GtkBoxLayoutChild","fill","False",None,None,None,None), + (5,7,16,"GtkBoxLayoutChild","position","2",None,None,None,None), + (5,9,10,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,9,10,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,9,10,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,9,11,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,9,11,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,9,11,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,13,14,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,13,14,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,13,14,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,13,15,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,13,15,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,13,15,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,17,18,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,17,18,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,17,18,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,17,19,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,17,19,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,17,19,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,23,24,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,23,24,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,23,24,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,23,37,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,23,37,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,23,37,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,24,25,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,24,25,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,24,25,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,24,29,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,24,29,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,24,29,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,24,33,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,24,33,"GtkBoxLayoutChild","fill","False",None,None,None,None), + (5,24,33,"GtkBoxLayoutChild","position","2",None,None,None,None), + (5,26,27,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,26,27,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,26,27,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,26,28,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,26,28,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,26,28,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,30,31,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,30,31,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,30,31,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,30,32,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,30,32,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,30,32,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,34,35,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,34,35,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,34,35,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,34,36,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,34,36,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,34,36,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,39,40,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,39,40,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,39,40,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,39,43,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,39,43,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,39,43,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,39,46,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,39,46,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,39,46,"GtkBoxLayoutChild","position","3",None,None,None,None), + (5,40,41,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,40,41,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,40,41,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,40,42,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,40,42,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,40,42,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,43,44,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,43,44,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,43,44,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,43,45,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,43,45,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,43,45,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,46,47,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,46,47,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,46,47,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,46,48,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,46,48,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,46,48,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,46,49,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,46,49,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,46,49,"GtkBoxLayoutChild","position","2",None,None,None,None), + (5,46,50,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,46,50,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,46,50,"GtkBoxLayoutChild","position","3",None,None,None,None), + (5,46,51,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,46,51,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,46,51,"GtkBoxLayoutChild","position","4",None,None,None,None), + (5,53,63,"GtkNotebookLayoutChild","tab-fill","False",None,None,None,None), + (5,53,64,"GtkNotebookLayoutChild","position","1",None,None,None,None), + (5,53,65,"GtkNotebookLayoutChild","position","1",None,None,None,None), + (5,53,65,"GtkNotebookLayoutChild","tab-fill","False",None,None,None,None), + (5,53,66,"GtkNotebookLayoutChild","position","2",None,None,None,None), + (5,53,71,"GtkNotebookLayoutChild","position","2",None,None,None,None), + (5,53,71,"GtkNotebookLayoutChild","tab-fill","False",None,None,None,None), + (5,53,72,"GtkNotebookLayoutChild","position","3",None,None,None,None), + (5,53,73,"GtkNotebookLayoutChild","position","3",None,None,None,None), + (5,53,73,"GtkNotebookLayoutChild","tab-fill","False",None,None,None,None), + (5,53,74,"GtkNotebookLayoutChild","position","4",None,None,None,None), + (5,53,75,"GtkNotebookLayoutChild","position","4",None,None,None,None), + (5,53,75,"GtkNotebookLayoutChild","tab-fill","False",None,None,None,None), + (5,53,76,"GtkNotebookLayoutChild","position","5",None,None,None,None), + (5,53,94,"GtkNotebookLayoutChild","position","5",None,None,None,None), + (5,53,94,"GtkNotebookLayoutChild","tab-fill","False",None,None,None,None), + (5,53,95,"GtkNotebookLayoutChild","position","6",None,None,None,None), + (5,53,103,"GtkNotebookLayoutChild","position","6",None,None,None,None), + (5,53,103,"GtkNotebookLayoutChild","tab-fill","False",None,None,None,None), + (5,53,104,"GtkNotebookLayoutChild","position","7",None,None,None,None), + (5,53,114,"GtkNotebookLayoutChild","position","7",None,None,None,None), + (5,53,114,"GtkNotebookLayoutChild","tab-fill","False",None,None,None,None), + (5,53,115,"GtkNotebookLayoutChild","position","8",None,None,None,None), + (5,53,116,"GtkNotebookLayoutChild","position","8",None,None,None,None), + (5,53,116,"GtkNotebookLayoutChild","tab-fill","False",None,None,None,None), + (5,53,117,"GtkNotebookLayoutChild","position","9",None,None,None,None), + (5,53,118,"GtkNotebookLayoutChild","position","9",None,None,None,None), + (5,53,118,"GtkNotebookLayoutChild","tab-fill","False",None,None,None,None), + (5,54,55,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,54,55,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,54,55,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,54,62,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,54,62,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,54,62,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,55,56,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,55,56,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,55,56,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,55,61,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,55,61,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,55,61,"GtkBoxLayoutChild","position","3",None,None,None,None), + (5,56,57,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,56,57,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,56,57,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,56,58,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,56,58,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,56,58,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,56,59,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,56,59,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,56,59,"GtkBoxLayoutChild","position","2",None,None,None,None), + (5,56,60,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,56,60,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,56,60,"GtkBoxLayoutChild","position","3",None,None,None,None), + (5,66,67,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,66,67,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,66,67,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,66,70,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,66,70,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,66,70,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,67,68,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,67,68,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,67,68,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,67,69,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,67,69,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,67,69,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,76,77,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,76,77,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,76,77,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,76,93,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,76,93,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,76,93,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,77,78,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,77,78,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,77,78,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,77,85,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,77,85,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,77,85,"GtkBoxLayoutChild","position","4",None,None,None,None), + (5,77,92,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,77,92,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,77,92,"GtkBoxLayoutChild","position","5",None,None,None,None), + (5,78,79,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,78,79,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,78,79,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,78,80,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,78,80,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,78,80,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,78,81,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,78,81,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,78,81,"GtkBoxLayoutChild","position","2",None,None,None,None), + (5,78,82,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,78,82,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,78,82,"GtkBoxLayoutChild","position","3",None,None,None,None), + (5,78,83,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,78,83,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,78,83,"GtkBoxLayoutChild","position","4",None,None,None,None), + (5,78,84,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,78,84,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,78,84,"GtkBoxLayoutChild","position","5",None,None,None,None), + (5,85,86,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,85,86,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,85,86,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,85,87,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,85,87,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,85,87,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,85,88,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,85,88,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,85,88,"GtkBoxLayoutChild","position","2",None,None,None,None), + (5,85,89,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,85,89,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,85,89,"GtkBoxLayoutChild","position","3",None,None,None,None), + (5,85,90,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,85,90,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,85,90,"GtkBoxLayoutChild","position","4",None,None,None,None), + (5,85,91,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,85,91,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,85,91,"GtkBoxLayoutChild","position","5",None,None,None,None), + (5,95,96,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,95,96,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,95,96,"GtkBoxLayoutChild","position","4",None,None,None,None), + (5,95,102,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,95,102,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,95,102,"GtkBoxLayoutChild","position","5",None,None,None,None), + (5,96,97,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,96,97,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,96,97,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,96,98,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,96,98,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,96,98,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,96,99,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,96,99,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,96,99,"GtkBoxLayoutChild","position","2",None,None,None,None), + (5,96,100,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,96,100,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,96,100,"GtkBoxLayoutChild","position","3",None,None,None,None), + (5,96,101,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,96,101,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,96,101,"GtkBoxLayoutChild","position","4",None,None,None,None), + (5,104,105,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,104,105,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,104,105,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,104,111,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,104,111,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,104,111,"GtkBoxLayoutChild","position","2",None,None,None,None), + (5,104,113,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,104,113,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,104,113,"GtkBoxLayoutChild","position","3",None,None,None,None), + (5,105,106,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,105,106,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,105,106,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,105,107,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,105,107,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,105,107,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,105,108,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,105,108,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,105,108,"GtkBoxLayoutChild","position","2",None,None,None,None), + (5,105,109,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,105,109,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,105,109,"GtkBoxLayoutChild","position","3",None,None,None,None), + (5,105,110,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,105,110,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,105,110,"GtkBoxLayoutChild","position","4",None,None,None,None), + (5,111,112,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,111,112,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,111,112,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,119,120,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,119,120,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,119,120,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,119,125,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,119,125,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,119,125,"GtkBoxLayoutChild","pack-type","end",None,None,None,None), + (5,119,125,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,119,127,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,119,127,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,119,127,"GtkBoxLayoutChild","pack-type","end",None,None,None,None), + (5,119,127,"GtkBoxLayoutChild","position","2",None,None,None,None), + (5,119,129,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,119,129,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,119,129,"GtkBoxLayoutChild","pack-type","end",None,None,None,None), + (5,119,129,"GtkBoxLayoutChild","position","3",None,None,None,None), + (5,120,121,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,120,121,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,120,121,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,122,123,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,122,123,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,122,123,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,122,124,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,122,124,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,122,124,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,129,130,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,129,130,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,129,130,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,129,134,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,129,134,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,129,134,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,129,138,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,129,138,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,129,138,"GtkBoxLayoutChild","position","2",None,None,None,None), + (5,129,142,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,129,142,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,129,142,"GtkBoxLayoutChild","position","3",None,None,None,None), + (5,129,146,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,129,146,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,129,146,"GtkBoxLayoutChild","position","4",None,None,None,None), + (5,129,150,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,129,150,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,129,150,"GtkBoxLayoutChild","position","5",None,None,None,None), + (5,129,154,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,129,154,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,129,154,"GtkBoxLayoutChild","position","6",None,None,None,None), + (5,131,132,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,131,132,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,131,132,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,131,133,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,131,133,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,131,133,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,135,136,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,135,136,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,135,136,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,135,137,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,135,137,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,135,137,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,139,140,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,139,140,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,139,140,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,139,141,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,139,141,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,139,141,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,143,144,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,143,144,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,143,144,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,143,145,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,143,145,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,143,145,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,147,148,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,147,148,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,147,148,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,147,149,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,147,149,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,147,149,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,151,152,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,151,152,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,151,152,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,151,153,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,151,153,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,151,153,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,155,156,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,155,156,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,155,156,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,155,157,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,155,157,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,155,157,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,158,159,"GtkBoxLayoutChild","expand","True",None,None,None,None), + (5,158,159,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,158,159,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,158,160,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,158,160,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,158,160,"GtkBoxLayoutChild","pack-type","end",None,None,None,None), + (5,158,160,"GtkBoxLayoutChild","position","1",None,None,None,None), + (5,163,164,"GtkHeaderBarLayoutChild","pack-type","end",None,None,None,None), + (5,164,165,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,164,165,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,164,165,"GtkBoxLayoutChild","position","0",None,None,None,None), + (5,164,167,"GtkBoxLayoutChild","expand","False",None,None,None,None), + (5,164,167,"GtkBoxLayoutChild","fill","True",None,None,None,None), + (5,164,167,"GtkBoxLayoutChild","position","1",None,None,None,None) + + diff --git a/czkawka_gui/ui/main_window.glade b/czkawka_gui/ui/main_window.ui similarity index 98% rename from czkawka_gui/ui/main_window.glade rename to czkawka_gui/ui/main_window.ui index e49b909..9fa19af 100644 --- a/czkawka_gui/ui/main_window.glade +++ b/czkawka_gui/ui/main_window.ui @@ -1,4 +1,5 @@ - + + - - + + - 100 - 1 10 + 1 + 100 False - 1100 800 + 1100 - True False vertical + True - True True vertical + True - True True + True - True False - 5 5 + 5 5 + True - True False 5 vertical 1 + True - True True True + True - True False center 4 + True - True False list-add + True False @@ -94,9 +95,9 @@ Author: Rafał Mikrut - True False Add + True False @@ -115,20 +116,20 @@ Author: Rafał Mikrut - True True True + True - True False center 4 + True - True False list-remove + True False @@ -138,9 +139,9 @@ Author: Rafał Mikrut - True False Remove + True False @@ -159,20 +160,20 @@ Author: Rafał Mikrut - True True True + True - True False center 4 + True - True False insert-link + True False @@ -182,9 +183,9 @@ Author: Rafał Mikrut - True False Manual Add + True False @@ -210,12 +211,9 @@ Author: Rafał Mikrut - True True in - - - + True True @@ -225,13 +223,13 @@ Author: Rafał Mikrut - Recursive - True - True - False - 5 True + True True + Recursive + 5 + False + True False @@ -246,9 +244,9 @@ Author: Rafał Mikrut - True False Included Directories + True False @@ -256,34 +254,34 @@ Author: Rafał Mikrut - True False - 5 5 + 5 6 + True - True False 5 vertical 1 + True - True True True + True - True False center 4 + True - True False list-add + True False @@ -293,9 +291,9 @@ Author: Rafał Mikrut - True False Add + True False @@ -314,20 +312,20 @@ Author: Rafał Mikrut - True True True + True - True False center 4 + True - True False list-remove + True False @@ -337,9 +335,9 @@ Author: Rafał Mikrut - True False Remove + True False @@ -358,20 +356,20 @@ Author: Rafał Mikrut - True True True + True - True False center 4 + True - True False insert-link + True False @@ -381,9 +379,9 @@ Author: Rafał Mikrut - True False Manual Add + True False @@ -409,12 +407,9 @@ Author: Rafał Mikrut - True True in - - - + True True @@ -429,9 +424,9 @@ Author: Rafał Mikrut - True False Excluded Directories + True 1 @@ -440,22 +435,22 @@ Author: Rafał Mikrut - True False - center vertical + center + True - True False - 5 5 + 5 5 + True - True False Excluded items + True False @@ -465,9 +460,9 @@ Author: Rafał Mikrut - True True */.git,*/node_modules,*/lost+found + True True @@ -484,16 +479,16 @@ Author: Rafał Mikrut - True False - 5 5 + 5 5 + True - True False Allowed Extensions + True False @@ -503,8 +498,8 @@ Author: Rafał Mikrut - True True + True True @@ -521,16 +516,16 @@ Author: Rafał Mikrut - True False - 5 5 + 5 8 + True - True False File Size(bytes) + True False @@ -540,9 +535,9 @@ Author: Rafał Mikrut - True False Min: + True False @@ -552,12 +547,12 @@ Author: Rafał Mikrut - True True - 15 - 8192 False number + 15 + 8192 + True True @@ -567,9 +562,9 @@ Author: Rafał Mikrut - True False Max: + True False @@ -579,12 +574,12 @@ Author: Rafał Mikrut - True True - 15 - 1099512000000 False number + 15 + 1099512000000 + True True @@ -606,9 +601,9 @@ Author: Rafał Mikrut - True False Items Configuration + True 2 @@ -623,32 +618,32 @@ Author: Rafał Mikrut - True True - left True + left + True - True False + True - True False vertical + True - True False - 5 5 + 5 2 + True - True False - 3 Check method + 3 + True False @@ -658,8 +653,8 @@ Author: Rafał Mikrut - True False + True False @@ -669,11 +664,11 @@ Author: Rafał Mikrut - True False - 5 - 2 Hash type + 2 + 5 + True False @@ -683,8 +678,8 @@ Author: Rafał Mikrut - True False + True False @@ -701,13 +696,10 @@ Author: Rafał Mikrut - True True 5 in - - - + True True @@ -724,11 +716,11 @@ Author: Rafał Mikrut - 100 - 80 - True False + 80 center + True + 100 False @@ -740,9 +732,9 @@ Author: Rafał Mikrut - True False Duplicates files + True False @@ -750,12 +742,9 @@ Author: Rafał Mikrut - True True in - - - + True 1 @@ -763,9 +752,9 @@ Author: Rafał Mikrut - True False Empty Directories + True 1 @@ -774,22 +763,22 @@ Author: Rafał Mikrut - True False vertical + True - True False - 5 5 + 5 2 8 + True - True False Number of shown files + True False @@ -799,12 +788,12 @@ Author: Rafał Mikrut - True True - 15 - 50 False number + 15 + 50 + True True @@ -821,12 +810,9 @@ Author: Rafał Mikrut - True True in - - - + True True @@ -841,9 +827,9 @@ Author: Rafał Mikrut - True False Big Files + True 2 @@ -852,12 +838,9 @@ Author: Rafał Mikrut - True True in - - - + True 3 @@ -865,9 +848,9 @@ Author: Rafał Mikrut - True False Empty Files + True 3 @@ -876,12 +859,9 @@ Author: Rafał Mikrut - True True in - - - + True 4 @@ -889,9 +869,9 @@ Author: Rafał Mikrut - True False Temporary Files + True 4 @@ -900,26 +880,26 @@ Author: Rafał Mikrut - True False + True - True False vertical + True - True False - 5 5 + 5 2 + True - True False - 2 Resize algorithm + 2 + True False @@ -929,8 +909,8 @@ Author: Rafał Mikrut - True False + True False @@ -940,11 +920,11 @@ Author: Rafał Mikrut - True False - 5 - 2 Hash size: + 2 + 5 + True False @@ -954,8 +934,8 @@ Author: Rafał Mikrut - True False + True False @@ -965,11 +945,11 @@ Author: Rafał Mikrut - True False - 5 - 2 Hash type: + 2 + 5 + True False @@ -979,8 +959,8 @@ Author: Rafał Mikrut - True False + True False @@ -997,16 +977,16 @@ Author: Rafał Mikrut - True False - 5 - 5 2 + 5 + 5 + True - True False Similarity + True False @@ -1016,9 +996,9 @@ Author: Rafał Mikrut - True False Very High + True False @@ -1028,12 +1008,12 @@ Author: Rafał Mikrut - True True + 0 100 1 - 0 right + True True @@ -1043,11 +1023,11 @@ Author: Rafał Mikrut - True False - 5 - 5 Minimal + 5 + 5 + True False @@ -1057,12 +1037,12 @@ Author: Rafał Mikrut - Ignore same size - True True - False - 7 True + Ignore same size + 7 + False + True False @@ -1072,12 +1052,12 @@ Author: Rafał Mikrut - Fast compare - True True - False - 7 True + Fast compare + 7 + False + True False @@ -1094,13 +1074,10 @@ Author: Rafał Mikrut - True True 5 in - - - + True True @@ -1117,11 +1094,11 @@ Author: Rafał Mikrut - 100 - 80 - True False + 80 center + True + 100 False @@ -1136,9 +1113,9 @@ Author: Rafał Mikrut - True False Similar Images + True 5 @@ -1147,21 +1124,21 @@ Author: Rafał Mikrut - True False vertical + True - True False - 5 - 5 2 + 5 + 5 + True - True False Similarity + True False @@ -1171,9 +1148,9 @@ Author: Rafał Mikrut - True False Very High + True False @@ -1183,12 +1160,12 @@ Author: Rafał Mikrut - True True + 0 100 0 - 0 right + True True @@ -1198,11 +1175,11 @@ Author: Rafał Mikrut - True False - 5 - 5 Minimal + 5 + 5 + True False @@ -1212,12 +1189,12 @@ Author: Rafał Mikrut - Ignore same size - True True - False - 7 True + Ignore same size + 7 + False + True False @@ -1234,12 +1211,9 @@ Author: Rafał Mikrut - True True in - - - + True True @@ -1254,9 +1228,9 @@ Author: Rafał Mikrut - True False Similar Videos + True 6 @@ -1265,24 +1239,24 @@ Author: Rafał Mikrut - True False vertical + True - True False - 5 5 + 5 8 + True - Title - True - True - False True + True True + Title + False + True False @@ -1292,12 +1266,12 @@ Author: Rafał Mikrut - Artist - True - True - False True + True True + Artist + False + True False @@ -1306,12 +1280,13 @@ Author: Rafał Mikrut - - Album Title - True + True - False True + start + Year + False + True False @@ -1320,12 +1295,12 @@ Author: Rafał Mikrut - - Album Artist - True + True - False True + Bitrate + False + True False @@ -1334,12 +1309,12 @@ Author: Rafał Mikrut - - Year - True + True - False True + Genre + False + True False @@ -1347,6 +1322,17 @@ Author: Rafał Mikrut 4 + + + True + True + Length + False + True + 1.0 + 0.9 + + False @@ -1356,18 +1342,18 @@ Author: Rafał Mikrut - True False - 5 - 5 2 + 5 + 5 + True - Approximate Comparison - True True - False True + Approximate Comparison + False + True False @@ -1384,13 +1370,10 @@ Author: Rafał Mikrut - True True 5 in - - - + True True @@ -1405,9 +1388,9 @@ Author: Rafał Mikrut - True False Music Duplicates + True 7 @@ -1416,12 +1399,9 @@ Author: Rafał Mikrut - True True in - - - + True 8 @@ -1429,9 +1409,9 @@ Author: Rafał Mikrut - True False Invalid Symlinks + True 8 @@ -1440,12 +1420,9 @@ Author: Rafał Mikrut - True True in - - - + True 9 @@ -1453,9 +1430,9 @@ Author: Rafał Mikrut - True False Broken Files + True 9 @@ -1477,33 +1454,33 @@ Author: Rafał Mikrut - True False - 5 - 5 - 2 5 + 5 + 5 + 2 + True - True False 2 + True - True True True + True - True False center 2 + True - True False edit-find + True False @@ -1513,9 +1490,9 @@ Author: Rafał Mikrut - True False Search + True False @@ -1541,15 +1518,15 @@ Author: Rafał Mikrut - True True True + True - True False center format-justify-fill + True @@ -1562,15 +1539,15 @@ Author: Rafał Mikrut - True True True + True - True False center utilities-system-monitor + True @@ -1583,26 +1560,26 @@ Author: Rafał Mikrut - True False 2 + True - True True False True + True - True False center 2 + True - True False edit-select-all + True False @@ -1612,9 +1589,9 @@ Author: Rafał Mikrut - True False Select + True False @@ -1633,20 +1610,20 @@ Author: Rafał Mikrut - True True True + True - True False center 2 + True - True False video-display + True False @@ -1656,9 +1633,9 @@ Author: Rafał Mikrut - True False Compare + True False @@ -1677,20 +1654,20 @@ Author: Rafał Mikrut - True True True + True - True False center 2 + True - True False list-remove + True False @@ -1700,9 +1677,9 @@ Author: Rafał Mikrut - True False Delete + True False @@ -1721,20 +1698,20 @@ Author: Rafał Mikrut - True True True + True - True False center 2 + True - True False folder + True False @@ -1744,9 +1721,9 @@ Author: Rafał Mikrut - True False Move + True False @@ -1765,20 +1742,20 @@ Author: Rafał Mikrut - True True True + True - True False center 2 + True - True False document-save + True False @@ -1788,9 +1765,9 @@ Author: Rafał Mikrut - True False Save + True False @@ -1809,20 +1786,20 @@ Author: Rafał Mikrut - True True True + True - True False center 2 + True - True False network-transmit-receive + True False @@ -1832,9 +1809,9 @@ Author: Rafał Mikrut - True False Symlink + True False @@ -1853,20 +1830,20 @@ Author: Rafał Mikrut - True True True + True - True False center 2 + True - True False text-x-generic-template + True False @@ -1876,9 +1853,9 @@ Author: Rafał Mikrut - True False Hardlink + True False @@ -1912,19 +1889,19 @@ Author: Rafał Mikrut - True False - 5 - 5 - 5 5 + 5 + 5 + 5 + True - True True False False none + True True @@ -1934,14 +1911,14 @@ Author: Rafał Mikrut - True True + False False False - Czkawka 4.0.0 - 1 none - False + Czkawka 4.0.0 + True + 1 False @@ -1959,17 +1936,17 @@ Author: Rafał Mikrut - True True + 100 queue in - 100 + True - True True False True + True @@ -1984,24 +1961,24 @@ Author: Rafał Mikrut - True False True + True - True False 5 + True - True True True + True - True False applications-engineering + True @@ -2013,14 +1990,14 @@ Author: Rafał Mikrut - True True True + True - True False dialog-information + True diff --git a/czkawka_gui/ui/popover_right_click.glade b/czkawka_gui/ui/popover_right_click.ui similarity index 100% rename from czkawka_gui/ui/popover_right_click.glade rename to czkawka_gui/ui/popover_right_click.ui diff --git a/czkawka_gui/ui/popover_select.glade b/czkawka_gui/ui/popover_select.ui similarity index 100% rename from czkawka_gui/ui/popover_select.glade rename to czkawka_gui/ui/popover_select.ui diff --git a/czkawka_gui/ui/progress.glade b/czkawka_gui/ui/progress.ui similarity index 100% rename from czkawka_gui/ui/progress.glade rename to czkawka_gui/ui/progress.ui diff --git a/czkawka_gui/ui/settings.glade b/czkawka_gui/ui/settings.ui similarity index 100% rename from czkawka_gui/ui/settings.glade rename to czkawka_gui/ui/settings.ui