Unify progress data code
This commit is contained in:
parent
78d00eeb99
commit
29d135b169
|
@ -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<FileEntry>,
|
||||
|
@ -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<ProgressData>>) -> 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);
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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<String, FileEntry>,
|
||||
|
@ -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<FileEntry> = non_cached_files_to_check
|
||||
.into_par_iter()
|
||||
|
|
|
@ -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<AtomicBool>, Arc<AtomicUsize>, 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) {
|
||||
|
|
|
@ -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<Directories>,
|
||||
excluded_items: Option<ExcludedItems>,
|
||||
allowed_extensions: Option<Extensions>,
|
||||
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,
|
||||
|
|
|
@ -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<String, Vec<FileEntry>>, // 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<u64, Vec<FileEntry>>,
|
||||
) -> 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
|
||||
{
|
||||
|
|
|
@ -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<FileEntry>,
|
||||
|
@ -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,
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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<FileEntry>,
|
||||
|
@ -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,
|
||||
|
|
|
@ -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<String, MusicEntry>,
|
||||
|
@ -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<ProgressData>>) -> 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<MusicEntry>> = vec![self.music_entries.clone()];
|
||||
let mut new_duplicates: Vec<Vec<MusicEntry>> = 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<ProgressData>>) -> 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<ProgressData>>) -> 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);
|
||||
|
|
|
@ -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<ImHash> 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
|
||||
|
||||
|
|
|
@ -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<Vec<u8>> 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<FileEntry> = non_cached_files_to_check
|
||||
.par_iter()
|
||||
|
|
|
@ -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<FileEntry>,
|
||||
|
@ -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() {
|
||||
|
|
|
@ -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<Message>,
|
||||
futures_sender_duplicate_files: UnboundedSender<ProgressData>,
|
||||
futures_sender_empty_files: UnboundedSender<ProgressData>,
|
||||
futures_sender_empty_folder: UnboundedSender<ProgressData>,
|
||||
futures_sender_big_file: UnboundedSender<ProgressData>,
|
||||
futures_sender_same_music: UnboundedSender<ProgressData>,
|
||||
futures_sender_similar_images: UnboundedSender<ProgressData>,
|
||||
futures_sender_similar_videos: UnboundedSender<ProgressData>,
|
||||
futures_sender_temporary: UnboundedSender<ProgressData>,
|
||||
futures_sender_invalid_symlinks: UnboundedSender<ProgressData>,
|
||||
futures_sender_broken_files: UnboundedSender<ProgressData>,
|
||||
futures_sender_bad_extensions: UnboundedSender<ProgressData>,
|
||||
) {
|
||||
pub fn connect_button_search(gui_data: &GuiData, glib_stop_sender: Sender<Message>, progress_sender: UnboundedSender<ProgressData>) {
|
||||
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(),
|
||||
),
|
||||
}
|
||||
|
||||
|
|
|
@ -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<ProgressData>,
|
||||
futures_receiver_empty_files: UnboundedReceiver<ProgressData>,
|
||||
futures_receiver_empty_folder: UnboundedReceiver<ProgressData>,
|
||||
futures_receiver_big_files: UnboundedReceiver<ProgressData>,
|
||||
futures_receiver_same_music: UnboundedReceiver<ProgressData>,
|
||||
futures_receiver_similar_images: UnboundedReceiver<ProgressData>,
|
||||
futures_receiver_similar_videos: UnboundedReceiver<ProgressData>,
|
||||
futures_receiver_temporary: UnboundedReceiver<ProgressData>,
|
||||
futures_receiver_invalid_symlinks: UnboundedReceiver<ProgressData>,
|
||||
futures_receiver_broken_files: UnboundedReceiver<ProgressData>,
|
||||
futures_receiver_bad_extensions: UnboundedReceiver<ProgressData>,
|
||||
) {
|
||||
pub fn connect_progress_window(gui_data: &GuiData, mut progress_receiver: UnboundedReceiver<ProgressData>) {
|
||||
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<ProgressData>) {
|
||||
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<ProgressData>) {
|
||||
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<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_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<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_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<ProgressData>) {
|
||||
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<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_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<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_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<ProgressData>) {
|
||||
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<ProgressData>) {
|
||||
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<ProgressData>) {
|
||||
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<ProgressData>) {
|
||||
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<RefCell<TaskbarProgress>>) {
|
||||
|
|
|
@ -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<ProgressData>, UnboundedReceiver<ProgressData>) = mpsc::unbounded();
|
||||
let (futures_sender_empty_files, futures_receiver_empty_files): (UnboundedSender<ProgressData>, UnboundedReceiver<ProgressData>) = mpsc::unbounded();
|
||||
let (futures_sender_empty_folder, futures_receiver_empty_folder): (UnboundedSender<ProgressData>, UnboundedReceiver<ProgressData>) = mpsc::unbounded();
|
||||
let (futures_sender_big_file, futures_receiver_big_files): (UnboundedSender<ProgressData>, UnboundedReceiver<ProgressData>) = mpsc::unbounded();
|
||||
let (futures_sender_same_music, futures_receiver_same_music): (UnboundedSender<ProgressData>, UnboundedReceiver<ProgressData>) = mpsc::unbounded();
|
||||
let (futures_sender_similar_images, futures_receiver_similar_images): (UnboundedSender<ProgressData>, UnboundedReceiver<ProgressData>) = mpsc::unbounded();
|
||||
let (futures_sender_similar_videos, futures_receiver_similar_videos): (UnboundedSender<ProgressData>, UnboundedReceiver<ProgressData>) = mpsc::unbounded();
|
||||
let (futures_sender_temporary, futures_receiver_temporary): (UnboundedSender<ProgressData>, UnboundedReceiver<ProgressData>) = mpsc::unbounded();
|
||||
let (futures_sender_invalid_symlinks, futures_receiver_invalid_symlinks): (UnboundedSender<ProgressData>, UnboundedReceiver<ProgressData>) = mpsc::unbounded();
|
||||
let (futures_sender_broken_files, futures_receiver_broken_files): (UnboundedSender<ProgressData>, UnboundedReceiver<ProgressData>) = mpsc::unbounded();
|
||||
let (futures_sender_bad_extensions, futures_receiver_bad_extensions): (UnboundedSender<ProgressData>, UnboundedReceiver<ProgressData>) = mpsc::unbounded();
|
||||
let (progress_sender, progress_receiver): (UnboundedSender<ProgressData>, UnboundedReceiver<ProgressData>) = 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);
|
||||
|
|
Loading…
Reference in a new issue