From d310fe40594a2cf2def9b9238bb2a68655433777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= <41945903+qarmin@users.noreply.github.com> Date: Sat, 15 Jan 2022 19:02:27 +0100 Subject: [PATCH] Save more things to config file (#581) --- README.md | 6 +- czkawka_gui/src/saving_loading.rs | 112 ++++++++++++++++++++++++++++-- 2 files changed, 111 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 4a369c8..df437dd 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ - Written in memory safe Rust - Amazingly fast - due to using more or less advanced algorithms and multithreading - Free, Open Source without ads -- Multiplatform - works on Linux, Windows and macOS +- Multiplatform - works on Linux, Windows, macOS, FreeBSD and many more - Cache support - second and further scans should be a lot faster than the first one - CLI frontend - for easy automation - GUI frontend - uses modern GTK 3 and looks similar to FSlint @@ -19,7 +19,7 @@ - Empty Files - Looks for empty files across the drive - Temporary Files - Finds temporary files - Similar Images - Finds images which are not exactly the same (different resolution, watermarks) - - Similar Videos - Looks for similar visually videos + - Similar Videos - Looks for visually similar videos - Same Music - Searches for music with the same artist, album etc. - Invalid Symbolic Links - Shows symbolic links which point to non-existent files/directories - Broken Files - Finds files with an invalid extension or that are corrupted @@ -118,7 +118,7 @@ Bleachbit is a master at finding and removing temporary files, while Czkawka onl | In active development | Yes | No | Yes | Yes | ## Other apps -There are many similar applications to Czkawka on the Internet, which do some things better and some things worse. +There are many similar applications to Czkawka on the Internet, which do some things better and some things worse: ### GUI - [DupeGuru](https://github.com/arsenetar/dupeguru) - A lot of options to customize, great photo compare tool - [FSlint](https://github.com/pixelb/fslint) - A little outdated, but still have some tools not available in Czkawka diff --git a/czkawka_gui/src/saving_loading.rs b/czkawka_gui/src/saving_loading.rs index 70a1f44..8fda222 100644 --- a/czkawka_gui/src/saving_loading.rs +++ b/czkawka_gui/src/saving_loading.rs @@ -10,6 +10,7 @@ use gtk::{ComboBoxText, ScrolledWindow, TextView}; use crate::gui_structs::gui_main_notebook::GuiMainNotebook; use czkawka_core::fl; +use czkawka_core::similar_images::SIMILAR_VALUES; use crate::gui_structs::gui_settings::GuiSettings; use crate::gui_structs::gui_upper_notebook::GuiUpperNotebook; @@ -38,6 +39,13 @@ 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_NUMBER_OF_BIGGEST_FILES: &str = "50"; +const DEFAULT_SIMILAR_IMAGES_SIMILARITY: i32 = 0; +const DEFAULT_SIMILAR_IMAGES_IGNORE_SAME_SIZE: bool = false; +const DEFAULT_SIMILAR_IMAGES_FAST_COMPARE: bool = false; +const DEFAULT_SIMILAR_VIDEOS_SIMILARITY: i32 = 15; +const DEFAULT_SIMILAR_VIDEOS_IGNORE_SAME_SIZE: bool = false; + pub const DEFAULT_MINIMAL_FILE_SIZE: &str = "16384"; pub const DEFAULT_MAXIMAL_FILE_SIZE: &str = "999999999999"; @@ -77,6 +85,18 @@ impl LoadSaveStruct { default_value } + pub fn get_integer_string(&self, key: String, default_value: String) -> String { + if default_value.parse::().is_err() { + println!("Default value {} can't be convert to integer value", default_value); + panic!(); + } + assert!(default_value.parse::().is_ok()); + let mut returned_value = self.get_string(key, default_value.clone()); + if returned_value.parse::().is_err() { + returned_value = default_value; + } + returned_value + } pub fn get_string(&self, key: String, default_value: String) -> String { if self.loaded_items.contains_key(&key) { let item = self.loaded_items.get(&key).unwrap().clone().into_iter().filter(|e| !e.is_empty()).collect::>(); @@ -396,6 +416,13 @@ enum LoadText { ComboBoxImageResizeAlgorithm, ComboBoxImageHashType, ComboBoxImageHashSize, + NumberOfBiggestFiles, + SimilarImagesSimilarity, + SimilarImagesIgnoreSameSize, + SimilarImagesFastCompare, + SimilarVideosSimilarity, + SimilarVideosIgnoreSameSize, + MusicApproximateComparison, } fn create_hash_map() -> (HashMap, HashMap) { @@ -429,6 +456,13 @@ fn create_hash_map() -> (HashMap, HashMap) { (LoadText::ComboBoxImageResizeAlgorithm, "combo_box_image_resize_algorithm"), (LoadText::ComboBoxImageHashType, "combo_box_image_hash_type"), (LoadText::ComboBoxImageHashSize, "combo_box_image_hash_size"), + (LoadText::NumberOfBiggestFiles, "number_of_biggest_files"), + (LoadText::SimilarImagesSimilarity, "similar_images_similarity"), + (LoadText::SimilarImagesIgnoreSameSize, "similar_images_ignore_same_size"), + (LoadText::SimilarImagesFastCompare, "similar_images_fast_compare"), + (LoadText::SimilarVideosSimilarity, "similar_videos_similarity"), + (LoadText::SimilarVideosIgnoreSameSize, "similar_videos_ignore_same_size"), + (LoadText::MusicApproximateComparison, "music_approximate_comparison"), ]; let mut hashmap_ls: HashMap = Default::default(); let mut hashmap_sl: HashMap = Default::default(); @@ -579,6 +613,36 @@ pub fn save_configuration(manual_execution: bool, upper_notebook: &GuiUpperNoteb main_notebook.combo_box_image_hash_size.active().unwrap_or(0), ); + // Other2 + saving_struct.save_var( + hashmap_ls.get(&LoadText::NumberOfBiggestFiles).unwrap().to_string(), + main_notebook.entry_big_files_number.text(), + ); + saving_struct.save_var( + hashmap_ls.get(&LoadText::SimilarImagesSimilarity).unwrap().to_string(), + main_notebook.scale_similarity_similar_images.value(), + ); + saving_struct.save_var( + hashmap_ls.get(&LoadText::SimilarImagesIgnoreSameSize).unwrap().to_string(), + main_notebook.check_button_image_ignore_same_size.is_active(), + ); + saving_struct.save_var( + hashmap_ls.get(&LoadText::SimilarImagesFastCompare).unwrap().to_string(), + main_notebook.check_button_image_fast_compare.is_active(), + ); + saving_struct.save_var( + hashmap_ls.get(&LoadText::SimilarVideosSimilarity).unwrap().to_string(), + main_notebook.scale_similarity_similar_videos.value(), + ); + saving_struct.save_var( + hashmap_ls.get(&LoadText::SimilarVideosIgnoreSameSize).unwrap().to_string(), + main_notebook.check_button_video_ignore_same_size.is_active(), + ); + saving_struct.save_var( + hashmap_ls.get(&LoadText::MusicApproximateComparison).unwrap().to_string(), + main_notebook.check_button_music_approximate_comparison.is_active(), + ); + saving_struct.save_to_file(&text_view_errors); } @@ -615,8 +679,8 @@ pub fn load_configuration( upper_notebook.entry_excluded_items.text().to_string(), ); let allowed_extensions: String = loaded_entries.get_string(hashmap_ls.get(&LoadText::AllowedExtensions).unwrap().clone(), "".to_string()); - let minimal_file_size: String = loaded_entries.get_string(hashmap_ls.get(&LoadText::MinimalFileSize).unwrap().clone(), DEFAULT_MINIMAL_FILE_SIZE.to_string()); - let maximal_file_size: String = loaded_entries.get_string(hashmap_ls.get(&LoadText::MaximalFileSize).unwrap().clone(), DEFAULT_MAXIMAL_FILE_SIZE.to_string()); + let minimal_file_size: String = loaded_entries.get_integer_string(hashmap_ls.get(&LoadText::MinimalFileSize).unwrap().clone(), DEFAULT_MINIMAL_FILE_SIZE.to_string()); + let maximal_file_size: String = loaded_entries.get_integer_string(hashmap_ls.get(&LoadText::MaximalFileSize).unwrap().clone(), DEFAULT_MAXIMAL_FILE_SIZE.to_string()); let loading_at_start: bool = loaded_entries.get_bool(hashmap_ls.get(&LoadText::LoadAtStart).unwrap().clone(), DEFAULT_LOAD_AT_START); let saving_at_exit: bool = loaded_entries.get_bool(hashmap_ls.get(&LoadText::SaveAtExit).unwrap().clone(), DEFAULT_SAVE_ON_EXIT); @@ -643,11 +707,11 @@ pub fn load_configuration( ); let use_prehash_cache: bool = loaded_entries.get_bool(hashmap_ls.get(&LoadText::UsePrehashCache).unwrap().clone(), DEFAULT_USE_PRECACHE); - let cache_prehash_minimal_size: String = loaded_entries.get_string( + let cache_prehash_minimal_size: String = loaded_entries.get_integer_string( hashmap_ls.get(&LoadText::MinimalPrehashCacheSize).unwrap().clone(), DEFAULT_PREHASH_MINIMAL_CACHE_SIZE.to_string(), ); - let cache_minimal_size: String = loaded_entries.get_string(hashmap_ls.get(&LoadText::MinimalCacheSize).unwrap().clone(), DEFAULT_MINIMAL_CACHE_SIZE.to_string()); + let cache_minimal_size: String = loaded_entries.get_integer_string(hashmap_ls.get(&LoadText::MinimalCacheSize).unwrap().clone(), DEFAULT_MINIMAL_CACHE_SIZE.to_string()); let short_language = loaded_entries.get_string(hashmap_ls.get(&LoadText::Language).unwrap().clone(), short_language); let combo_box_duplicate_hash_type = loaded_entries.get_integer(hashmap_ls.get(&LoadText::ComboBoxDuplicateHashType).unwrap().clone(), 0); @@ -656,6 +720,22 @@ pub fn load_configuration( let combo_box_image_hash_algorithm = loaded_entries.get_integer(hashmap_ls.get(&LoadText::ComboBoxImageHashType).unwrap().clone(), 0); let combo_box_image_resize_algorithm = loaded_entries.get_integer(hashmap_ls.get(&LoadText::ComboBoxImageResizeAlgorithm).unwrap().clone(), 0); + let number_of_biggest_files = loaded_entries.get_integer_string( + hashmap_ls.get(&LoadText::NumberOfBiggestFiles).unwrap().clone(), + DEFAULT_NUMBER_OF_BIGGEST_FILES.to_string(), + ); + let similar_images_similarity = loaded_entries.get_integer(hashmap_ls.get(&LoadText::SimilarImagesSimilarity).unwrap().clone(), DEFAULT_SIMILAR_IMAGES_SIMILARITY); + let similar_images_ignore_same_size = loaded_entries.get_bool( + hashmap_ls.get(&LoadText::SimilarImagesIgnoreSameSize).unwrap().clone(), + DEFAULT_SIMILAR_IMAGES_IGNORE_SAME_SIZE, + ); + let similar_images_fast_compare = loaded_entries.get_bool(hashmap_ls.get(&LoadText::SimilarImagesFastCompare).unwrap().clone(), DEFAULT_SIMILAR_IMAGES_FAST_COMPARE); + let similar_videos_similarity = loaded_entries.get_integer(hashmap_ls.get(&LoadText::SimilarVideosSimilarity).unwrap().clone(), DEFAULT_SIMILAR_VIDEOS_SIMILARITY); + let similar_videos_ignore_same_size = loaded_entries.get_bool( + hashmap_ls.get(&LoadText::SimilarVideosIgnoreSameSize).unwrap().clone(), + DEFAULT_SIMILAR_VIDEOS_IGNORE_SAME_SIZE, + ); + // Setting data if manual_execution || loading_at_start { { @@ -731,6 +811,19 @@ pub fn load_configuration( save_proper_value_to_combo_box(&main_notebook.combo_box_image_hash_algorithm, combo_box_image_hash_algorithm); 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.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); + + // 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; + + main_notebook.scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[index][5] as f64); + + main_notebook.scale_similarity_similar_images.set_value(similar_images_similarity as f64); } else { settings.check_button_settings_load_at_start.set_active(false); } @@ -792,6 +885,8 @@ pub fn reset_configuration(manual_clearing: bool, upper_notebook: &GuiUpperNoteb { upper_notebook.entry_excluded_items.set_text(DEFAULT_EXCLUDED_ITEMS); upper_notebook.entry_allowed_extensions.set_text(""); + upper_notebook.entry_general_minimal_size.set_text(DEFAULT_MINIMAL_FILE_SIZE); + upper_notebook.entry_general_maximal_size.set_text(DEFAULT_MAXIMAL_FILE_SIZE); } // Set default settings @@ -826,6 +921,15 @@ pub fn reset_configuration(manual_clearing: bool, upper_notebook: &GuiUpperNoteb main_notebook.combo_box_image_hash_algorithm.set_active(Some(0)); main_notebook.combo_box_image_resize_algorithm.set_active(Some(0)); main_notebook.combo_box_image_hash_size.set_active(Some(0)); + + main_notebook.scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[0][5] as f64); // DEFAULT FOR MAX of 8 + + main_notebook.entry_big_files_number.set_text(DEFAULT_NUMBER_OF_BIGGEST_FILES); + main_notebook.scale_similarity_similar_images.set_value(DEFAULT_SIMILAR_IMAGES_SIMILARITY as f64); + main_notebook.check_button_image_ignore_same_size.set_active(DEFAULT_SIMILAR_IMAGES_IGNORE_SAME_SIZE); + main_notebook.check_button_image_fast_compare.set_active(DEFAULT_SIMILAR_IMAGES_FAST_COMPARE); + main_notebook.check_button_video_ignore_same_size.set_active(DEFAULT_SIMILAR_VIDEOS_IGNORE_SAME_SIZE); + main_notebook.scale_similarity_similar_videos.set_value(DEFAULT_SIMILAR_VIDEOS_SIMILARITY as f64); } if manual_clearing { add_text_to_text_view(&text_view_errors, &fl!("saving_loading_reset_configuration"));