From aa07d73bcabfdcac03dd2f45c89fd098406d9dbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= <41945903+qarmin@users.noreply.github.com> Date: Sun, 10 Apr 2022 11:59:41 +0200 Subject: [PATCH] Case insensitive name checking (#669) * Case insensitive checking in name duplicates * Hide instead disable --- Cargo.lock | 48 +++++++++---------- czkawka_core/Cargo.toml | 12 ++--- czkawka_core/src/duplicate.rs | 14 +++++- czkawka_core/src/same_music.rs | 2 +- czkawka_gui/i18n/en/czkawka_gui.ftl | 6 +++ czkawka_gui/src/compute_results.rs | 12 +---- .../connect_things/connect_button_hardlink.rs | 6 --- .../connect_things/connect_button_search.rs | 4 ++ .../connect_duplicate_buttons.rs | 14 +++++- .../src/gui_structs/gui_main_notebook.rs | 6 +++ czkawka_gui/src/saving_loading.rs | 32 +++++++++++++ czkawka_gui/ui/czkawka.cmb | 3 ++ czkawka_gui/ui/main_window.ui | 8 ++++ 13 files changed, 117 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eec3589..505b051 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -646,9 +646,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbcc37e3091b4dfd0af76cb0087b9c89b8e03072abc28ae2efc8fdd733bfc5f5" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" dependencies = [ "darling_core", "darling_macro", @@ -656,9 +656,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9569a966dba8cd57879b8efd2bf82b5c56bb466e19767a69c560bddee1a27f5c" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" dependencies = [ "fnv", "ident_case", @@ -670,9 +670,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efae147148c6380157050146a2040b65dbe91bef6e97aaaa39ef0d469d2eb4af" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ "darling_core", "quote", @@ -1546,9 +1546,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.56" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" +checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" dependencies = [ "wasm-bindgen", ] @@ -1584,9 +1584,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.121" +version = "0.2.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" +checksum = "ec647867e2bf0772e28c8bcde4f0d19a9216916e890543b5a03ed8ef27b8f259" [[package]] name = "libloading" @@ -1629,9 +1629,9 @@ dependencies = [ [[package]] name = "lofty" -version = "0.5.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc751ba10f732cf5c522b9bc887027c9eee277512a38a3a0c4f1806bdcd730d" +checksum = "a944022a74ee371dbf1f36839f4a589822e8c980d1265f086eb540648c78083a" dependencies = [ "base64 0.13.0", "byteorder", @@ -3023,9 +3023,9 @@ checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasm-bindgen" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" +checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -3033,9 +3033,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" +checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" dependencies = [ "bumpalo", "lazy_static", @@ -3048,9 +3048,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" +checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3058,9 +3058,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" +checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" dependencies = [ "proc-macro2", "quote", @@ -3071,15 +3071,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" +checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" [[package]] name = "web-sys" -version = "0.3.56" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" +checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/czkawka_core/Cargo.toml b/czkawka_core/Cargo.toml index 2e702ec..407f91b 100644 --- a/czkawka_core/Cargo.toml +++ b/czkawka_core/Cargo.toml @@ -25,7 +25,7 @@ hamming = "0.1.3" # Needed by same music bitflags = "1.3.2" -lofty="0.5.3" +lofty="0.6.0" # Futures - needed by async progress sender futures = "0.3.21" @@ -46,15 +46,15 @@ vid_dup_finder_lib = "0.1.0" ffmpeg_cmdline_utils = "0.1.1" # Saving/Loading Cache -serde = "1.0.133" +serde = "1.0.136" bincode = "1.3.3" -serde_json = "1.0.74" +serde_json = "1.0.79" # Language -i18n-embed = { version = "0.13", features = ["fluent-system", "desktop-requester"] } -i18n-embed-fl = "0.6.1" +i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } +i18n-embed-fl = "0.6.4" rust-embed = "6.3.0" -once_cell = "1.9.0" +once_cell = "1.10.0" # Raw image files rawloader = "0.37.0" diff --git a/czkawka_core/src/duplicate.rs b/czkawka_core/src/duplicate.rs index 5ea5d5f..d2efbb6 100644 --- a/czkawka_core/src/duplicate.rs +++ b/czkawka_core/src/duplicate.rs @@ -103,6 +103,7 @@ pub struct DuplicateFinder { minimal_prehash_cache_file_size: u64, delete_outdated_cache: bool, use_reference_folders: bool, + case_sensitive_name_comparison: bool, } impl DuplicateFinder { @@ -134,6 +135,7 @@ impl DuplicateFinder { minimal_prehash_cache_file_size: 0, delete_outdated_cache: true, use_reference_folders: false, + case_sensitive_name_comparison: false, } } @@ -176,6 +178,10 @@ impl DuplicateFinder { self.delete_outdated_cache = delete_outdated_cache; } + pub fn set_case_sensitive_name_comparison(&mut self, case_sensitive_name_comparison: bool) { + self.case_sensitive_name_comparison = case_sensitive_name_comparison; + } + pub const fn get_check_method(&self) -> &CheckingMethod { &self.check_method } @@ -293,9 +299,15 @@ impl DuplicateFinder { } fn check_files_name(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender>) -> bool { + let group_by_func = if self.case_sensitive_name_comparison { + |fe: &FileEntry| fe.path.file_name().unwrap().to_string_lossy().to_string() + } else { + |fe: &FileEntry| fe.path.file_name().unwrap().to_string_lossy().to_lowercase() + }; + let result = DirTraversalBuilder::new() .root_dirs(self.directories.included_directories.clone()) - .group_by(|fe| fe.path.file_name().unwrap().to_string_lossy().to_string()) + .group_by(group_by_func) .stop_receiver(stop_receiver) .progress_sender(progress_sender) .checking_method(CheckingMethod::Name) diff --git a/czkawka_core/src/same_music.rs b/czkawka_core/src/same_music.rs index dcfa562..f10bfcb 100644 --- a/czkawka_core/src/same_music.rs +++ b/czkawka_core/src/same_music.rs @@ -10,7 +10,7 @@ use std::time::{Duration, SystemTime}; use std::{mem, thread}; use crossbeam_channel::Receiver; -use lofty::{read_from_path, ItemKey}; +use lofty::{read_from_path, AudioFile, ItemKey}; use rayon::prelude::*; use serde::{Deserialize, Serialize}; diff --git a/czkawka_gui/i18n/en/czkawka_gui.ftl b/czkawka_gui/i18n/en/czkawka_gui.ftl index b2b98ea..88f6034 100644 --- a/czkawka_gui/i18n/en/czkawka_gui.ftl +++ b/czkawka_gui/i18n/en/czkawka_gui.ftl @@ -22,6 +22,12 @@ music_comparison_checkbox_tooltip = Świędziżłób --- Świędziżłób (Remix Lato 2021) +duplicate_case_sensitive_name = Case Sensitive +duplicate_case_sensitive_name_tooltip = + When enabled, group only records when they have exactly same name e.g. Żołd <-> Żołd + + Disabling such option will group names without checking if each letter is same size e.g. żoŁD <-> Żołd + duplicate_mode_name_combo_box = Name duplicate_mode_size_combo_box = Size duplicate_mode_hash_combo_box = Hash diff --git a/czkawka_gui/src/compute_results.rs b/czkawka_gui/src/compute_results.rs index 417dd20..d8c055e 100644 --- a/czkawka_gui/src/compute_results.rs +++ b/czkawka_gui/src/compute_results.rs @@ -173,11 +173,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< (ColumnsDuplicates::Path as u32, &directory), ( ColumnsDuplicates::Modification as u32, - &(format!( - "{} - ({})", - NaiveDateTime::from_timestamp(base_file_entry.modified_date as i64, 0), - base_file_entry.size.file_size(options::BINARY).unwrap() - )), + &(NaiveDateTime::from_timestamp(base_file_entry.modified_date as i64, 0).to_string()), ), (ColumnsDuplicates::ModificationAsSecs as u32, &(base_file_entry.modified_date)), (ColumnsDuplicates::Color as u32, &(HEADER_ROW_COLOR.to_string())), @@ -197,11 +193,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< (ColumnsDuplicates::Path as u32, &directory), ( ColumnsDuplicates::Modification as u32, - &(format!( - "{} - ({})", - NaiveDateTime::from_timestamp(entry.modified_date as i64, 0), - entry.size.file_size(options::BINARY).unwrap() - )), + &(NaiveDateTime::from_timestamp(entry.modified_date as i64, 0).to_string()), ), (ColumnsDuplicates::ModificationAsSecs as u32, &(entry.modified_date)), (ColumnsDuplicates::Color as u32, &(MAIN_ROW_COLOR.to_string())), diff --git a/czkawka_gui/src/connect_things/connect_button_hardlink.rs b/czkawka_gui/src/connect_things/connect_button_hardlink.rs index 75239f9..6f13037 100644 --- a/czkawka_gui/src/connect_things/connect_button_hardlink.rs +++ b/czkawka_gui/src/connect_things/connect_button_hardlink.rs @@ -201,16 +201,10 @@ fn hardlink_symlink( if hardlinking == TypeOfTool::Hardlinking { for symhardlink_data in vec_symhardlink_data { for file_to_hardlink in symhardlink_data.files_to_symhardlink { - // #[cfg(target_family = "unix")] if let Err(e) = make_hard_link(&PathBuf::from(&symhardlink_data.original_data), &PathBuf::from(&file_to_hardlink)) { add_text_to_text_view(text_view_errors, format!("{} {}, reason {}", flg!("hardlink_failed"), file_to_hardlink, e).as_str()); continue; } - // #[cfg(target_family = "windows")] - // if let Err(e) = fs::hard_link(&PathBuf::from(&symhardlink_data.original_data), &PathBuf::from(&file_to_hardlink)) { - // add_text_to_text_view(text_view_errors, format!("{} {}, reason {}", flg!("hardlink_failed"), file_to_hardlink, e).as_str()); - // continue; - // } } } } else { diff --git a/czkawka_gui/src/connect_things/connect_button_search.rs b/czkawka_gui/src/connect_things/connect_button_search.rs index 5ddde02..9e1084e 100644 --- a/czkawka_gui/src/connect_things/connect_button_search.rs +++ b/czkawka_gui/src/connect_things/connect_button_search.rs @@ -53,6 +53,7 @@ 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_duplicate_case_sensitive_name: gtk::CheckButton = gui_data.main_notebook.check_button_duplicate_case_sensitive_name.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(); @@ -178,6 +179,8 @@ pub fn connect_button_search( let use_prehash_cache = check_button_duplicates_use_prehash_cache.is_active(); let minimal_prehash_cache_file_size = entry_settings_prehash_cache_file_minimal_size.text().as_str().parse::().unwrap_or(0); + let case_sensitive_name_comparison = check_button_duplicate_case_sensitive_name.is_active(); + let delete_outdated_cache = check_button_settings_duplicates_delete_outdated_cache.is_active(); let futures_sender_duplicate_files = futures_sender_duplicate_files.clone(); @@ -200,6 +203,7 @@ pub fn connect_button_search( df.set_use_cache(use_cache); df.set_use_prehash_cache(use_prehash_cache); df.set_delete_outdated_cache(delete_outdated_cache); + df.set_case_sensitive_name_comparison(case_sensitive_name_comparison); df.find_duplicates(Some(&stop_receiver), Some(&futures_sender_duplicate_files)); let _ = glib_stop_sender.send(Message::Duplicates(df)); }); diff --git a/czkawka_gui/src/connect_things/connect_duplicate_buttons.rs b/czkawka_gui/src/connect_things/connect_duplicate_buttons.rs index 975fffe..cb9d535 100644 --- a/czkawka_gui/src/connect_things/connect_duplicate_buttons.rs +++ b/czkawka_gui/src/connect_things/connect_duplicate_buttons.rs @@ -8,13 +8,23 @@ use crate::help_combo_box::DUPLICATES_CHECK_METHOD_COMBO_BOX; pub fn connect_duplicate_combo_box(gui_data: &GuiData) { let combo_box_duplicate_check_method = gui_data.main_notebook.combo_box_duplicate_check_method.clone(); let combo_box_duplicate_hash_type = gui_data.main_notebook.combo_box_duplicate_hash_type.clone(); + let label_duplicate_hash_type = gui_data.main_notebook.label_duplicate_hash_type.clone(); + let check_button_duplicate_case_sensitive_name = gui_data.main_notebook.check_button_duplicate_case_sensitive_name.clone(); combo_box_duplicate_check_method.connect_changed(move |combo_box_duplicate_check_method| { // None active can be if when adding elements(this signal is activated when e.g. adding new fields or removing them) if let Some(chosen_index) = combo_box_duplicate_check_method.active() { if DUPLICATES_CHECK_METHOD_COMBO_BOX[chosen_index as usize].check_method == CheckingMethod::Hash { - combo_box_duplicate_hash_type.set_sensitive(true); + combo_box_duplicate_hash_type.set_visible(true); + label_duplicate_hash_type.set_visible(true); } else { - combo_box_duplicate_hash_type.set_sensitive(false); + combo_box_duplicate_hash_type.set_visible(false); + label_duplicate_hash_type.set_visible(false); + } + + if DUPLICATES_CHECK_METHOD_COMBO_BOX[chosen_index as usize].check_method == CheckingMethod::Name { + check_button_duplicate_case_sensitive_name.set_visible(true); + } else { + check_button_duplicate_case_sensitive_name.set_visible(false); } } }); diff --git a/czkawka_gui/src/gui_structs/gui_main_notebook.rs b/czkawka_gui/src/gui_structs/gui_main_notebook.rs index 7ae62a7..57aa0d9 100644 --- a/czkawka_gui/src/gui_structs/gui_main_notebook.rs +++ b/czkawka_gui/src/gui_structs/gui_main_notebook.rs @@ -65,6 +65,7 @@ pub struct GuiMainNotebook { pub combo_box_duplicate_hash_type: gtk::ComboBoxText, pub label_duplicate_check_method: gtk::Label, pub label_duplicate_hash_type: gtk::Label, + pub check_button_duplicate_case_sensitive_name: gtk::CheckButton, pub image_preview_duplicates: gtk::Image, @@ -198,6 +199,7 @@ impl GuiMainNotebook { let entry_big_files_number: gtk::Entry = builder.object("entry_big_files_number").unwrap(); //// Check Buttons + let check_button_duplicate_case_sensitive_name: gtk::CheckButton = builder.object("check_button_duplicate_case_sensitive_name").unwrap(); 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_year: gtk::CheckButton = builder.object("check_button_music_year").unwrap(); @@ -301,6 +303,7 @@ impl GuiMainNotebook { combo_box_image_hash_size, check_button_video_ignore_same_size, check_button_image_fast_compare, + check_button_duplicate_case_sensitive_name, } } @@ -320,6 +323,7 @@ impl GuiMainNotebook { } pub fn update_language(&self) { + self.check_button_duplicate_case_sensitive_name.set_label(&flg!("duplicate_case_sensitive_name")); 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_year.set_label(&flg!("music_year_checkbox")); @@ -347,6 +351,8 @@ impl GuiMainNotebook { self.combo_box_duplicate_check_method.set_tooltip_text(Some(&flg!("duplicate_check_method_tooltip"))); self.label_duplicate_hash_type.set_tooltip_text(Some(&flg!("duplicate_hash_type_tooltip"))); self.combo_box_duplicate_hash_type.set_tooltip_text(Some(&flg!("duplicate_hash_type_tooltip"))); + self.check_button_duplicate_case_sensitive_name + .set_tooltip_text(Some(&flg!("duplicate_case_sensitive_name_tooltip"))); self.combo_box_image_hash_size.set_tooltip_text(Some(&flg!("image_hash_size_tooltip"))); self.label_image_hash_size.set_tooltip_text(Some(&flg!("image_hash_size_tooltip"))); diff --git a/czkawka_gui/src/saving_loading.rs b/czkawka_gui/src/saving_loading.rs index aba3651..3144cf9 100644 --- a/czkawka_gui/src/saving_loading.rs +++ b/czkawka_gui/src/saving_loading.rs @@ -4,6 +4,7 @@ use std::io::{Read, Write}; use std::path::{Path, PathBuf}; use std::{env, fs}; +use czkawka_core::common_dir_traversal::CheckingMethod; use directories_next::ProjectDirs; use gtk::prelude::*; use gtk::{ComboBoxText, ScrolledWindow, TextView}; @@ -14,6 +15,7 @@ use czkawka_core::similar_images::SIMILAR_VALUES; use crate::gui_structs::gui_settings::GuiSettings; use crate::gui_structs::gui_upper_notebook::GuiUpperNotebook; +use crate::help_combo_box::DUPLICATES_CHECK_METHOD_COMBO_BOX; use crate::help_functions::*; use crate::language_functions::{get_language_from_combo_box_text, LANGUAGES_ALL}; use crate::localizer_core::generate_translation_hashmap; @@ -38,6 +40,7 @@ const DEFAULT_PREHASH_MINIMAL_CACHE_SIZE: &str = "0"; const DEFAULT_VIDEO_REMOVE_AUTO_OUTDATED_CACHE: bool = false; const DEFAULT_IMAGE_REMOVE_AUTO_OUTDATED_CACHE: bool = true; const DEFAULT_DUPLICATE_REMOVE_AUTO_OUTDATED_CACHE: bool = true; +const DEFAULT_DUPLICATE_CASE_SENSITIVE_NAME_CHECKING: bool = false; const DEFAULT_NUMBER_OF_BIGGEST_FILES: &str = "50"; const DEFAULT_SIMILAR_IMAGES_SIMILARITY: i32 = 0; @@ -423,6 +426,7 @@ enum LoadText { SimilarVideosSimilarity, SimilarVideosIgnoreSameSize, MusicApproximateComparison, + DuplicateNameCaseSensitive, } fn create_hash_map() -> (HashMap, HashMap) { @@ -463,6 +467,7 @@ fn create_hash_map() -> (HashMap, HashMap) { (LoadText::SimilarVideosSimilarity, "similar_videos_similarity"), (LoadText::SimilarVideosIgnoreSameSize, "similar_videos_ignore_same_size"), (LoadText::MusicApproximateComparison, "music_approximate_comparison"), + (LoadText::DuplicateNameCaseSensitive, "duplicate_name_case_sensitive"), ]; let mut hashmap_ls: HashMap = Default::default(); let mut hashmap_sl: HashMap = Default::default(); @@ -614,6 +619,10 @@ pub fn save_configuration(manual_execution: bool, upper_notebook: &GuiUpperNoteb ); // Other2 + saving_struct.save_var( + hashmap_ls.get(&LoadText::DuplicateNameCaseSensitive).unwrap().to_string(), + main_notebook.check_button_duplicate_case_sensitive_name.is_active(), + ); saving_struct.save_var( hashmap_ls.get(&LoadText::NumberOfBiggestFiles).unwrap().to_string(), main_notebook.entry_big_files_number.text(), @@ -735,6 +744,10 @@ pub fn load_configuration( hashmap_ls.get(&LoadText::SimilarVideosIgnoreSameSize).unwrap().clone(), DEFAULT_SIMILAR_VIDEOS_IGNORE_SAME_SIZE, ); + let check_button_case_sensitive_name = loaded_entries.get_integer( + hashmap_ls.get(&LoadText::DuplicateNameCaseSensitive).unwrap().clone(), + DEFAULT_DUPLICATE_CASE_SENSITIVE_NAME_CHECKING, + ); // Setting data if manual_execution || loading_at_start { @@ -812,12 +825,31 @@ pub fn load_configuration( save_proper_value_to_combo_box(&main_notebook.combo_box_image_hash_size, combo_box_image_hash_size); save_proper_value_to_combo_box(&main_notebook.combo_box_image_resize_algorithm, combo_box_image_resize_algorithm); + main_notebook.check_button_duplicate_case_sensitive_name.set_active(check_button_case_sensitive_name); main_notebook.entry_big_files_number.set_text(&number_of_biggest_files); main_notebook.check_button_image_ignore_same_size.set_active(similar_images_ignore_same_size); main_notebook.check_button_image_fast_compare.set_active(similar_images_fast_compare); main_notebook.check_button_video_ignore_same_size.set_active(similar_videos_ignore_same_size); main_notebook.scale_similarity_similar_videos.set_value(similar_videos_similarity as f64); + { + let combo_chosen_index = main_notebook.combo_box_duplicate_check_method.active().unwrap(); + + if DUPLICATES_CHECK_METHOD_COMBO_BOX[combo_chosen_index as usize].check_method == CheckingMethod::Hash { + main_notebook.combo_box_duplicate_hash_type.set_visible(true); + main_notebook.label_duplicate_hash_type.set_visible(true); + } else { + main_notebook.combo_box_duplicate_hash_type.set_visible(false); + main_notebook.label_duplicate_hash_type.set_visible(false); + } + + if DUPLICATES_CHECK_METHOD_COMBO_BOX[combo_chosen_index as usize].check_method == CheckingMethod::Name { + main_notebook.check_button_duplicate_case_sensitive_name.set_visible(true); + } else { + main_notebook.check_button_duplicate_case_sensitive_name.set_visible(false); + } + } + // Set size of similarity scale gtk node, must be set BEFORE setting value of this let index = main_notebook.combo_box_image_hash_size.active().unwrap() as usize; diff --git a/czkawka_gui/ui/czkawka.cmb b/czkawka_gui/ui/czkawka.cmb index 89736b8..6e7bbfd 100644 --- a/czkawka_gui/ui/czkawka.cmb +++ b/czkawka_gui/ui/czkawka.cmb @@ -189,6 +189,7 @@ (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,170,"GtkCheckButton","check_button_duplicate_case_sensitive_name",56,None,None,None,4), (6,1,"GtkAboutDialog","about_dialog",None,None,None,None,None), (6,2,"GtkBox",None,1,"vbox",None,None,None), (6,3,"GtkButtonBox",None,2,"action_area",None,None,None), @@ -930,6 +931,7 @@ (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,170,"GtkButton","label","Case sensitive",None,None,None,None,None), (6,1,"GtkAboutDialog","comments","2020 - 2022 Rafał Mikrut(qarmin)\n\nThis program is free to use and will always be.\n","yes",None,None,None,None), (6,1,"GtkAboutDialog","license-type","mit-x11",None,None,None,None,None), (6,1,"GtkAboutDialog","logo-icon-name","image-missing",None,None,None,None,None), @@ -1537,6 +1539,7 @@ (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,56,170,"GtkBoxLayoutChild","position","4",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), diff --git a/czkawka_gui/ui/main_window.ui b/czkawka_gui/ui/main_window.ui index f00b4ec..489cbbe 100644 --- a/czkawka_gui/ui/main_window.ui +++ b/czkawka_gui/ui/main_window.ui @@ -687,6 +687,14 @@ Author: Rafał Mikrut 3 + + + Case sensitive + + + 4 + + False