diff --git a/Cargo.lock b/Cargo.lock index aee48e9..172dd53 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -408,9 +408,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "combine" -version = "4.6.2" +version = "4.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b2f5d0ee456f3928812dfc8c6d9a1d592b98678f6d56db9b0cd2b7bc6c8db5" +checksum = "50b727aacc797f9fc28e355d21f34709ac4fc9adecfe470ad07b8f4464f53062" dependencies = [ "bytes", "memchr", @@ -628,8 +628,18 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.10.2", + "darling_macro 0.10.2", +] + +[[package]] +name = "darling" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4" +dependencies = [ + "darling_core 0.13.1", + "darling_macro 0.13.1", ] [[package]] @@ -646,13 +656,38 @@ dependencies = [ "syn", ] +[[package]] +name = "darling_core" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn", +] + [[package]] name = "darling_macro" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ - "darling_core", + "darling_core 0.10.2", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b" +dependencies = [ + "darling_core 0.13.1", "quote", "syn", ] @@ -1647,20 +1682,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8794322172319b972f528bf90c6b467be0079f1fa82780ffb431088e741a73ab" dependencies = [ "jni-sys", - "ndk-sys", + "ndk-sys 0.2.2", "num_enum", "thiserror", ] [[package]] name = "ndk" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d64d6af06fde0e527b1ba5c7b79a6cc89cfc46325b0b2887dffe8f70197e0c3c" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" dependencies = [ "bitflags", "jni-sys", - "ndk-sys", + "ndk-sys 0.3.0", "num_enum", "thiserror", ] @@ -1675,22 +1710,22 @@ dependencies = [ "libc", "log", "ndk 0.3.0", - "ndk-macro", - "ndk-sys", + "ndk-macro 0.2.0", + "ndk-sys 0.2.2", ] [[package]] name = "ndk-glue" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e9e94628f24e7a3cb5b96a2dc5683acd9230bf11991c2a1677b87695138420" +checksum = "04c0d14b0858eb9962a5dac30b809b19f19da7e4547d64af2b0bb051d2e55d79" dependencies = [ "lazy_static", "libc", "log", - "ndk 0.4.0", - "ndk-macro", - "ndk-sys", + "ndk 0.6.0", + "ndk-macro 0.3.0", + "ndk-sys 0.3.0", ] [[package]] @@ -1699,19 +1734,41 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d" dependencies = [ - "darling", + "darling 0.10.2", "proc-macro-crate 0.1.5", "proc-macro2", "quote", "syn", ] +[[package]] +name = "ndk-macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c" +dependencies = [ + "darling 0.13.1", + "proc-macro-crate 1.1.0", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "ndk-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" +[[package]] +name = "ndk-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] + [[package]] name = "nix" version = "0.20.0" @@ -1867,13 +1924,13 @@ dependencies = [ [[package]] name = "oboe" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e15e22bc67e047fe342a32ecba55f555e3be6166b04dd157cd0f803dfa9f48e1" +checksum = "2463c8f2e19b4e0d0710a21f8e4011501ff28db1c95d7a5482a553b2100502d2" dependencies = [ "jni", - "ndk 0.4.0", - "ndk-glue 0.4.0", + "ndk 0.6.0", + "ndk-glue 0.6.0", "num-derive", "num-traits", "oboe-sys", @@ -1881,9 +1938,9 @@ dependencies = [ [[package]] name = "oboe-sys" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338142ae5ab0aaedc8275aa8f67f460e43ae0fca76a695a742d56da0a269eadc" +checksum = "3370abb7372ed744232c12954d920d1a40f1c4686de9e79e800021ef492294bd" dependencies = [ "cc", ] diff --git a/czkawka_core/src/big_file.rs b/czkawka_core/src/big_file.rs index 69b7541..24ea81d 100644 --- a/czkawka_core/src/big_file.rs +++ b/czkawka_core/src/big_file.rs @@ -14,7 +14,7 @@ use crossbeam_channel::Receiver; use humansize::{file_size_opts as options, FileSize}; use rayon::prelude::*; -use crate::common::Common; +use crate::common::{Common, LOOP_DURATION}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -131,7 +131,6 @@ impl BigFile { } //// PROGRESS THREAD START - const LOOP_DURATION: u32 = 200; //in ms let progress_thread_run = Arc::new(AtomicBool::new(true)); let atomic_file_counter = Arc::new(AtomicU64::new(0)); @@ -326,17 +325,14 @@ impl BigFile { self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages); } - /// Remove unused entries when included or excluded overlaps with each other or are duplicated etc. fn optimize_directories(&mut self) { self.directories.optimize_directories(self.recursive_search, &mut self.text_messages); } - /// Setting included directories, at least one must be provided pub fn set_included_directory(&mut self, included_directory: Vec) { self.directories.set_included_directory(included_directory, &mut self.text_messages); } - /// Setting absolute path to exclude pub fn set_excluded_directory(&mut self, excluded_directory: Vec) { self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages); } diff --git a/czkawka_core/src/broken_files.rs b/czkawka_core/src/broken_files.rs index d31dd66..562c104 100644 --- a/czkawka_core/src/broken_files.rs +++ b/czkawka_core/src/broken_files.rs @@ -13,7 +13,7 @@ use crossbeam_channel::Receiver; use rayon::prelude::*; use serde::{Deserialize, Serialize}; -use crate::common::{open_cache_folder, Common}; +use crate::common::{open_cache_folder, Common, LOOP_DURATION}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -67,7 +67,6 @@ impl Info { } } -/// Struct with required information's to work pub struct BrokenFiles { text_messages: Messages, information: Info, @@ -174,7 +173,6 @@ impl BrokenFiles { } //// PROGRESS THREAD START - const LOOP_DURATION: u32 = 200; //in ms let progress_thread_run = Arc::new(AtomicBool::new(true)); let atomic_file_counter = Arc::new(AtomicUsize::new(0)); @@ -382,7 +380,6 @@ impl BrokenFiles { let check_was_breaked = AtomicBool::new(false); // Used for breaking from GUI and ending check thread //// PROGRESS THREAD START - const LOOP_DURATION: u32 = 200; //in ms let progress_thread_run = Arc::new(AtomicBool::new(true)); let atomic_file_counter = Arc::new(AtomicUsize::new(0)); diff --git a/czkawka_core/src/common.rs b/czkawka_core/src/common.rs index 725bbf5..27dc6ec 100644 --- a/czkawka_core/src/common.rs +++ b/czkawka_core/src/common.rs @@ -10,6 +10,8 @@ use std::time::SystemTime; /// Class for common functions used across other class/functions +pub const LOOP_DURATION: u32 = 200; //ms + pub struct Common(); pub fn open_cache_folder(cache_file_name: &str, save_to_cache: bool, use_json: bool, warnings: &mut Vec) -> Option<((Option, PathBuf), (Option, PathBuf))> { @@ -72,7 +74,6 @@ pub fn get_dynamic_image_from_raw_image(path: impl AsRef + std::fmt::Debug let file_handler = match OpenOptions::new().read(true).open(&path) { Ok(t) => t, Err(_e) => { - // println!("Failed to open image {:?}, reason {}", path, e); return None; } }; @@ -81,7 +82,6 @@ pub fn get_dynamic_image_from_raw_image(path: impl AsRef + std::fmt::Debug let raw = match rawloader::decode(&mut reader) { Ok(raw) => raw, Err(_e) => { - // println!("Failed to decode raw image {:?}, reason {}", path, e); return None; } }; @@ -93,7 +93,6 @@ pub fn get_dynamic_image_from_raw_image(path: impl AsRef + std::fmt::Debug let mut pipeline = match Pipeline::new_from_source(source, width, height, true) { Ok(pipeline) => pipeline, Err(_e) => { - // println!("Failed to create pipeline {:?}, reason {}", path, e); return None; } }; @@ -102,7 +101,6 @@ pub fn get_dynamic_image_from_raw_image(path: impl AsRef + std::fmt::Debug let image = match pipeline.output_8bit(None) { Ok(image) => image, Err(_e) => { - // println!("Failed to process image {:?}, reason {}", path, e); return None; } }; @@ -110,7 +108,6 @@ pub fn get_dynamic_image_from_raw_image(path: impl AsRef + std::fmt::Debug let image = match ImageBuffer::, Vec>::from_raw(image.width as u32, image.height as u32, image.data) { Some(image) => image, None => { - // println!("Failed to get image {:?}", path); return None; } }; diff --git a/czkawka_core/src/common_dir_traversal.rs b/czkawka_core/src/common_dir_traversal.rs index 1ea9313..9f4b2aa 100644 --- a/czkawka_core/src/common_dir_traversal.rs +++ b/czkawka_core/src/common_dir_traversal.rs @@ -7,6 +7,7 @@ use std::thread::sleep; use std::time::{Duration, SystemTime, UNIX_EPOCH}; use std::{fs, thread}; +use crate::common::LOOP_DURATION; use crossbeam_channel::Receiver; use rayon::prelude::*; @@ -308,7 +309,6 @@ where folders_to_check.extend(self.root_dirs); //// PROGRESS THREAD START - const LOOP_DURATION: u32 = 200; //in ms let progress_thread_run = Arc::new(AtomicBool::new(true)); let atomic_entry_counter = Arc::new(AtomicUsize::new(0)); diff --git a/czkawka_core/src/common_directory.rs b/czkawka_core/src/common_directory.rs index 66c916b..4e7af6e 100644 --- a/czkawka_core/src/common_directory.rs +++ b/czkawka_core/src/common_directory.rs @@ -3,6 +3,8 @@ use std::time::SystemTime; use crate::common::Common; use crate::common_messages::Messages; +use crate::fl; +use crate::localizer::generate_translation_hashmap; #[derive(Clone, Default)] pub struct Directories { @@ -20,12 +22,12 @@ impl Directories { self.reference_directories = reference_directory } - /// Setting included directories, at least one must be provided + /// Setting included directories, at least one must be provided or scan won't start pub fn set_included_directory(&mut self, included_directory: Vec, text_messages: &mut Messages) -> bool { let start_time: SystemTime = SystemTime::now(); if included_directory.is_empty() { - text_messages.errors.push("At least one directory must be provided".to_string()); + text_messages.errors.push(fl!("core_missing_no_chosen_included_directory")); return false; } @@ -34,37 +36,41 @@ impl Directories { let mut checked_directories: Vec = Vec::new(); for directory in directories { if directory.to_string_lossy().contains('*') { - text_messages - .warnings - .push(format!("Included Directory Warning: Wildcards in path are not supported, ignoring {}", directory.display())); + text_messages.warnings.push(fl!( + "core_directory_wildcard_no_supported", + generate_translation_hashmap(vec![("path", directory.display().to_string())]) + )); continue; } #[cfg(not(target_family = "windows"))] if directory.is_relative() { - text_messages - .warnings - .push(format!("Included Directory Warning: Relative path are not supported, ignoring {}", directory.display())); + text_messages.warnings.push(fl!( + "core_directory_relative_path", + generate_translation_hashmap(vec![("path", directory.display().to_string())]) + )); continue; } #[cfg(target_family = "windows")] if directory.is_relative() && !directory.starts_with("\\") { - text_messages - .warnings - .push(format!("Included Directory Warning: Relative path are not supported, ignoring {}", directory.display())); + text_messages.warnings.push(fl!( + "core_directory_relative_path", + generate_translation_hashmap(vec![("path", directory.display().to_string())]) + )); continue; } if !directory.exists() { - text_messages - .warnings - .push(format!("Included Directory Warning: Provided folder path must exits, ignoring {}", directory.display())); + text_messages.warnings.push(fl!( + "core_directory_must_exists", + generate_translation_hashmap(vec![("path", directory.display().to_string())]) + )); continue; } if !directory.is_dir() { - text_messages.warnings.push(format!( - "Included Directory Warning: Provided path must point at the directory, ignoring {}", - directory.display() + text_messages.warnings.push(fl!( + "core_directory_must_be_directory", + generate_translation_hashmap(vec![("path", directory.display().to_string())]) )); continue; } @@ -72,9 +78,7 @@ impl Directories { } if checked_directories.is_empty() { - text_messages - .errors - .push("Included Directory ERROR: Not found even one correct path to included which is required.".to_string()); + text_messages.warnings.push(fl!("core_included_directory_zero_valid_directories")); return false; } @@ -84,7 +88,7 @@ impl Directories { true } - /// Setting absolute path to exclude + /// Setting absolute path to exclude from search pub fn set_excluded_directory(&mut self, excluded_directory: Vec, text_messages: &mut Messages) { let start_time: SystemTime = SystemTime::now(); if excluded_directory.is_empty() { @@ -97,40 +101,41 @@ impl Directories { for directory in directories { let directory_as_string = directory.to_string_lossy(); if directory_as_string == "/" { - text_messages - .errors - .push("Excluded Directory ERROR: Excluding / is pointless, because it means that no files will be scanned.".to_string()); + text_messages.errors.push(fl!("core_excluded_directory_pointless_slash")); break; } if directory_as_string.contains('*') { - text_messages - .warnings - .push(format!("Excluded Directory Warning: Wildcards in path are not supported, ignoring {}", directory.display())); + text_messages.warnings.push(fl!( + "core_directory_wildcard_no_supported", + generate_translation_hashmap(vec![("path", directory.display().to_string())]) + )); continue; } #[cfg(not(target_family = "windows"))] if directory.is_relative() { - text_messages - .warnings - .push(format!("Excluded Directory Warning: Relative path are not supported, ignoring {}", directory.display())); + text_messages.warnings.push(fl!( + "core_directory_relative_path", + generate_translation_hashmap(vec![("path", directory.display().to_string())]) + )); continue; } #[cfg(target_family = "windows")] if directory.is_relative() && !directory.starts_with("\\") { - text_messages - .warnings - .push(format!("Excluded Directory Warning: Relative path are not supported, ignoring {}", directory.display())); + text_messages.warnings.push(fl!( + "core_directory_relative_path", + generate_translation_hashmap(vec![("path", directory.display().to_string())]) + )); continue; } if !directory.exists() { - // text_messages.warnings.push(format!("Excluded Directory Warning: Provided folder path must exits, ignoring {}", directory.display())); + // No error when excluded directories are missing continue; } if !directory.is_dir() { - text_messages.warnings.push(format!( - "Excluded Directory Warning: Provided path must point at the directory, ignoring {}", - directory.display() + text_messages.warnings.push(fl!( + "core_directory_must_be_directory", + generate_translation_hashmap(vec![("path", directory.display().to_string())]) )); continue; } @@ -265,18 +270,13 @@ impl Directories { for folder in &self.reference_directories { if self.included_directories.iter().any(|e| folder.starts_with(&e)) { ref_folders.push(folder.clone()); - // println!("REF: VALID reference folder {:?}", folder); - } else { - // println!("REF: Invalid reference folder {:?}", folder); } } self.reference_directories = ref_folders; } if self.included_directories.is_empty() { - text_messages - .errors - .push("Optimize Directories ERROR: Excluded directories overlaps all included directories.".to_string()); + text_messages.errors.push(fl!("core_directory_overlap")); return false; } diff --git a/czkawka_core/src/common_items.rs b/czkawka_core/src/common_items.rs index 79751db..4620b63 100644 --- a/czkawka_core/src/common_items.rs +++ b/czkawka_core/src/common_items.rs @@ -28,12 +28,13 @@ impl ExcludedItems { for expression in expressions { let expression: String = expression.trim().to_string(); - #[cfg(target_family = "windows")] - let expression = expression.replace("/", "\\"); - if expression.is_empty() { continue; } + + #[cfg(target_family = "windows")] + let expression = expression.replace("/", "\\"); + if expression == "DEFAULT" { if cfg!(target_family = "unix") { checked_expressions.push("*/.git/*,*/node_modules/*,*/lost+found/*,*/Trash/*,*/.Trash-*/*,*/snap/*,/home/*/.cache/*".to_string()); diff --git a/czkawka_core/src/duplicate.rs b/czkawka_core/src/duplicate.rs index 92502b5..94924a5 100644 --- a/czkawka_core/src/duplicate.rs +++ b/czkawka_core/src/duplicate.rs @@ -19,7 +19,7 @@ use crossbeam_channel::Receiver; use humansize::{file_size_opts as options, FileSize}; use rayon::prelude::*; -use crate::common::{open_cache_folder, Common}; +use crate::common::{open_cache_folder, Common, LOOP_DURATION}; use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; @@ -54,7 +54,6 @@ pub enum DeleteMethod { HardLink, } -/// Info struck with helpful information's about results #[derive(Default)] pub struct Info { pub number_of_groups_by_size: usize, @@ -73,7 +72,6 @@ impl Info { } } -/// Struct with required information's to work pub struct DuplicateFinder { text_messages: Messages, information: Info, @@ -489,7 +487,6 @@ impl DuplicateFinder { let mut pre_checked_map: BTreeMap> = Default::default(); //// PROGRESS THREAD START - const LOOP_DURATION: u32 = 200; //in ms let progress_thread_run = Arc::new(AtomicBool::new(true)); let atomic_file_counter = Arc::new(AtomicUsize::new(0)); @@ -655,7 +652,6 @@ impl DuplicateFinder { ///////////////////////// //// PROGRESS THREAD START - // const LOOP_DURATION: u32 = 200; //in ms let progress_thread_run = Arc::new(AtomicBool::new(true)); let atomic_file_counter = Arc::new(AtomicUsize::new(0)); diff --git a/czkawka_core/src/same_music.rs b/czkawka_core/src/same_music.rs index 6e9582f..c679bb7 100644 --- a/czkawka_core/src/same_music.rs +++ b/czkawka_core/src/same_music.rs @@ -14,7 +14,7 @@ use crossbeam_channel::Receiver; use rayon::prelude::*; use serde::{Deserialize, Serialize}; -use crate::common::{open_cache_folder, Common}; +use crate::common::{open_cache_folder, Common, LOOP_DURATION}; use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; @@ -322,7 +322,6 @@ impl SameMusic { let check_was_breaked = AtomicBool::new(false); // Used for breaking from GUI and ending check thread //// PROGRESS THREAD START - const LOOP_DURATION: u32 = 200; //in ms let progress_thread_run = Arc::new(AtomicBool::new(true)); let atomic_file_counter = Arc::new(AtomicUsize::new(0)); @@ -429,7 +428,6 @@ impl SameMusic { let start_time: SystemTime = SystemTime::now(); //// PROGRESS THREAD START - const LOOP_DURATION: u32 = 200; //in ms let progress_thread_run = Arc::new(AtomicBool::new(true)); let atomic_file_counter = Arc::new(AtomicUsize::new(0)); diff --git a/czkawka_core/src/similar_images.rs b/czkawka_core/src/similar_images.rs index 3a632a3..8e15197 100644 --- a/czkawka_core/src/similar_images.rs +++ b/czkawka_core/src/similar_images.rs @@ -18,7 +18,7 @@ use img_hash::{FilterType, HashAlg, HasherConfig}; use rayon::prelude::*; use serde::{Deserialize, Serialize}; -use crate::common::{get_dynamic_image_from_raw_image, open_cache_folder, Common}; +use crate::common::{get_dynamic_image_from_raw_image, open_cache_folder, Common, LOOP_DURATION}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -61,7 +61,6 @@ pub struct ProgressData { pub images_checked: usize, pub images_to_check: usize, } -const LOOP_DURATION: u32 = 200; //ms #[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Serialize, Deserialize)] pub enum Similarity { diff --git a/czkawka_core/src/similar_videos.rs b/czkawka_core/src/similar_videos.rs index 363ee1a..6e20dc7 100644 --- a/czkawka_core/src/similar_videos.rs +++ b/czkawka_core/src/similar_videos.rs @@ -17,7 +17,7 @@ use serde::{Deserialize, Serialize}; use vid_dup_finder_lib::HashCreationErrorKind::DetermineVideo; use vid_dup_finder_lib::{NormalizedTolerance, VideoHash}; -use crate::common::{open_cache_folder, Common}; +use crate::common::{open_cache_folder, Common, LOOP_DURATION}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -236,7 +236,6 @@ impl SimilarVideos { } //// PROGRESS THREAD START - const LOOP_DURATION: u32 = 200; //in ms let progress_thread_run = Arc::new(AtomicBool::new(true)); let atomic_file_counter = Arc::new(AtomicUsize::new(0)); @@ -447,7 +446,6 @@ impl SimilarVideos { let hash_map_modification = SystemTime::now(); //// PROGRESS THREAD START - const LOOP_DURATION: u32 = 200; //in ms let progress_thread_run = Arc::new(AtomicBool::new(true)); let atomic_file_counter = Arc::new(AtomicUsize::new(0)); diff --git a/czkawka_core/src/temporary.rs b/czkawka_core/src/temporary.rs index 39393ec..04a503d 100644 --- a/czkawka_core/src/temporary.rs +++ b/czkawka_core/src/temporary.rs @@ -11,7 +11,7 @@ use std::{fs, thread}; use crossbeam_channel::Receiver; use rayon::prelude::*; -use crate::common::Common; +use crate::common::{Common, LOOP_DURATION}; use crate::common_directory::Directories; use crate::common_items::ExcludedItems; use crate::common_messages::Messages; @@ -131,7 +131,6 @@ impl Temporary { } //// PROGRESS THREAD START - const LOOP_DURATION: u32 = 200; //in ms let progress_thread_run = Arc::new(AtomicBool::new(true)); let atomic_file_counter = Arc::new(AtomicUsize::new(0)); diff --git a/czkawka_gui/src/compute_results.rs b/czkawka_gui/src/compute_results.rs index 02e548f..1b6dc5c 100644 --- a/czkawka_gui/src/compute_results.rs +++ b/czkawka_gui/src/compute_results.rs @@ -48,7 +48,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< let shared_similar_videos_state = gui_data.shared_similar_videos_state.clone(); let tree_view_same_music_finder = gui_data.main_notebook.tree_view_same_music_finder.clone(); let shared_same_music_state = gui_data.shared_same_music_state.clone(); - let buttons_names = gui_data.bottom_buttons.buttons_names.clone(); + let buttons_names = gui_data.bottom_buttons.buttons_names; let window_progress = gui_data.progress_window.window_progress.clone(); let taskbar_state = gui_data.taskbar_state.clone(); let notebook_upper = gui_data.upper_notebook.notebook_upper.clone(); @@ -500,7 +500,14 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< set_specific_buttons_as_active( &shared_buttons, &NotebookMainEnum::Duplicate, - &["save", "delete", "select", "symlink", "hardlink", "move"], + &[ + BottomButtonsEnum::Save, + BottomButtonsEnum::Delete, + BottomButtonsEnum::Select, + BottomButtonsEnum::Symlink, + BottomButtonsEnum::Hardlink, + BottomButtonsEnum::Move, + ], duplicates_number > 0, ); @@ -565,7 +572,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< set_specific_buttons_as_active( &shared_buttons, &NotebookMainEnum::EmptyDirectories, - &["save", "delete", "select", "move"], + &[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move], empty_folder_number > 0, ); @@ -631,7 +638,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< set_specific_buttons_as_active( &shared_buttons, &NotebookMainEnum::EmptyFiles, - &["save", "delete", "select", "move"], + &[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move], empty_files_number > 0, ); @@ -699,7 +706,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< set_specific_buttons_as_active( &shared_buttons, &NotebookMainEnum::BigFiles, - &["save", "delete", "select", "move"], + &[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move], biggest_files_number > 0, ); @@ -764,7 +771,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< set_specific_buttons_as_active( &shared_buttons, &NotebookMainEnum::Temporary, - &["save", "delete", "select", "move"], + &[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move], temporary_files_number > 0, ); @@ -940,7 +947,15 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< set_specific_buttons_as_active( &shared_buttons, &NotebookMainEnum::SimilarImages, - &["save", "delete", "select", "symlink", "hardlink", "move", "compare"], + &[ + BottomButtonsEnum::Save, + BottomButtonsEnum::Delete, + BottomButtonsEnum::Select, + BottomButtonsEnum::Symlink, + BottomButtonsEnum::Hardlink, + BottomButtonsEnum::Move, + BottomButtonsEnum::Compare, + ], found_any_duplicates, ); @@ -1102,7 +1117,14 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< set_specific_buttons_as_active( &shared_buttons, &NotebookMainEnum::SimilarVideos, - &["save", "delete", "select", "symlink", "hardlink", "move"], + &[ + BottomButtonsEnum::Save, + BottomButtonsEnum::Delete, + BottomButtonsEnum::Select, + BottomButtonsEnum::Symlink, + BottomButtonsEnum::Hardlink, + BottomButtonsEnum::Move, + ], found_any_duplicates, ); @@ -1317,7 +1339,14 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< set_specific_buttons_as_active( &shared_buttons, &NotebookMainEnum::SameMusic, - &["save", "delete", "select", "symlink", "hardlink", "move"], + &[ + BottomButtonsEnum::Save, + BottomButtonsEnum::Delete, + BottomButtonsEnum::Select, + BottomButtonsEnum::Symlink, + BottomButtonsEnum::Hardlink, + BottomButtonsEnum::Move, + ], same_music_number > 0, ); @@ -1387,7 +1416,12 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< { *shared_same_invalid_symlinks.borrow_mut() = ifs; - set_specific_buttons_as_active(&shared_buttons, &NotebookMainEnum::Symlinks, &["save", "delete", "select", "move"], invalid_symlinks > 0); + set_specific_buttons_as_active( + &shared_buttons, + &NotebookMainEnum::Symlinks, + &[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move], + invalid_symlinks > 0, + ); set_buttons( &mut *shared_buttons.borrow_mut().get_mut(&NotebookMainEnum::Symlinks).unwrap(), @@ -1452,7 +1486,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< set_specific_buttons_as_active( &shared_buttons, &NotebookMainEnum::BrokenFiles, - &["save", "delete", "select", "move"], + &[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move], broken_files_number > 0, ); @@ -1471,12 +1505,12 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< } fn set_specific_buttons_as_active( - buttons_array: &Rc>>>, + buttons_array: &Rc>>>, notebook_enum: &NotebookMainEnum, - buttons: &[&str], + buttons: &[BottomButtonsEnum], value_to_set: bool, ) { for i in buttons { - *buttons_array.borrow_mut().get_mut(notebook_enum).unwrap().get_mut(*i).unwrap() = value_to_set; + *buttons_array.borrow_mut().get_mut(notebook_enum).unwrap().get_mut(i).unwrap() = value_to_set; } } diff --git a/czkawka_gui/src/connect_things/connect_button_save.rs b/czkawka_gui/src/connect_things/connect_button_save.rs index 5d2ca3c..b52d311 100644 --- a/czkawka_gui/src/connect_things/connect_button_save.rs +++ b/czkawka_gui/src/connect_things/connect_button_save.rs @@ -9,6 +9,7 @@ use czkawka_core::common_traits::SaveResults; use czkawka_core::fl; use crate::gui_structs::gui_data::GuiData; +use crate::help_functions::BottomButtonsEnum; use crate::localizer::generate_translation_hashmap; use crate::notebook_enums::*; @@ -96,7 +97,7 @@ pub fn connect_button_save(gui_data: &GuiData) { fn post_save_things( file_name: &str, type_of_tab: &NotebookMainEnum, - shared_buttons: &Rc>>>, + shared_buttons: &Rc>>>, entry_info: &Entry, buttons_save: &Button, ) { @@ -104,6 +105,6 @@ fn post_save_things( // Set state { buttons_save.hide(); - *shared_buttons.borrow_mut().get_mut(type_of_tab).unwrap().get_mut("save").unwrap() = false; + *shared_buttons.borrow_mut().get_mut(type_of_tab).unwrap().get_mut(&BottomButtonsEnum::Save).unwrap() = false; } } diff --git a/czkawka_gui/src/connect_things/connect_button_search.rs b/czkawka_gui/src/connect_things/connect_button_search.rs index 7dce456..c178829 100644 --- a/czkawka_gui/src/connect_things/connect_button_search.rs +++ b/czkawka_gui/src/connect_things/connect_button_search.rs @@ -50,7 +50,7 @@ pub fn connect_button_search( let buttons_array = gui_data.bottom_buttons.buttons_array.clone(); let check_button_image_ignore_same_size = gui_data.main_notebook.check_button_image_ignore_same_size.clone(); let check_button_video_ignore_same_size = gui_data.main_notebook.check_button_video_ignore_same_size.clone(); - let buttons_names = gui_data.bottom_buttons.buttons_names.clone(); + 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(); diff --git a/czkawka_gui/src/connect_things/connect_notebook_tabs.rs b/czkawka_gui/src/connect_things/connect_notebook_tabs.rs index 2266385..9e92f9e 100644 --- a/czkawka_gui/src/connect_things/connect_notebook_tabs.rs +++ b/czkawka_gui/src/connect_things/connect_notebook_tabs.rs @@ -8,7 +8,7 @@ pub fn connect_notebook_tabs(gui_data: &GuiData) { let shared_buttons = gui_data.shared_buttons.clone(); let buttons_array = gui_data.bottom_buttons.buttons_array.clone(); let notebook_main_clone = gui_data.main_notebook.notebook_main.clone(); - let buttons_names = gui_data.bottom_buttons.buttons_names.clone(); + let buttons_names = gui_data.bottom_buttons.buttons_names; notebook_main_clone.connect_switch_page(move |_, _, number| { let current_tab_in_main_notebook = to_notebook_main_enum(number); diff --git a/czkawka_gui/src/connect_things/connect_popovers.rs b/czkawka_gui/src/connect_things/connect_popovers.rs index f3b5ca6..c8aeb5c 100644 --- a/czkawka_gui/src/connect_things/connect_popovers.rs +++ b/czkawka_gui/src/connect_things/connect_popovers.rs @@ -390,7 +390,13 @@ fn popover_custom_select_unselect( let model = get_list_store(&tree_view); - let iter = model.iter_first().unwrap(); // Never should be available button where there is no available records + let iter = match model.iter_first() { + Some(t) => t, + None => { + confirmation_dialog_select_unselect.close(); + return; + } + }; let mut number_of_all_things = 0; let mut number_of_already_selected_things = 0; diff --git a/czkawka_gui/src/connect_things/connect_similar_image_size_change.rs b/czkawka_gui/src/connect_things/connect_similar_image_size_change.rs index b900df7..c98872a 100644 --- a/czkawka_gui/src/connect_things/connect_similar_image_size_change.rs +++ b/czkawka_gui/src/connect_things/connect_similar_image_size_change.rs @@ -15,28 +15,17 @@ pub fn connect_similar_image_size_change(gui_data: &GuiData) { combo_box_image_hash_size.connect_changed(move |combo_box_image_hash_size| { let hash_size_index = combo_box_image_hash_size.active().unwrap() as usize; let hash_size = IMAGES_HASH_SIZE_COMBO_BOX[hash_size_index]; - match hash_size { - 8 => { - scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[0][5] as f64); - scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[0][5] as f64); - label_similar_images_minimal_similarity.set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[0][5]), 8)); - } - 16 => { - scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[1][5] as f64); - scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[1][5] as f64); - label_similar_images_minimal_similarity.set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[1][5]), 16)); - } - 32 => { - scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[2][5] as f64); - scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[2][5] as f64); - label_similar_images_minimal_similarity.set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[2][5]), 32)); - } - 64 => { - scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[3][5] as f64); - scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[3][5] as f64); - label_similar_images_minimal_similarity.set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[3][5]), 64)); - } + + let index = match hash_size { + 8 => 0, + 16 => 1, + 32 => 2, + 64 => 3, _ => panic!(), - } + }; + + scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[index][5] as f64); + scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[index][5] as f64); + label_similar_images_minimal_similarity.set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[index][5]), hash_size as u8)); }); } diff --git a/czkawka_gui/src/gui_structs/gui_bottom_buttons.rs b/czkawka_gui/src/gui_structs/gui_bottom_buttons.rs index 5b47187..0458169 100644 --- a/czkawka_gui/src/gui_structs/gui_bottom_buttons.rs +++ b/czkawka_gui/src/gui_structs/gui_bottom_buttons.rs @@ -1,7 +1,7 @@ use gtk::prelude::*; use gtk::{Bin, Widget}; -use crate::help_functions::get_custom_label_from_button_with_image; +use crate::help_functions::{get_custom_label_from_button_with_image, BottomButtonsEnum}; use czkawka_core::fl; #[derive(Clone)] @@ -16,7 +16,7 @@ pub struct GuiBottomButtons { pub buttons_compare: gtk::Button, pub buttons_show_errors: gtk::Button, pub buttons_show_upper_notebook: gtk::Button, - pub buttons_names: [String; 8], + pub buttons_names: [BottomButtonsEnum; 8], pub buttons_array: [Widget; 8], } @@ -35,14 +35,14 @@ impl GuiBottomButtons { let buttons_show_upper_notebook: gtk::Button = builder.object("buttons_show_upper_notebook").unwrap(); let buttons_names = [ - "search".to_string(), - "select".to_string(), - "delete".to_string(), - "save".to_string(), - "symlink".to_string(), - "hardlink".to_string(), - "move".to_string(), - "compare".to_string(), + BottomButtonsEnum::Search, + BottomButtonsEnum::Select, + BottomButtonsEnum::Delete, + BottomButtonsEnum::Save, + BottomButtonsEnum::Symlink, + BottomButtonsEnum::Hardlink, + BottomButtonsEnum::Move, + BottomButtonsEnum::Compare, ]; let buttons_array = [ buttons_search.clone().upcast::(), diff --git a/czkawka_gui/src/gui_structs/gui_data.rs b/czkawka_gui/src/gui_structs/gui_data.rs index 496bbf8..db87d03 100644 --- a/czkawka_gui/src/gui_structs/gui_data.rs +++ b/czkawka_gui/src/gui_structs/gui_data.rs @@ -28,6 +28,7 @@ use crate::gui_structs::gui_popovers::GuiPopovers; use crate::gui_structs::gui_progress_dialog::GuiProgressDialog; use crate::gui_structs::gui_settings::GuiSettings; use crate::gui_structs::gui_upper_notebook::GuiUpperNotebook; +use crate::help_functions::BottomButtonsEnum; use crate::notebook_enums::*; use crate::taskbar_progress::TaskbarProgress; @@ -56,7 +57,7 @@ pub struct GuiData { pub taskbar_state: Rc>, // Buttons state - pub shared_buttons: Rc>>>, + pub shared_buttons: Rc>>>, // State of search results pub shared_duplication_state: Rc>, @@ -116,16 +117,16 @@ impl GuiData { let taskbar_state = Rc::new(RefCell::new(TaskbarProgress::new())); // Buttons State - to remember existence of different buttons on pages - let shared_buttons: Rc> = Rc::new(RefCell::new(HashMap::>::new())); + let shared_buttons: Rc> = Rc::new(RefCell::new(HashMap::>::new())); // Show by default only search button for i in get_all_main_tabs().iter() { - let mut temp_hashmap: HashMap = Default::default(); + let mut temp_hashmap: HashMap = Default::default(); for button_name in bottom_buttons.buttons_names.iter() { - if *button_name == "search" { - temp_hashmap.insert(button_name.to_string(), true); + if *button_name == BottomButtonsEnum::Search { + temp_hashmap.insert(*button_name, true); } else { - temp_hashmap.insert(button_name.to_string(), false); + temp_hashmap.insert(*button_name, false); } } shared_buttons.borrow_mut().insert(i.clone(), temp_hashmap); diff --git a/czkawka_gui/src/help_functions.rs b/czkawka_gui/src/help_functions.rs index 3c83bb7..87bdf53 100644 --- a/czkawka_gui/src/help_functions.rs +++ b/czkawka_gui/src/help_functions.rs @@ -50,6 +50,18 @@ pub enum PopoverTypes { None, } +#[derive(Eq, PartialEq, Copy, Clone, Hash)] +pub enum BottomButtonsEnum { + Search, + Select, + Delete, + Save, + Symlink, + Hardlink, + Move, + Compare, +} + pub struct NotebookObject { pub notebook_type: NotebookMainEnum, pub available_modes: [PopoverTypes; 5], @@ -437,9 +449,9 @@ pub fn add_text_to_text_view(text_view: &TextView, string_to_append: &str) { } } -pub fn set_buttons(hashmap: &mut HashMap, buttons_array: &[gtk::Widget], button_names: &[String]) { +pub fn set_buttons(hashmap: &mut HashMap, buttons_array: &[gtk::Widget], button_names: &[BottomButtonsEnum]) { for (index, button) in buttons_array.iter().enumerate() { - if *hashmap.get_mut(button_names[index].as_str()).unwrap() { + if *hashmap.get_mut(&button_names[index]).unwrap() { button.show(); } else { button.hide(); diff --git a/czkawka_gui/src/main.rs b/czkawka_gui/src/main.rs index ce11a19..1093a79 100644 --- a/czkawka_gui/src/main.rs +++ b/czkawka_gui/src/main.rs @@ -115,7 +115,7 @@ fn main() { &gui_data.scrolled_window_errors, ); - // Needs to run when entire GUI is initialized and + // Needs to run when entire GUI is initialized connect_change_language(&gui_data); connect_button_delete(&gui_data); diff --git a/czkawka_gui/src/saving_loading.rs b/czkawka_gui/src/saving_loading.rs index da60e98..70a1f44 100644 --- a/czkawka_gui/src/saving_loading.rs +++ b/czkawka_gui/src/saving_loading.rs @@ -605,6 +605,7 @@ pub fn load_configuration( let included_directories = get_string_from_list_store(&upper_notebook.tree_view_included_directories, ColumnsIncludedDirectory::Path as i32, None); let excluded_directories = get_string_from_list_store(&upper_notebook.tree_view_excluded_directories, ColumnsExcludedDirectory::Path as i32, None); + // Loading data from hashmaps let (hashmap_ls, _hashmap_sl) = create_hash_map(); let included_directories: Vec = loaded_entries.get_vector_string(hashmap_ls.get(&LoadText::IncludedDirectories).unwrap().clone(), included_directories); @@ -743,6 +744,7 @@ fn save_proper_value_to_combo_box(combo_box: &ComboBoxText, what_to_save: u32) { } } +/// Reset configuration to defaults pub fn reset_configuration(manual_clearing: bool, upper_notebook: &GuiUpperNotebook, main_notebook: &GuiMainNotebook, settings: &GuiSettings, text_view_errors: &TextView) { // TODO Maybe add popup dialog to confirm resetting let text_view_errors = text_view_errors.clone(); diff --git a/i18n/en/czkawka_gui.ftl b/i18n/en/czkawka_gui.ftl index 8334d95..b2846da 100644 --- a/i18n/en/czkawka_gui.ftl +++ b/i18n/en/czkawka_gui.ftl @@ -15,6 +15,15 @@ core_folder_modified_before_epoch = Folder {$name} seems to be modified before U core_file_no_modification_date = Unable to get modification date from file {$name}, reason {$reason} core_folder_no_modification_date = Unable to get modification date from folder {$name}, reason {$reason} +core_missing_no_chosen_included_directory = At least one directory must be provided +core_directory_wildcard_no_supported = Directories: Wildcards in path are not supported, ignoring { $path } +core_directory_relative_path = Directories: Relative path are not supported, ignoring { $path } +core_directory_must_exists = Directories: Provided folder path must exits, ignoring { $path } +core_directory_must_be_directory = Directories: Provided path must point at the directory, ignoring { $path } +core_included_directory_zero_valid_directories = Included Directory ERROR: Not found even one correct path to included which is required +core_excluded_directory_pointless_slash = Directories: Excluding / is pointless, because it means that no files will be scanned +core_directory_overlap = Directories: All directories to search overlaps with excluded directories + # Window titles window_settings_title = Options window_main_title = Czkawka (Hiccup)