From 29d135b1699845422dd04dcae6fdab2315f69cd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= Date: Mon, 8 May 2023 09:17:30 +0200 Subject: [PATCH] Unify progress data code --- czkawka_core/src/bad_extensions.rs | 6 +- czkawka_core/src/big_file.rs | 7 +- czkawka_core/src/broken_files.rs | 9 +- czkawka_core/src/common.rs | 4 +- czkawka_core/src/common_dir_traversal.rs | 31 +- czkawka_core/src/duplicate.rs | 16 +- czkawka_core/src/empty_files.rs | 5 +- czkawka_core/src/empty_folder.rs | 5 +- czkawka_core/src/invalid_symlinks.rs | 5 +- czkawka_core/src/same_music.rs | 14 +- czkawka_core/src/similar_images.rs | 11 +- czkawka_core/src/similar_videos.rs | 9 +- czkawka_core/src/temporary.rs | 7 +- .../connect_things/connect_button_search.rs | 38 +- .../connect_things/connect_progress_window.rs | 452 ++++++++---------- czkawka_gui/src/main.rs | 43 +- 16 files changed, 314 insertions(+), 348 deletions(-) diff --git a/czkawka_core/src/bad_extensions.rs b/czkawka_core/src/bad_extensions.rs index 13f4c4e..215a318 100644 --- a/czkawka_core/src/bad_extensions.rs +++ b/czkawka_core/src/bad_extensions.rs @@ -13,7 +13,7 @@ use mime_guess::get_mime_extensions; use rayon::prelude::*; use crate::common::{prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads}; -use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData}; +use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData, ToolType}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -172,6 +172,7 @@ impl Info { } pub struct BadExtensions { + tool_type: ToolType, text_messages: Messages, information: Info, files_to_check: Vec, @@ -191,6 +192,7 @@ impl BadExtensions { #[must_use] pub fn new() -> Self { Self { + tool_type: ToolType::BadExtensions, text_messages: Messages::new(), information: Info::new(), recursive_search: true, @@ -314,7 +316,7 @@ impl BadExtensions { fn look_for_bad_extensions_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender>) -> bool { let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = - prepare_thread_handler_common(progress_sender, 1, 1, self.files_to_check.len(), CheckingMethod::None); + prepare_thread_handler_common(progress_sender, 1, 1, self.files_to_check.len(), CheckingMethod::None, self.tool_type); let files_to_check = mem::take(&mut self.files_to_check); diff --git a/czkawka_core/src/big_file.rs b/czkawka_core/src/big_file.rs index efba79b..7a1c975 100644 --- a/czkawka_core/src/big_file.rs +++ b/czkawka_core/src/big_file.rs @@ -14,7 +14,7 @@ use humansize::BINARY; use rayon::prelude::*; use crate::common::{check_folder_children, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, split_path}; -use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData}; +use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData, ToolType}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -55,6 +55,7 @@ impl Info { /// Struct with required information's to work pub struct BigFile { + tool_type: ToolType, text_messages: Messages, information: Info, big_files: Vec<(u64, FileEntry)>, @@ -72,6 +73,7 @@ impl BigFile { #[must_use] pub fn new() -> Self { Self { + tool_type: ToolType::BigFile, text_messages: Default::default(), information: Info::new(), big_files: Default::default(), @@ -148,7 +150,8 @@ impl BigFile { folders_to_check.push(id.clone()); } - let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = prepare_thread_handler_common(progress_sender, 0, 0, 0, CheckingMethod::None); + let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = + prepare_thread_handler_common(progress_sender, 0, 0, 0, CheckingMethod::None, self.tool_type); while !folders_to_check.is_empty() { if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { diff --git a/czkawka_core/src/broken_files.rs b/czkawka_core/src/broken_files.rs index 9be3e23..0ca48a3 100644 --- a/czkawka_core/src/broken_files.rs +++ b/czkawka_core/src/broken_files.rs @@ -21,7 +21,7 @@ use crate::common::{ check_folder_children, create_crash_message, open_cache_folder, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, PDF_FILES_EXTENSIONS, }; use crate::common::{AUDIO_FILES_EXTENSIONS, IMAGE_RS_BROKEN_FILES_EXTENSIONS, ZIP_FILES_EXTENSIONS}; -use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData}; +use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData, ToolType}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -78,6 +78,7 @@ impl Info { } pub struct BrokenFiles { + tool_type: ToolType, text_messages: Messages, information: Info, files_to_check: BTreeMap, @@ -99,6 +100,7 @@ impl BrokenFiles { #[must_use] pub fn new() -> Self { Self { + tool_type: ToolType::BrokenFiles, text_messages: Messages::new(), information: Info::new(), recursive_search: true, @@ -200,7 +202,8 @@ impl BrokenFiles { folders_to_check.push(id.clone()); } - let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = prepare_thread_handler_common(progress_sender, 0, 1, 0, CheckingMethod::None); + let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = + prepare_thread_handler_common(progress_sender, 0, 1, 0, CheckingMethod::None, self.tool_type); while !folders_to_check.is_empty() { if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { @@ -436,7 +439,7 @@ impl BrokenFiles { } let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, 1, 1, non_cached_files_to_check.len(), CheckingMethod::None); + prepare_thread_handler_common(progress_sender, 1, 1, non_cached_files_to_check.len(), CheckingMethod::None, self.tool_type); let mut vec_file_entry: Vec = non_cached_files_to_check .into_par_iter() diff --git a/czkawka_core/src/common.rs b/czkawka_core/src/common.rs index 2768e02..36de405 100644 --- a/czkawka_core/src/common.rs +++ b/czkawka_core/src/common.rs @@ -19,7 +19,7 @@ use libheif_rs::{ColorSpace, HeifContext, RgbChroma}; // #[cfg(feature = "heif")] // use libheif_rs::LibHeif; -use crate::common_dir_traversal::{CheckingMethod, ProgressData}; +use crate::common_dir_traversal::{CheckingMethod, ProgressData, ToolType}; use crate::common_directory::Directories; use crate::common_items::ExcludedItems; use crate::common_traits::ResultEntry; @@ -392,6 +392,7 @@ pub fn prepare_thread_handler_common( max_stage: u8, max_value: usize, checking_method: CheckingMethod, + tool_type: ToolType, ) -> (JoinHandle<()>, Arc, Arc, AtomicBool) { let progress_thread_run = Arc::new(AtomicBool::new(true)); let atomic_counter = Arc::new(AtomicUsize::new(0)); @@ -408,6 +409,7 @@ pub fn prepare_thread_handler_common( max_stage, entries_checked: atomic_counter.load(Ordering::Relaxed), entries_to_check: max_value, + tool_type, }) .unwrap(); if !progress_thread_run.load(Ordering::Relaxed) { diff --git a/czkawka_core/src/common_dir_traversal.rs b/czkawka_core/src/common_dir_traversal.rs index e084284..9f5052b 100644 --- a/czkawka_core/src/common_dir_traversal.rs +++ b/czkawka_core/src/common_dir_traversal.rs @@ -3,7 +3,6 @@ use std::fs; use std::fs::{DirEntry, Metadata, ReadDir}; use std::path::{Path, PathBuf}; use std::sync::atomic::Ordering; - use std::time::UNIX_EPOCH; use crossbeam_channel::Receiver; @@ -25,6 +24,23 @@ pub struct ProgressData { pub max_stage: u8, pub entries_checked: usize, pub entries_to_check: usize, + pub tool_type: ToolType, +} + +#[derive(PartialEq, Eq, Clone, Debug, Copy)] +pub enum ToolType { + Duplicate, + EmptyFolders, + EmptyFiles, + InvalidSymlinks, + BrokenFiles, + BadExtensions, + BigFile, + SameMusic, + SimilarImages, + SimilarVideos, + TemporaryFiles, + None, } #[derive(PartialEq, Eq, Clone, Debug, Copy)] @@ -118,6 +134,7 @@ pub struct DirTraversalBuilder<'a, 'b, F> { directories: Option, excluded_items: Option, allowed_extensions: Option, + tool_type: ToolType, } pub struct DirTraversal<'a, 'b, F> { @@ -133,6 +150,7 @@ pub struct DirTraversal<'a, 'b, F> { maximal_file_size: u64, checking_method: CheckingMethod, max_stage: u8, + tool_type: ToolType, collect: Collect, } @@ -159,6 +177,7 @@ impl<'a, 'b> DirTraversalBuilder<'a, 'b, ()> { directories: None, allowed_extensions: None, excluded_items: None, + tool_type: ToolType::BadExtensions, } } } @@ -236,6 +255,12 @@ impl<'a, 'b, F> DirTraversalBuilder<'a, 'b, F> { self } + #[must_use] + pub fn tool_type(mut self, tool_type: ToolType) -> Self { + self.tool_type = tool_type; + self + } + #[cfg(target_family = "unix")] #[must_use] pub fn exclude_other_filesystems(mut self, exclude_other_filesystems: bool) -> Self { @@ -264,6 +289,7 @@ impl<'a, 'b, F> DirTraversalBuilder<'a, 'b, F> { collect: self.collect, checking_method: self.checking_method, max_stage: self.max_stage, + tool_type: self.tool_type, } } @@ -282,6 +308,7 @@ impl<'a, 'b, F> DirTraversalBuilder<'a, 'b, F> { excluded_items: self.excluded_items.expect("could not build"), allowed_extensions: self.allowed_extensions.unwrap_or_default(), recursive_search: self.recursive_search, + tool_type: self.tool_type, } } } @@ -339,7 +366,7 @@ where folders_to_check.extend(self.root_dirs); let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(self.progress_sender, 0, self.max_stage, 0, self.checking_method); + prepare_thread_handler_common(self.progress_sender, 0, self.max_stage, 0, self.checking_method, self.tool_type); let DirTraversal { collect, diff --git a/czkawka_core/src/duplicate.rs b/czkawka_core/src/duplicate.rs index fa6e88a..b83ca7a 100644 --- a/czkawka_core/src/duplicate.rs +++ b/czkawka_core/src/duplicate.rs @@ -21,7 +21,7 @@ use rayon::prelude::*; use xxhash_rust::xxh3::Xxh3; use crate::common::{open_cache_folder, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads}; -use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData}; +use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData, ToolType}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -81,6 +81,7 @@ impl Info { } pub struct DuplicateFinder { + tool_type: ToolType, text_messages: Messages, information: Info, files_with_identical_names: BTreeMap>, // File Size, File Entry @@ -116,6 +117,7 @@ impl DuplicateFinder { #[must_use] pub fn new() -> Self { Self { + tool_type: ToolType::Duplicate, text_messages: Messages::new(), information: Info::new(), files_with_identical_names: Default::default(), @@ -675,8 +677,14 @@ impl DuplicateFinder { pre_checked_map: &mut BTreeMap>, ) -> Option<()> { let check_type = self.hash_type; - let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = - prepare_thread_handler_common(progress_sender, 1, 2, self.files_with_identical_size.values().map(Vec::len).sum(), self.check_method); + let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = prepare_thread_handler_common( + progress_sender, + 1, + 2, + self.files_with_identical_size.values().map(Vec::len).sum(), + self.check_method, + self.tool_type, + ); let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.prehash_load_cache_at_start(); @@ -831,7 +839,7 @@ impl DuplicateFinder { let check_type = self.hash_type; let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = - prepare_thread_handler_common(progress_sender, 2, 2, pre_checked_map.values().map(Vec::len).sum(), self.check_method); + prepare_thread_handler_common(progress_sender, 2, 2, pre_checked_map.values().map(Vec::len).sum(), self.check_method, self.tool_type); ///////////////////////////////////////////////////////////////////////////// HASHING START { diff --git a/czkawka_core/src/empty_files.rs b/czkawka_core/src/empty_files.rs index 2b49cfa..910f840 100644 --- a/czkawka_core/src/empty_files.rs +++ b/czkawka_core/src/empty_files.rs @@ -7,7 +7,7 @@ use std::path::PathBuf; use crossbeam_channel::Receiver; use futures::channel::mpsc::UnboundedSender; -use crate::common_dir_traversal::{DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData}; +use crate::common_dir_traversal::{DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData, ToolType}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -35,6 +35,8 @@ impl Info { /// Struct with required information's to work pub struct EmptyFiles { + #[allow(dead_code)] + tool_type: ToolType, text_messages: Messages, information: Info, empty_files: Vec, @@ -50,6 +52,7 @@ impl EmptyFiles { #[must_use] pub fn new() -> Self { Self { + tool_type: ToolType::EmptyFiles, text_messages: Messages::new(), information: Info::new(), recursive_search: true, diff --git a/czkawka_core/src/empty_folder.rs b/czkawka_core/src/empty_folder.rs index 431298d..7ce276e 100644 --- a/czkawka_core/src/empty_folder.rs +++ b/czkawka_core/src/empty_folder.rs @@ -7,7 +7,7 @@ use std::path::PathBuf; use crossbeam_channel::Receiver; use futures::channel::mpsc::UnboundedSender; -use crate::common_dir_traversal::{Collect, DirTraversalBuilder, DirTraversalResult, FolderEmptiness, FolderEntry, ProgressData}; +use crate::common_dir_traversal::{Collect, DirTraversalBuilder, DirTraversalResult, FolderEmptiness, FolderEntry, ProgressData, ToolType}; use crate::common_directory::Directories; use crate::common_items::ExcludedItems; use crate::common_messages::Messages; @@ -15,6 +15,8 @@ use crate::common_traits::{DebugPrint, PrintResults, SaveResults}; /// Struct to store most basics info about all folder pub struct EmptyFolder { + #[allow(dead_code)] + tool_type: ToolType, information: Info, delete_folders: bool, text_messages: Messages, @@ -43,6 +45,7 @@ impl EmptyFolder { #[must_use] pub fn new() -> Self { Self { + tool_type: ToolType::EmptyFolders, information: Default::default(), delete_folders: false, text_messages: Messages::new(), diff --git a/czkawka_core/src/invalid_symlinks.rs b/czkawka_core/src/invalid_symlinks.rs index 0dedf43..5813940 100644 --- a/czkawka_core/src/invalid_symlinks.rs +++ b/czkawka_core/src/invalid_symlinks.rs @@ -7,7 +7,7 @@ use std::path::PathBuf; use crossbeam_channel::Receiver; use futures::channel::mpsc::UnboundedSender; -use crate::common_dir_traversal::{Collect, DirTraversalBuilder, DirTraversalResult, ErrorType, FileEntry, ProgressData}; +use crate::common_dir_traversal::{Collect, DirTraversalBuilder, DirTraversalResult, ErrorType, FileEntry, ProgressData, ToolType}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -35,6 +35,8 @@ impl Info { /// Struct with required information's to work pub struct InvalidSymlinks { + #[allow(dead_code)] + tool_type: ToolType, text_messages: Messages, information: Info, invalid_symlinks: Vec, @@ -50,6 +52,7 @@ impl InvalidSymlinks { #[must_use] pub fn new() -> Self { Self { + tool_type: ToolType::InvalidSymlinks, text_messages: Messages::new(), information: Info::new(), recursive_search: true, diff --git a/czkawka_core/src/same_music.rs b/czkawka_core/src/same_music.rs index 974fc98..6c031a9 100644 --- a/czkawka_core/src/same_music.rs +++ b/czkawka_core/src/same_music.rs @@ -25,7 +25,7 @@ use symphonia::core::probe::Hint; use crate::common::{create_crash_message, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, AUDIO_FILES_EXTENSIONS}; use crate::common::{filter_reference_folders_generic, open_cache_folder}; -use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData}; +use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData, ToolType}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -108,6 +108,7 @@ impl Info { /// Struct with required information's to work pub struct SameMusic { + tool_type: ToolType, text_messages: Messages, information: Info, music_to_check: HashMap, @@ -138,6 +139,7 @@ impl SameMusic { #[must_use] pub fn new() -> Self { Self { + tool_type: ToolType::SameMusic, text_messages: Messages::new(), information: Info::new(), recursive_search: true, @@ -415,7 +417,7 @@ impl SameMusic { let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.load_cache(false); let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = - prepare_thread_handler_common(progress_sender, 1, 3, non_cached_files_to_check.len(), self.check_type); + prepare_thread_handler_common(progress_sender, 1, 3, non_cached_files_to_check.len(), self.check_type, self.tool_type); let configuration = &self.hash_preset_config; // Clean for duplicate files @@ -461,7 +463,7 @@ impl SameMusic { let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.load_cache(true); let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = - prepare_thread_handler_common(progress_sender, 1, 2, non_cached_files_to_check.len(), self.check_type); + prepare_thread_handler_common(progress_sender, 1, 2, non_cached_files_to_check.len(), self.check_type, self.tool_type); // Clean for duplicate files let mut vec_file_entry = non_cached_files_to_check @@ -502,7 +504,7 @@ impl SameMusic { fn check_for_duplicate_tags(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender>) -> bool { let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, 2, 2, self.music_to_check.len(), self.check_type); + prepare_thread_handler_common(progress_sender, 2, 2, self.music_to_check.len(), self.check_type, self.tool_type); let mut old_duplicates: Vec> = vec![self.music_entries.clone()]; let mut new_duplicates: Vec> = Vec::new(); @@ -601,7 +603,7 @@ impl SameMusic { fn read_tags_to_files_similar_by_content(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender>) -> bool { let groups_to_check = max(self.duplicated_music_entries.len(), self.duplicated_music_entries_referenced.len()); let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = - prepare_thread_handler_common(progress_sender, 3, 3, groups_to_check, self.check_type); + prepare_thread_handler_common(progress_sender, 3, 3, groups_to_check, self.check_type, self.tool_type); // TODO is ther a way to just run iterator and not collect any info? if !self.duplicated_music_entries.is_empty() { @@ -726,7 +728,7 @@ impl SameMusic { fn check_for_duplicate_fingerprints(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender>) -> bool { let (base_files, files_to_compare) = self.split_fingerprints_to_check(); let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = - prepare_thread_handler_common(progress_sender, 2, 3, base_files.len(), self.check_type); + prepare_thread_handler_common(progress_sender, 2, 3, base_files.len(), self.check_type, self.tool_type); let Some(duplicated_music_entries) = self.compare_fingerprints(stop_receiver, &atomic_counter, base_files, &files_to_compare) else { send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle); diff --git a/czkawka_core/src/similar_images.rs b/czkawka_core/src/similar_images.rs index f9b8aa8..29dcdcb 100644 --- a/czkawka_core/src/similar_images.rs +++ b/czkawka_core/src/similar_images.rs @@ -25,7 +25,7 @@ use crate::common::{ check_folder_children, create_crash_message, get_dynamic_image_from_raw_image, get_number_of_threads, open_cache_folder, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, HEIC_EXTENSIONS, IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS, RAW_IMAGE_EXTENSIONS, }; -use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData}; +use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData, ToolType}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -85,6 +85,7 @@ impl bk_tree::Metric for Hamming { /// Struct to store most basics info about all folder pub struct SimilarImages { + tool_type: ToolType, information: Info, text_messages: Messages, directories: Directories, @@ -131,6 +132,7 @@ impl SimilarImages { #[must_use] pub fn new() -> Self { Self { + tool_type: ToolType::SimilarImages, information: Default::default(), text_messages: Messages::new(), directories: Directories::new(), @@ -300,7 +302,8 @@ impl SimilarImages { folders_to_check.push(id.clone()); } - let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = prepare_thread_handler_common(progress_sender, 0, 2, 0, CheckingMethod::None); + let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = + prepare_thread_handler_common(progress_sender, 0, 2, 0, CheckingMethod::None, self.tool_type); while !folders_to_check.is_empty() { if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { @@ -435,7 +438,7 @@ impl SimilarImages { let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.hash_images_load_cache(); let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = - prepare_thread_handler_common(progress_sender, 1, 2, non_cached_files_to_check.len(), CheckingMethod::None); + prepare_thread_handler_common(progress_sender, 1, 2, non_cached_files_to_check.len(), CheckingMethod::None, self.tool_type); let mut vec_file_entry: Vec<(FileEntry, ImHash)> = non_cached_files_to_check .into_par_iter() @@ -816,7 +819,7 @@ impl SimilarImages { } } else { let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = - prepare_thread_handler_common(progress_sender, 2, 2, all_hashes.len(), CheckingMethod::None); + prepare_thread_handler_common(progress_sender, 2, 2, all_hashes.len(), CheckingMethod::None, self.tool_type); // Don't use hashes with multiple images in bktree, because they will always be master of group and cannot be find by other hashes diff --git a/czkawka_core/src/similar_videos.rs b/czkawka_core/src/similar_videos.rs index 366a180..c81879a 100644 --- a/czkawka_core/src/similar_videos.rs +++ b/czkawka_core/src/similar_videos.rs @@ -18,7 +18,7 @@ use vid_dup_finder_lib::{NormalizedTolerance, VideoHash}; use crate::common::open_cache_folder; use crate::common::{check_folder_children, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads, VIDEO_FILES_EXTENSIONS}; -use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData}; +use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData, ToolType}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -60,6 +60,7 @@ impl bk_tree::Metric> for Hamming { /// Struct to store most basics info about all folder pub struct SimilarVideos { + tool_type: ToolType, information: Info, text_messages: Messages, directories: Directories, @@ -101,6 +102,7 @@ impl SimilarVideos { #[must_use] pub fn new() -> Self { Self { + tool_type: ToolType::SimilarVideos, information: Default::default(), text_messages: Messages::new(), directories: Directories::new(), @@ -261,7 +263,8 @@ impl SimilarVideos { folders_to_check.push(id.clone()); } - let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = prepare_thread_handler_common(progress_sender, 0, 1, 0, CheckingMethod::None); + let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = + prepare_thread_handler_common(progress_sender, 0, 1, 0, CheckingMethod::None, self.tool_type); while !folders_to_check.is_empty() { if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { @@ -390,7 +393,7 @@ impl SimilarVideos { let (loaded_hash_map, records_already_cached, non_cached_files_to_check) = self.load_cache_at_start(); let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = - prepare_thread_handler_common(progress_sender, 1, 1, non_cached_files_to_check.len(), CheckingMethod::None); + prepare_thread_handler_common(progress_sender, 1, 1, non_cached_files_to_check.len(), CheckingMethod::None, self.tool_type); let mut vec_file_entry: Vec = non_cached_files_to_check .par_iter() diff --git a/czkawka_core/src/temporary.rs b/czkawka_core/src/temporary.rs index a0c9674..a0c3294 100644 --- a/czkawka_core/src/temporary.rs +++ b/czkawka_core/src/temporary.rs @@ -11,7 +11,7 @@ use futures::channel::mpsc::UnboundedSender; use rayon::prelude::*; use crate::common::{check_folder_children, prepare_thread_handler_common, send_info_and_wait_for_ending_all_threads}; -use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData}; +use crate::common_dir_traversal::{common_get_entry_data_metadata, common_read_dir, get_lowercase_name, get_modified_time, CheckingMethod, ProgressData, ToolType}; use crate::common_directory::Directories; use crate::common_items::ExcludedItems; use crate::common_messages::Messages; @@ -60,6 +60,7 @@ impl Info { /// Struct with required information's to work pub struct Temporary { + tool_type: ToolType, text_messages: Messages, information: Info, temporary_files: Vec, @@ -74,6 +75,7 @@ impl Temporary { #[must_use] pub fn new() -> Self { Self { + tool_type: ToolType::TemporaryFiles, text_messages: Messages::new(), information: Info::new(), recursive_search: true, @@ -149,7 +151,8 @@ impl Temporary { folders_to_check.push(id.clone()); } - let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = prepare_thread_handler_common(progress_sender, 0, 0, 0, CheckingMethod::None); + let (progress_thread_handle, progress_thread_run, atomic_counter, _check_was_stopped) = + prepare_thread_handler_common(progress_sender, 0, 0, 0, CheckingMethod::None, self.tool_type); while !folders_to_check.is_empty() { if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { diff --git a/czkawka_gui/src/connect_things/connect_button_search.rs b/czkawka_gui/src/connect_things/connect_button_search.rs index 41e9d83..1286dc6 100644 --- a/czkawka_gui/src/connect_things/connect_button_search.rs +++ b/czkawka_gui/src/connect_things/connect_button_search.rs @@ -33,21 +33,7 @@ use crate::taskbar_progress::tbp_flags::TBPF_NOPROGRESS; use crate::{flg, DEFAULT_MAXIMAL_FILE_SIZE, DEFAULT_MINIMAL_CACHE_SIZE, DEFAULT_MINIMAL_FILE_SIZE}; #[allow(clippy::too_many_arguments)] -pub fn connect_button_search( - gui_data: &GuiData, - glib_stop_sender: Sender, - futures_sender_duplicate_files: UnboundedSender, - futures_sender_empty_files: UnboundedSender, - futures_sender_empty_folder: UnboundedSender, - futures_sender_big_file: UnboundedSender, - futures_sender_same_music: UnboundedSender, - futures_sender_similar_images: UnboundedSender, - futures_sender_similar_videos: UnboundedSender, - futures_sender_temporary: UnboundedSender, - futures_sender_invalid_symlinks: UnboundedSender, - futures_sender_broken_files: UnboundedSender, - futures_sender_bad_extensions: UnboundedSender, -) { +pub fn connect_button_search(gui_data: &GuiData, glib_stop_sender: Sender, progress_sender: UnboundedSender) { let buttons_array = gui_data.bottom_buttons.buttons_array.clone(); let buttons_search_clone = gui_data.bottom_buttons.buttons_search.clone(); let grid_progress_stages = gui_data.progress_window.grid_progress_stages.clone(); @@ -109,7 +95,7 @@ pub fn connect_button_search( stop_receiver, glib_stop_sender, &grid_progress_stages, - futures_sender_duplicate_files.clone(), + progress_sender.clone(), ), NotebookMainEnum::EmptyFiles => empty_files_search( &gui_data, @@ -117,7 +103,7 @@ pub fn connect_button_search( stop_receiver, glib_stop_sender, &grid_progress_stages, - futures_sender_empty_files.clone(), + progress_sender.clone(), ), NotebookMainEnum::EmptyDirectories => empty_directories_search( &gui_data, @@ -125,7 +111,7 @@ pub fn connect_button_search( stop_receiver, glib_stop_sender, &grid_progress_stages, - futures_sender_empty_folder.clone(), + progress_sender.clone(), ), NotebookMainEnum::BigFiles => big_files_search( &gui_data, @@ -133,7 +119,7 @@ pub fn connect_button_search( stop_receiver, glib_stop_sender, &grid_progress_stages, - futures_sender_big_file.clone(), + progress_sender.clone(), ), NotebookMainEnum::Temporary => temporary_files_search( &gui_data, @@ -141,7 +127,7 @@ pub fn connect_button_search( stop_receiver, glib_stop_sender, &grid_progress_stages, - futures_sender_temporary.clone(), + progress_sender.clone(), ), NotebookMainEnum::SimilarImages => similar_image_search( &gui_data, @@ -149,7 +135,7 @@ pub fn connect_button_search( stop_receiver, glib_stop_sender, &grid_progress_stages, - futures_sender_similar_images.clone(), + progress_sender.clone(), ), NotebookMainEnum::SimilarVideos => similar_video_search( &gui_data, @@ -157,7 +143,7 @@ pub fn connect_button_search( stop_receiver, glib_stop_sender, &grid_progress_stages, - futures_sender_similar_videos.clone(), + progress_sender.clone(), ), NotebookMainEnum::SameMusic => same_music_search( &gui_data, @@ -165,7 +151,7 @@ pub fn connect_button_search( stop_receiver, glib_stop_sender, &grid_progress_stages, - futures_sender_same_music.clone(), + progress_sender.clone(), &show_dialog, ), NotebookMainEnum::Symlinks => bad_symlinks_search( @@ -174,7 +160,7 @@ pub fn connect_button_search( stop_receiver, glib_stop_sender, &grid_progress_stages, - futures_sender_invalid_symlinks.clone(), + progress_sender.clone(), ), NotebookMainEnum::BrokenFiles => broken_files_search( &gui_data, @@ -182,7 +168,7 @@ pub fn connect_button_search( stop_receiver, glib_stop_sender, &grid_progress_stages, - futures_sender_broken_files.clone(), + progress_sender.clone(), &show_dialog, ), NotebookMainEnum::BadExtensions => bad_extensions_search( @@ -191,7 +177,7 @@ pub fn connect_button_search( stop_receiver, glib_stop_sender, &grid_progress_stages, - futures_sender_bad_extensions.clone(), + progress_sender.clone(), ), } diff --git a/czkawka_gui/src/connect_things/connect_progress_window.rs b/czkawka_gui/src/connect_things/connect_progress_window.rs index b4111eb..f6f3a24 100644 --- a/czkawka_gui/src/connect_things/connect_progress_window.rs +++ b/czkawka_gui/src/connect_things/connect_progress_window.rs @@ -10,7 +10,7 @@ use gtk4::ProgressBar; use common_dir_traversal::CheckingMethod; use czkawka_core::common_dir_traversal; -use czkawka_core::common_dir_traversal::ProgressData; +use czkawka_core::common_dir_traversal::{ProgressData, ToolType}; use crate::flg; use crate::gui_structs::gui_data::GuiData; @@ -19,304 +19,256 @@ use crate::taskbar_progress::tbp_flags::TBPF_INDETERMINATE; use crate::taskbar_progress::TaskbarProgress; #[allow(clippy::too_many_arguments)] -pub fn connect_progress_window( - gui_data: &GuiData, - futures_receiver_duplicate_files: UnboundedReceiver, - futures_receiver_empty_files: UnboundedReceiver, - futures_receiver_empty_folder: UnboundedReceiver, - futures_receiver_big_files: UnboundedReceiver, - futures_receiver_same_music: UnboundedReceiver, - futures_receiver_similar_images: UnboundedReceiver, - futures_receiver_similar_videos: UnboundedReceiver, - futures_receiver_temporary: UnboundedReceiver, - futures_receiver_invalid_symlinks: UnboundedReceiver, - futures_receiver_broken_files: UnboundedReceiver, - futures_receiver_bad_extensions: UnboundedReceiver, -) { +pub fn connect_progress_window(gui_data: &GuiData, mut progress_receiver: UnboundedReceiver) { let main_context = MainContext::default(); let _guard = main_context.acquire().unwrap(); - process_bar_duplicates(gui_data, &main_context, futures_receiver_duplicate_files); - process_bar_empty_files(gui_data, &main_context, futures_receiver_empty_files); - process_bar_empty_folder(gui_data, &main_context, futures_receiver_empty_folder); - process_bar_big_files(gui_data, &main_context, futures_receiver_big_files); - process_bar_same_music(gui_data, &main_context, futures_receiver_same_music); - process_bar_similar_images(gui_data, &main_context, futures_receiver_similar_images); - process_bar_similar_videos(gui_data, &main_context, futures_receiver_similar_videos); - process_bar_temporary(gui_data, &main_context, futures_receiver_temporary); - process_bar_invalid_symlinks(gui_data, &main_context, futures_receiver_invalid_symlinks); - process_bar_broken_files(gui_data, &main_context, futures_receiver_broken_files); - process_bar_bad_extensions(gui_data, &main_context, futures_receiver_bad_extensions); -} -fn process_bar_empty_files(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_empty_files: UnboundedReceiver) { - let label_stage = gui_data.progress_window.label_stage.clone(); - let taskbar_state = gui_data.taskbar_state.clone(); + let gui_data = gui_data.clone(); let future = async move { - while let Some(item) = futures_receiver_empty_files.next().await { - label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(&item))); - taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); + while let Some(item) = progress_receiver.next().await { + match item.tool_type { + ToolType::Duplicate => process_bar_duplicates(&gui_data, &item), + ToolType::EmptyFiles => process_bar_empty_files(&gui_data, &item), + ToolType::EmptyFolders => process_bar_empty_folder(&gui_data, &item), + ToolType::BigFile => process_bar_big_files(&gui_data, &item), + ToolType::SameMusic => process_bar_same_music(&gui_data, &item), + ToolType::SimilarImages => process_bar_similar_images(&gui_data, &item), + ToolType::SimilarVideos => process_bar_similar_videos(&gui_data, &item), + ToolType::TemporaryFiles => process_bar_temporary(&gui_data, &item), + ToolType::InvalidSymlinks => process_bar_invalid_symlinks(&gui_data, &item), + ToolType::BrokenFiles => process_bar_broken_files(&gui_data, &item), + ToolType::BadExtensions => process_bar_bad_extensions(&gui_data, &item), + ToolType::None => panic!(), + } } }; main_context.spawn_local(future); } -fn process_bar_empty_folder(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_empty_folder: UnboundedReceiver) { +fn process_bar_empty_files(gui_data: &GuiData, item: &ProgressData) { let label_stage = gui_data.progress_window.label_stage.clone(); let taskbar_state = gui_data.taskbar_state.clone(); - let future = async move { - while let Some(item) = futures_receiver_empty_folder.next().await { - label_stage.set_text(&flg!( - "progress_scanning_empty_folders", - generate_translation_hashmap(vec![("folder_number", item.entries_checked.to_string())]) - )); - taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); - } - }; - main_context.spawn_local(future); -} -fn process_bar_big_files(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_big_files: UnboundedReceiver) { - let label_stage = gui_data.progress_window.label_stage.clone(); - let taskbar_state = gui_data.taskbar_state.clone(); - let future = async move { - while let Some(item) = futures_receiver_big_files.next().await { - label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(&item))); - taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); - } - }; - main_context.spawn_local(future); -} -fn process_bar_same_music(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_same_music: UnboundedReceiver) { - let label_stage = gui_data.progress_window.label_stage.clone(); - let progress_bar_current_stage = gui_data.progress_window.progress_bar_current_stage.clone(); - let progress_bar_all_stages = gui_data.progress_window.progress_bar_all_stages.clone(); - let taskbar_state = gui_data.taskbar_state.clone(); - let future = async move { - while let Some(item) = futures_receiver_same_music.next().await { - match item.current_stage { - 0 => { - progress_bar_current_stage.hide(); - label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(&item))); - taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); - } - 1 => { - progress_bar_current_stage.show(); - common_set_data(&item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); - match item.checking_method { - CheckingMethod::AudioTags => label_stage.set_text(&flg!("progress_scanning_music_tags", progress_ratio_tm(&item))), - CheckingMethod::AudioContent => label_stage.set_text(&flg!("progress_scanning_music_content", progress_ratio_tm(&item))), - _ => panic!(), - } - } - 2 => { - common_set_data(&item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); - - match item.checking_method { - CheckingMethod::AudioTags => label_stage.set_text(&flg!("progress_scanning_music_tags_end", progress_ratio_tm(&item))), - CheckingMethod::AudioContent => label_stage.set_text(&flg!("progress_scanning_music_content_end", progress_ratio_tm(&item))), - _ => panic!(), - } - } - 3 => { - common_set_data(&item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); - - match item.checking_method { - CheckingMethod::AudioContent => label_stage.set_text(&flg!("progress_scanning_music_tags", progress_ratio_tm(&item))), - _ => panic!(), - } - } - _ => panic!(), - } - } - }; - main_context.spawn_local(future); + label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(item))); + taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); } -fn process_bar_similar_images(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_similar_images: UnboundedReceiver) { +fn process_bar_empty_folder(gui_data: &GuiData, item: &ProgressData) { + let label_stage = gui_data.progress_window.label_stage.clone(); + let taskbar_state = gui_data.taskbar_state.clone(); + + label_stage.set_text(&flg!( + "progress_scanning_empty_folders", + generate_translation_hashmap(vec![("folder_number", item.entries_checked.to_string())]) + )); + taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); +} +fn process_bar_big_files(gui_data: &GuiData, item: &ProgressData) { + let label_stage = gui_data.progress_window.label_stage.clone(); + let taskbar_state = gui_data.taskbar_state.clone(); + + label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(item))); + taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); +} +fn process_bar_same_music(gui_data: &GuiData, item: &ProgressData) { let label_stage = gui_data.progress_window.label_stage.clone(); let progress_bar_current_stage = gui_data.progress_window.progress_bar_current_stage.clone(); let progress_bar_all_stages = gui_data.progress_window.progress_bar_all_stages.clone(); let taskbar_state = gui_data.taskbar_state.clone(); - let future = async move { - while let Some(item) = futures_receiver_similar_images.next().await { - match item.current_stage { - 0 => { - progress_bar_current_stage.hide(); - label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(&item))); - taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); - } - 1 => { - progress_bar_current_stage.show(); - common_set_data(&item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); - label_stage.set_text(&flg!("progress_scanning_image", progress_ratio_tm(&item))); - } - 2 => { - progress_bar_current_stage.show(); - common_set_data(&item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); - label_stage.set_text(&flg!("progress_comparing_image_hashes", progress_ratio_tm(&item))); - } - _ => panic!(), - } - } - }; - main_context.spawn_local(future); -} -fn process_bar_similar_videos(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_similar_videos: UnboundedReceiver) { - let label_stage = gui_data.progress_window.label_stage.clone(); - let progress_bar_current_stage = gui_data.progress_window.progress_bar_current_stage.clone(); - let progress_bar_all_stages = gui_data.progress_window.progress_bar_all_stages.clone(); - let taskbar_state = gui_data.taskbar_state.clone(); - let future = async move { - while let Some(item) = futures_receiver_similar_videos.next().await { - match item.current_stage { - 0 => { - progress_bar_current_stage.hide(); - label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(&item))); - taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); - } - 1 => { - progress_bar_current_stage.show(); - common_set_data(&item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); - label_stage.set_text(&flg!("progress_scanning_video", progress_ratio_tm(&item))); - } - _ => panic!(), - } - } - }; - main_context.spawn_local(future); -} -fn process_bar_temporary(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_temporary: UnboundedReceiver) { - let label_stage = gui_data.progress_window.label_stage.clone(); - let taskbar_state = gui_data.taskbar_state.clone(); - let future = async move { - while let Some(item) = futures_receiver_temporary.next().await { - label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(&item))); + + match item.current_stage { + 0 => { + progress_bar_current_stage.hide(); + label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(item))); taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); } - }; - main_context.spawn_local(future); + 1 => { + progress_bar_current_stage.show(); + common_set_data(item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); + + match item.checking_method { + CheckingMethod::AudioTags => label_stage.set_text(&flg!("progress_scanning_music_tags", progress_ratio_tm(item))), + CheckingMethod::AudioContent => label_stage.set_text(&flg!("progress_scanning_music_content", progress_ratio_tm(item))), + _ => panic!(), + } + } + 2 => { + common_set_data(item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); + + match item.checking_method { + CheckingMethod::AudioTags => label_stage.set_text(&flg!("progress_scanning_music_tags_end", progress_ratio_tm(item))), + CheckingMethod::AudioContent => label_stage.set_text(&flg!("progress_scanning_music_content_end", progress_ratio_tm(item))), + _ => panic!(), + } + } + 3 => { + common_set_data(item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); + + match item.checking_method { + CheckingMethod::AudioContent => label_stage.set_text(&flg!("progress_scanning_music_tags", progress_ratio_tm(item))), + _ => panic!(), + } + } + _ => panic!(), + } } -fn process_bar_invalid_symlinks(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_invalid_symlinks: UnboundedReceiver) { +fn process_bar_similar_images(gui_data: &GuiData, item: &ProgressData) { let label_stage = gui_data.progress_window.label_stage.clone(); + let progress_bar_current_stage = gui_data.progress_window.progress_bar_current_stage.clone(); + let progress_bar_all_stages = gui_data.progress_window.progress_bar_all_stages.clone(); let taskbar_state = gui_data.taskbar_state.clone(); - let future = async move { - while let Some(item) = futures_receiver_invalid_symlinks.next().await { - label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(&item))); + + match item.current_stage { + 0 => { + progress_bar_current_stage.hide(); + label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(item))); taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); } - }; - main_context.spawn_local(future); + 1 => { + progress_bar_current_stage.show(); + common_set_data(item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); + label_stage.set_text(&flg!("progress_scanning_image", progress_ratio_tm(item))); + } + 2 => { + progress_bar_current_stage.show(); + common_set_data(item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); + label_stage.set_text(&flg!("progress_comparing_image_hashes", progress_ratio_tm(item))); + } + _ => panic!(), + } } -fn process_bar_broken_files(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_broken_files: UnboundedReceiver) { +fn process_bar_similar_videos(gui_data: &GuiData, item: &ProgressData) { let label_stage = gui_data.progress_window.label_stage.clone(); let progress_bar_current_stage = gui_data.progress_window.progress_bar_current_stage.clone(); let progress_bar_all_stages = gui_data.progress_window.progress_bar_all_stages.clone(); let taskbar_state = gui_data.taskbar_state.clone(); - let future = async move { - while let Some(item) = futures_receiver_broken_files.next().await { - match item.current_stage { - 0 => { - progress_bar_current_stage.hide(); - label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(&item))); - taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); - } - 1 => { - progress_bar_current_stage.show(); - common_set_data(&item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); - label_stage.set_text(&flg!("progress_scanning_broken_files", progress_ratio_tm(&item))); - } - _ => panic!(), - } + + match item.current_stage { + 0 => { + progress_bar_current_stage.hide(); + label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(item))); + taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); } - }; - main_context.spawn_local(future); + 1 => { + progress_bar_current_stage.show(); + common_set_data(item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); + label_stage.set_text(&flg!("progress_scanning_video", progress_ratio_tm(item))); + } + _ => panic!(), + } } -fn process_bar_bad_extensions(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_bad_extensions: UnboundedReceiver) { +fn process_bar_temporary(gui_data: &GuiData, item: &ProgressData) { + let label_stage = gui_data.progress_window.label_stage.clone(); + let taskbar_state = gui_data.taskbar_state.clone(); + + label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(item))); + taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); +} +fn process_bar_invalid_symlinks(gui_data: &GuiData, item: &ProgressData) { + let label_stage = gui_data.progress_window.label_stage.clone(); + let taskbar_state = gui_data.taskbar_state.clone(); + + label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(item))); + taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); +} +fn process_bar_broken_files(gui_data: &GuiData, item: &ProgressData) { let label_stage = gui_data.progress_window.label_stage.clone(); let progress_bar_current_stage = gui_data.progress_window.progress_bar_current_stage.clone(); let progress_bar_all_stages = gui_data.progress_window.progress_bar_all_stages.clone(); let taskbar_state = gui_data.taskbar_state.clone(); - let future = async move { - while let Some(item) = futures_receiver_bad_extensions.next().await { - match item.current_stage { - 0 => { - progress_bar_current_stage.hide(); - label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(&item))); - taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); - } - 1 => { - progress_bar_current_stage.show(); - common_set_data(&item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); - label_stage.set_text(&flg!("progress_scanning_extension_of_files", progress_ratio_tm(&item))); - } - _ => panic!(), - } + + match item.current_stage { + 0 => { + progress_bar_current_stage.hide(); + label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(item))); + taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); } - }; - main_context.spawn_local(future); + 1 => { + progress_bar_current_stage.show(); + common_set_data(item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); + label_stage.set_text(&flg!("progress_scanning_broken_files", progress_ratio_tm(item))); + } + _ => panic!(), + } } -fn process_bar_duplicates(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_duplicate_files: UnboundedReceiver) { +fn process_bar_bad_extensions(gui_data: &GuiData, item: &ProgressData) { + let label_stage = gui_data.progress_window.label_stage.clone(); + let progress_bar_current_stage = gui_data.progress_window.progress_bar_current_stage.clone(); + let progress_bar_all_stages = gui_data.progress_window.progress_bar_all_stages.clone(); + let taskbar_state = gui_data.taskbar_state.clone(); + + match item.current_stage { + 0 => { + progress_bar_current_stage.hide(); + label_stage.set_text(&flg!("progress_scanning_general_file", file_number_tm(item))); + taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); + } + 1 => { + progress_bar_current_stage.show(); + common_set_data(item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); + label_stage.set_text(&flg!("progress_scanning_extension_of_files", progress_ratio_tm(item))); + } + _ => panic!(), + } +} +fn process_bar_duplicates(gui_data: &GuiData, item: &ProgressData) { let label_stage = gui_data.progress_window.label_stage.clone(); let progress_bar_current_stage = gui_data.progress_window.progress_bar_current_stage.clone(); let progress_bar_all_stages = gui_data.progress_window.progress_bar_all_stages.clone(); let grid_progress_stages = gui_data.progress_window.grid_progress_stages.clone(); let taskbar_state = gui_data.taskbar_state.clone(); - let future = async move { - while let Some(item) = futures_receiver_duplicate_files.next().await { - match item.checking_method { - CheckingMethod::Hash => { - label_stage.show(); - match item.current_stage { - // Checking Size - 0 => { - progress_bar_current_stage.hide(); - // progress_bar_all_stages.hide(); - progress_bar_all_stages.set_fraction(0 as f64); - label_stage.set_text(&flg!("progress_scanning_size", file_number_tm(&item))); - taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); - } - // Hash - first 1KB file - 1 => { - progress_bar_current_stage.show(); - // progress_bar_all_stages.show(); - common_set_data(&item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); - label_stage.set_text(&flg!("progress_analyzed_partial_hash", progress_ratio_tm(&item))); - } - // Hash - normal hash - 2 => { - common_set_data(&item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); - label_stage.set_text(&flg!("progress_analyzed_full_hash", progress_ratio_tm(&item))); - } - _ => { - panic!("Not available current_stage"); - } - } - } - CheckingMethod::Name => { - label_stage.show(); - grid_progress_stages.hide(); - - label_stage.set_text(&flg!("progress_scanning_name", file_number_tm(&item))); + match item.checking_method { + CheckingMethod::Hash => { + label_stage.show(); + match item.current_stage { + // Checking Size + 0 => { + progress_bar_current_stage.hide(); + // progress_bar_all_stages.hide(); + progress_bar_all_stages.set_fraction(0 as f64); + label_stage.set_text(&flg!("progress_scanning_size", file_number_tm(item))); taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); } - CheckingMethod::SizeName => { - label_stage.show(); - grid_progress_stages.hide(); + // Hash - first 1KB file + 1 => { + progress_bar_current_stage.show(); + // progress_bar_all_stages.show(); + common_set_data(item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); - label_stage.set_text(&flg!("progress_scanning_size_name", file_number_tm(&item))); - taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); + label_stage.set_text(&flg!("progress_analyzed_partial_hash", progress_ratio_tm(item))); } - CheckingMethod::Size => { - label_stage.show(); - grid_progress_stages.hide(); - - label_stage.set_text(&flg!("progress_scanning_size", file_number_tm(&item))); - taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); + // Hash - normal hash + 2 => { + common_set_data(item, &progress_bar_all_stages, &progress_bar_current_stage, &taskbar_state); + label_stage.set_text(&flg!("progress_analyzed_full_hash", progress_ratio_tm(item))); } - _ => panic!(), - }; + _ => { + panic!("Not available current_stage"); + } + } } + CheckingMethod::Name => { + label_stage.show(); + grid_progress_stages.hide(); + + label_stage.set_text(&flg!("progress_scanning_name", file_number_tm(item))); + taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); + } + CheckingMethod::SizeName => { + label_stage.show(); + grid_progress_stages.hide(); + + label_stage.set_text(&flg!("progress_scanning_size_name", file_number_tm(item))); + taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); + } + CheckingMethod::Size => { + label_stage.show(); + grid_progress_stages.hide(); + + label_stage.set_text(&flg!("progress_scanning_size", file_number_tm(item))); + taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE); + } + _ => panic!(), }; - main_context.spawn_local(future); } fn common_set_data(item: &ProgressData, progress_bar_all_stages: &ProgressBar, progress_bar_current_stage: &ProgressBar, taskbar_state: &Rc>) { diff --git a/czkawka_gui/src/main.rs b/czkawka_gui/src/main.rs index 6c4c5d7..b93e38c 100644 --- a/czkawka_gui/src/main.rs +++ b/czkawka_gui/src/main.rs @@ -84,17 +84,7 @@ fn build_ui(application: &Application, arguments: &[OsString]) { let (glib_stop_sender, glib_stop_receiver) = glib::MainContext::channel(glib::PRIORITY_DEFAULT); // Futures progress report - let (futures_sender_duplicate_files, futures_receiver_duplicate_files): (UnboundedSender, UnboundedReceiver) = mpsc::unbounded(); - let (futures_sender_empty_files, futures_receiver_empty_files): (UnboundedSender, UnboundedReceiver) = mpsc::unbounded(); - let (futures_sender_empty_folder, futures_receiver_empty_folder): (UnboundedSender, UnboundedReceiver) = mpsc::unbounded(); - let (futures_sender_big_file, futures_receiver_big_files): (UnboundedSender, UnboundedReceiver) = mpsc::unbounded(); - let (futures_sender_same_music, futures_receiver_same_music): (UnboundedSender, UnboundedReceiver) = mpsc::unbounded(); - let (futures_sender_similar_images, futures_receiver_similar_images): (UnboundedSender, UnboundedReceiver) = mpsc::unbounded(); - let (futures_sender_similar_videos, futures_receiver_similar_videos): (UnboundedSender, UnboundedReceiver) = mpsc::unbounded(); - let (futures_sender_temporary, futures_receiver_temporary): (UnboundedSender, UnboundedReceiver) = mpsc::unbounded(); - let (futures_sender_invalid_symlinks, futures_receiver_invalid_symlinks): (UnboundedSender, UnboundedReceiver) = mpsc::unbounded(); - let (futures_sender_broken_files, futures_receiver_broken_files): (UnboundedSender, UnboundedReceiver) = mpsc::unbounded(); - let (futures_sender_bad_extensions, futures_receiver_bad_extensions): (UnboundedSender, UnboundedReceiver) = mpsc::unbounded(); + let (progress_sender, progress_receiver): (UnboundedSender, UnboundedReceiver) = mpsc::unbounded(); initialize_gui(&mut gui_data); validate_notebook_data(&gui_data); // Must be run after initialization of gui, to check if everything was properly setup @@ -117,21 +107,7 @@ fn build_ui(application: &Application, arguments: &[OsString]) { connect_button_delete(&gui_data); connect_button_save(&gui_data); - connect_button_search( - &gui_data, - glib_stop_sender, - futures_sender_duplicate_files, - futures_sender_empty_files, - futures_sender_empty_folder, - futures_sender_big_file, - futures_sender_same_music, - futures_sender_similar_images, - futures_sender_similar_videos, - futures_sender_temporary, - futures_sender_invalid_symlinks, - futures_sender_broken_files, - futures_sender_bad_extensions, - ); + connect_button_search(&gui_data, glib_stop_sender, progress_sender); connect_button_select(&gui_data); connect_button_sort(&gui_data); connect_button_stop(&gui_data); @@ -145,20 +121,7 @@ fn build_ui(application: &Application, arguments: &[OsString]) { connect_popover_select(&gui_data); connect_popover_sort(&gui_data); connect_compute_results(&gui_data, glib_stop_receiver); - connect_progress_window( - &gui_data, - futures_receiver_duplicate_files, - futures_receiver_empty_files, - futures_receiver_empty_folder, - futures_receiver_big_files, - futures_receiver_same_music, - futures_receiver_similar_images, - futures_receiver_similar_videos, - futures_receiver_temporary, - futures_receiver_invalid_symlinks, - futures_receiver_broken_files, - futures_receiver_bad_extensions, - ); + connect_progress_window(&gui_data, progress_receiver); connect_show_hide_ui(&gui_data); connect_settings(&gui_data); connect_button_about(&gui_data);