Split into multiple files
This commit is contained in:
parent
fd38b4fac6
commit
5eb6d6fafe
18
Cargo.lock
generated
18
Cargo.lock
generated
|
@ -1780,9 +1780,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
|
|||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.142"
|
||||
version = "0.2.143"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317"
|
||||
checksum = "edc207893e85c5d6be840e969b496b53d94cec8be2d501b214f50daa97fa8024"
|
||||
|
||||
[[package]]
|
||||
name = "libheif-rs"
|
||||
|
@ -3178,9 +3178,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "time"
|
||||
version = "0.3.20"
|
||||
version = "0.3.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890"
|
||||
checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"time-core",
|
||||
|
@ -3188,9 +3188,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "time-core"
|
||||
version = "0.1.0"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd"
|
||||
checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb"
|
||||
|
||||
[[package]]
|
||||
name = "tinystr"
|
||||
|
@ -3770,9 +3770,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "zip"
|
||||
version = "0.6.4"
|
||||
version = "0.6.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0445d0fbc924bb93539b4316c11afb121ea39296f99a3c4c9edad09e3658cdef"
|
||||
checksum = "7e92305c174683d78035cbf1b70e18db6329cc0f1b9cae0a52ca90bf5bfe7125"
|
||||
dependencies = [
|
||||
"aes 0.7.5",
|
||||
"byteorder",
|
||||
|
@ -3784,7 +3784,7 @@ dependencies = [
|
|||
"hmac",
|
||||
"pbkdf2",
|
||||
"sha1",
|
||||
"time 0.3.20",
|
||||
"time 0.3.21",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
|
@ -373,7 +373,8 @@ where
|
|||
entries_to_check
|
||||
.into_iter()
|
||||
.filter_map(|vec_file_entry| {
|
||||
let (mut files_from_referenced_folders, normal_files): (Vec<_>, Vec<_>) = vec_file_entry.into_iter().partition(|e| directories.is_referenced_directory(e.get_path()));
|
||||
let (mut files_from_referenced_folders, normal_files): (Vec<_>, Vec<_>) =
|
||||
vec_file_entry.into_iter().partition(|e| directories.is_in_referenced_directory(e.get_path()));
|
||||
|
||||
if files_from_referenced_folders.is_empty() || normal_files.is_empty() {
|
||||
None
|
||||
|
|
|
@ -34,6 +34,8 @@ pub enum CheckingMethod {
|
|||
SizeName,
|
||||
Size,
|
||||
Hash,
|
||||
AudioTags,
|
||||
AudioContent,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Default, PartialEq, Eq)]
|
||||
|
|
|
@ -306,7 +306,7 @@ impl Directories {
|
|||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn is_referenced_directory(&self, path: &Path) -> bool {
|
||||
pub fn is_in_referenced_directory(&self, path: &Path) -> bool {
|
||||
self.reference_directories.iter().any(|e| path.starts_with(e))
|
||||
}
|
||||
|
||||
|
|
|
@ -182,9 +182,7 @@ impl DuplicateFinder {
|
|||
return;
|
||||
}
|
||||
}
|
||||
CheckingMethod::None => {
|
||||
panic!();
|
||||
}
|
||||
_ => panic!(),
|
||||
}
|
||||
self.delete_files();
|
||||
self.debug_print();
|
||||
|
@ -384,7 +382,7 @@ impl DuplicateFinder {
|
|||
.into_iter()
|
||||
.filter_map(|(_name, vec_file_entry)| {
|
||||
let (mut files_from_referenced_folders, normal_files): (Vec<_>, Vec<_>) =
|
||||
vec_file_entry.into_iter().partition(|e| self.directories.is_referenced_directory(e.get_path()));
|
||||
vec_file_entry.into_iter().partition(|e| self.directories.is_in_referenced_directory(e.get_path()));
|
||||
|
||||
if files_from_referenced_folders.is_empty() || normal_files.is_empty() {
|
||||
None
|
||||
|
@ -464,7 +462,7 @@ impl DuplicateFinder {
|
|||
.into_iter()
|
||||
.filter_map(|(_size, vec_file_entry)| {
|
||||
let (mut files_from_referenced_folders, normal_files): (Vec<_>, Vec<_>) =
|
||||
vec_file_entry.into_iter().partition(|e| self.directories.is_referenced_directory(e.get_path()));
|
||||
vec_file_entry.into_iter().partition(|e| self.directories.is_in_referenced_directory(e.get_path()));
|
||||
|
||||
if files_from_referenced_folders.is_empty() || normal_files.is_empty() {
|
||||
None
|
||||
|
@ -584,7 +582,7 @@ impl DuplicateFinder {
|
|||
.into_iter()
|
||||
.filter_map(|(_size, vec_file_entry)| {
|
||||
let (mut files_from_referenced_folders, normal_files): (Vec<_>, Vec<_>) =
|
||||
vec_file_entry.into_iter().partition(|e| self.directories.is_referenced_directory(e.get_path()));
|
||||
vec_file_entry.into_iter().partition(|e| self.directories.is_in_referenced_directory(e.get_path()));
|
||||
|
||||
if files_from_referenced_folders.is_empty() || normal_files.is_empty() {
|
||||
None
|
||||
|
@ -921,7 +919,7 @@ impl DuplicateFinder {
|
|||
let mut all_results_with_same_size = Vec::new();
|
||||
for vec_file_entry in vec_vec_file_entry {
|
||||
let (mut files_from_referenced_folders, normal_files): (Vec<_>, Vec<_>) =
|
||||
vec_file_entry.into_iter().partition(|e| self.directories.is_referenced_directory(e.get_path()));
|
||||
vec_file_entry.into_iter().partition(|e| self.directories.is_in_referenced_directory(e.get_path()));
|
||||
|
||||
if files_from_referenced_folders.is_empty() || normal_files.is_empty() {
|
||||
continue;
|
||||
|
@ -1012,10 +1010,7 @@ impl DuplicateFinder {
|
|||
let _tuple: (u64, usize, usize) = delete_files(vector, &self.delete_method, &mut self.text_messages, self.dryrun);
|
||||
}
|
||||
}
|
||||
CheckingMethod::None => {
|
||||
//Just do nothing
|
||||
panic!("Checking method should never be none.");
|
||||
}
|
||||
_ => panic!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1206,9 +1201,7 @@ impl SaveResults for DuplicateFinder {
|
|||
write!(writer, "Not found any duplicates.").unwrap();
|
||||
}
|
||||
}
|
||||
CheckingMethod::None => {
|
||||
panic!();
|
||||
}
|
||||
_ => panic!(),
|
||||
}
|
||||
|
||||
true
|
||||
|
@ -1294,9 +1287,7 @@ impl PrintResults for DuplicateFinder {
|
|||
println!();
|
||||
}
|
||||
}
|
||||
CheckingMethod::None => {
|
||||
panic!("Checking Method shouldn't be ever set to None");
|
||||
}
|
||||
_ => panic!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,12 +37,6 @@ pub enum DeleteMethod {
|
|||
Delete,
|
||||
}
|
||||
|
||||
#[derive(Eq, PartialEq, Clone, Debug, Copy)]
|
||||
pub enum AudioCheckMethod {
|
||||
Tags,
|
||||
Content,
|
||||
}
|
||||
|
||||
bitflags! {
|
||||
#[derive(PartialEq, Copy, Clone, Debug)]
|
||||
pub struct MusicSimilarity : u32 {
|
||||
|
@ -133,7 +127,7 @@ pub struct SameMusic {
|
|||
delete_outdated_cache: bool, // TODO add this to GUI
|
||||
use_reference_folders: bool,
|
||||
save_also_as_json: bool,
|
||||
check_type: AudioCheckMethod,
|
||||
check_type: CheckingMethod,
|
||||
hash_preset_config: Configuration,
|
||||
minimum_segment_duration: f32,
|
||||
maximum_difference: f64,
|
||||
|
@ -163,7 +157,7 @@ impl SameMusic {
|
|||
use_reference_folders: false,
|
||||
duplicated_music_entries_referenced: vec![],
|
||||
save_also_as_json: false,
|
||||
check_type: AudioCheckMethod::Content,
|
||||
check_type: CheckingMethod::AudioContent,
|
||||
hash_preset_config: Configuration::preset_test1(), // TODO allow to change this
|
||||
minimum_segment_duration: 10.0,
|
||||
maximum_difference: 2.0,
|
||||
|
@ -178,7 +172,7 @@ impl SameMusic {
|
|||
return;
|
||||
}
|
||||
match self.check_type {
|
||||
AudioCheckMethod::Tags => {
|
||||
CheckingMethod::AudioTags => {
|
||||
if !self.read_tags(stop_receiver, progress_sender) {
|
||||
self.stopped_search = true;
|
||||
return;
|
||||
|
@ -188,7 +182,7 @@ impl SameMusic {
|
|||
return;
|
||||
}
|
||||
}
|
||||
AudioCheckMethod::Content => {
|
||||
CheckingMethod::AudioContent => {
|
||||
if !self.calculate_fingerprint(stop_receiver, progress_sender) {
|
||||
self.stopped_search = true;
|
||||
return;
|
||||
|
@ -198,6 +192,7 @@ impl SameMusic {
|
|||
return;
|
||||
}
|
||||
}
|
||||
_ => panic!(),
|
||||
}
|
||||
self.delete_files();
|
||||
self.debug_print();
|
||||
|
@ -703,51 +698,44 @@ impl SameMusic {
|
|||
true
|
||||
}
|
||||
|
||||
// fn split_fingerprints_to_check(&self) -> (Vec<MusicEntry>, Vec<MusicEntry>) {
|
||||
// let mut base_files: Vec<MusicEntry> = Vec::new();
|
||||
// let mut files_to_compare: Vec<MusicEntry> = Vec::new();
|
||||
//
|
||||
// if self.use_reference_folders {
|
||||
// // base_files =
|
||||
// } else {
|
||||
// base_files = self.music_entries.clone();
|
||||
// files_to_compare = self.music_entries.clone();
|
||||
// }
|
||||
//
|
||||
// (base_files, files_to_compare)
|
||||
// }
|
||||
fn split_fingerprints_to_check(&mut self) -> (Vec<MusicEntry>, Vec<MusicEntry>) {
|
||||
let base_files: Vec<MusicEntry>;
|
||||
let files_to_compare: Vec<MusicEntry>;
|
||||
|
||||
// fn compare_improved(&mut self, stop_receiver: Option<&Receiver<()>>, atomic_counter: &Arc<AtomicUsize>) -> Option<Vec<Vec<MusicEntry>>> {}
|
||||
if self.use_reference_folders {
|
||||
(base_files, files_to_compare) = mem::take(&mut self.music_entries)
|
||||
.into_iter()
|
||||
.partition(|f| self.directories.is_in_referenced_directory(f.get_path()));
|
||||
} else {
|
||||
base_files = self.music_entries.clone();
|
||||
files_to_compare = mem::take(&mut self.music_entries);
|
||||
}
|
||||
|
||||
(base_files, files_to_compare)
|
||||
}
|
||||
|
||||
fn compare_fingerprints(&mut self, stop_receiver: Option<&Receiver<()>>, atomic_counter: &Arc<AtomicUsize>) -> Option<Vec<Vec<MusicEntry>>> {
|
||||
// TODO do optimization
|
||||
// Multithreading
|
||||
// Grouping same hashes(not sure how common, but probably with a lot of files can save some time)
|
||||
// Better algorithm of finding similar fingerprints
|
||||
|
||||
let mut used_paths: HashSet<String> = Default::default();
|
||||
|
||||
let (base_files, files_to_compare) = self.split_fingerprints_to_check();
|
||||
let configuration = &self.hash_preset_config;
|
||||
let minimum_segment_duration = self.minimum_segment_duration;
|
||||
let maximum_difference = self.maximum_difference;
|
||||
|
||||
let mut duplicated_music_entries = Vec::new();
|
||||
|
||||
for (f_idx, f_entry) in self.music_entries.iter().enumerate() {
|
||||
if f_idx + 1 == self.music_entries.len() {
|
||||
break;
|
||||
}
|
||||
|
||||
for f_entry in base_files {
|
||||
atomic_counter.fetch_add(1, Ordering::Relaxed);
|
||||
if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
||||
return None;
|
||||
}
|
||||
atomic_counter.fetch_add(1, Ordering::Relaxed);
|
||||
|
||||
let f_string = f_entry.path.to_string_lossy().to_string();
|
||||
if used_paths.contains(&f_string) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let mut collected_similar_items = self.music_entries[f_idx + 1..]
|
||||
let mut collected_similar_items = files_to_compare
|
||||
.par_iter()
|
||||
.filter_map(|e_entry| {
|
||||
let e_string = e_entry.path.to_string_lossy().to_string();
|
||||
|
@ -779,6 +767,66 @@ impl SameMusic {
|
|||
Some(duplicated_music_entries)
|
||||
}
|
||||
|
||||
// fn compare_fingerprints(&mut self, stop_receiver: Option<&Receiver<()>>, atomic_counter: &Arc<AtomicUsize>) -> Option<Vec<Vec<MusicEntry>>> {
|
||||
// // TODO do optimization
|
||||
// // Multithreading
|
||||
// // Grouping same hashes(not sure how common, but probably with a lot of files can save some time)
|
||||
// // Better algorithm of finding similar fingerprints
|
||||
//
|
||||
// let mut used_paths: HashSet<String> = Default::default();
|
||||
// let configuration = &self.hash_preset_config;
|
||||
// let minimum_segment_duration = self.minimum_segment_duration;
|
||||
// let maximum_difference = self.maximum_difference;
|
||||
//
|
||||
// let mut duplicated_music_entries = Vec::new();
|
||||
//
|
||||
// for (f_idx, f_entry) in self.music_entries.iter().enumerate() {
|
||||
// if f_idx + 1 == self.music_entries.len() {
|
||||
// break;
|
||||
// }
|
||||
//
|
||||
// if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() {
|
||||
// return None;
|
||||
// }
|
||||
// atomic_counter.fetch_add(1, Ordering::Relaxed);
|
||||
//
|
||||
// let f_string = f_entry.path.to_string_lossy().to_string();
|
||||
// if used_paths.contains(&f_string) {
|
||||
// continue;
|
||||
// }
|
||||
//
|
||||
// let mut collected_similar_items = self.music_entries[f_idx + 1..]
|
||||
// .par_iter()
|
||||
// .filter_map(|e_entry| {
|
||||
// let e_string = e_entry.path.to_string_lossy().to_string();
|
||||
// if used_paths.contains(&e_string) {
|
||||
// return None;
|
||||
// }
|
||||
// let mut segments = match_fingerprints(&f_entry.fingerprint, &e_entry.fingerprint, configuration).unwrap();
|
||||
// segments.retain(|s| s.duration(configuration) > minimum_segment_duration && s.score < maximum_difference);
|
||||
// if segments.is_empty() {
|
||||
// None
|
||||
// } else {
|
||||
// Some((e_string, e_entry))
|
||||
// }
|
||||
// })
|
||||
// .collect::<Vec<_>>();
|
||||
//
|
||||
// collected_similar_items.retain(|(path, _entry)| !used_paths.contains(path));
|
||||
// if !collected_similar_items.is_empty() {
|
||||
// let mut music_entries = Vec::new();
|
||||
// for (path, entry) in collected_similar_items {
|
||||
// used_paths.insert(path);
|
||||
// music_entries.push(entry.clone());
|
||||
// }
|
||||
// used_paths.insert(f_string);
|
||||
// music_entries.push(f_entry.clone());
|
||||
// duplicated_music_entries.push(music_entries);
|
||||
// }
|
||||
// }
|
||||
// Some(duplicated_music_entries)
|
||||
// }
|
||||
|
||||
fn check_for_duplicate_fingerprints(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender<ProgressData>>) -> bool {
|
||||
assert_ne!(MusicSimilarity::NONE, self.music_similarity, "This can't be none");
|
||||
|
||||
|
@ -801,9 +849,7 @@ impl SameMusic {
|
|||
|
||||
send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle);
|
||||
|
||||
// TODO fill this with proper values
|
||||
self.duplicated_music_entries = duplicated_music_entries;
|
||||
// Use
|
||||
|
||||
if self.use_reference_folders {
|
||||
self.duplicated_music_entries_referenced = filter_reference_folders_generic(mem::take(&mut self.duplicated_music_entries), &self.directories);
|
||||
|
|
|
@ -913,7 +913,7 @@ impl SimilarImages {
|
|||
.into_iter()
|
||||
.filter_map(|vec_file_entry| {
|
||||
let (mut files_from_referenced_folders, normal_files): (Vec<_>, Vec<_>) =
|
||||
vec_file_entry.into_iter().partition(|e| self.directories.is_referenced_directory(e.get_path()));
|
||||
vec_file_entry.into_iter().partition(|e| self.directories.is_in_referenced_directory(e.get_path()));
|
||||
|
||||
if files_from_referenced_folders.is_empty() || normal_files.is_empty() {
|
||||
None
|
||||
|
|
|
@ -517,7 +517,7 @@ impl SimilarVideos {
|
|||
.into_iter()
|
||||
.filter_map(|vec_file_entry| {
|
||||
let (mut files_from_referenced_folders, normal_files): (Vec<_>, Vec<_>) =
|
||||
vec_file_entry.into_iter().partition(|e| self.directories.is_referenced_directory(e.get_path()));
|
||||
vec_file_entry.into_iter().partition(|e| self.directories.is_in_referenced_directory(e.get_path()));
|
||||
|
||||
if files_from_referenced_folders.is_empty() || normal_files.is_empty() {
|
||||
None
|
||||
|
|
|
@ -1164,7 +1164,7 @@ fn computer_duplicate_finder(
|
|||
duplicates_size = information.lost_space_by_size;
|
||||
duplicates_group = information.number_of_groups_by_size_name;
|
||||
}
|
||||
CheckingMethod::None => {
|
||||
_ => {
|
||||
panic!();
|
||||
}
|
||||
}
|
||||
|
@ -1251,7 +1251,7 @@ fn computer_duplicate_finder(
|
|||
}
|
||||
}
|
||||
}
|
||||
CheckingMethod::None => {
|
||||
_ => {
|
||||
panic!();
|
||||
}
|
||||
}
|
||||
|
@ -1310,7 +1310,7 @@ fn computer_duplicate_finder(
|
|||
}
|
||||
}
|
||||
}
|
||||
CheckingMethod::None => {
|
||||
_ => {
|
||||
panic!();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
use common_dir_traversal::CheckingMethod;
|
||||
use futures::channel::mpsc::UnboundedReceiver;
|
||||
use futures::StreamExt;
|
||||
use glib::MainContext;
|
||||
use gtk4::prelude::*;
|
||||
|
||||
use czkawka_core::common_dir_traversal;
|
||||
|
@ -13,132 +15,34 @@ use crate::taskbar_progress::tbp_flags::TBPF_INDETERMINATE;
|
|||
#[allow(clippy::too_many_arguments)]
|
||||
pub fn connect_progress_window(
|
||||
gui_data: &GuiData,
|
||||
mut futures_receiver_duplicate_files: UnboundedReceiver<ProgressData>,
|
||||
mut futures_receiver_empty_files: UnboundedReceiver<ProgressData>,
|
||||
mut futures_receiver_empty_folder: UnboundedReceiver<ProgressData>,
|
||||
mut futures_receiver_big_files: UnboundedReceiver<ProgressData>,
|
||||
mut futures_receiver_same_music: UnboundedReceiver<ProgressData>,
|
||||
mut futures_receiver_similar_images: UnboundedReceiver<ProgressData>,
|
||||
mut futures_receiver_similar_videos: UnboundedReceiver<ProgressData>,
|
||||
mut futures_receiver_temporary: UnboundedReceiver<ProgressData>,
|
||||
mut futures_receiver_invalid_symlinks: UnboundedReceiver<ProgressData>,
|
||||
mut futures_receiver_broken_files: UnboundedReceiver<ProgressData>,
|
||||
mut futures_receiver_bad_extensions: UnboundedReceiver<ProgressData>,
|
||||
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>,
|
||||
) {
|
||||
let main_context = glib::MainContext::default();
|
||||
let main_context = MainContext::default();
|
||||
let _guard = main_context.acquire().unwrap();
|
||||
|
||||
{
|
||||
// Duplicate Files
|
||||
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 {
|
||||
common_dir_traversal::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",
|
||||
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
|
||||
));
|
||||
taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE);
|
||||
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);
|
||||
}
|
||||
// Hash - first 1KB file
|
||||
1 => {
|
||||
progress_bar_current_stage.show();
|
||||
// progress_bar_all_stages.show();
|
||||
if item.entries_to_check != 0 {
|
||||
progress_bar_all_stages.set_fraction((1f64 + (item.entries_checked) as f64 / item.entries_to_check as f64) / (item.max_stage + 1) as f64);
|
||||
progress_bar_current_stage.set_fraction((item.entries_checked) as f64 / item.entries_to_check as f64);
|
||||
taskbar_state.borrow().set_progress_value(
|
||||
(item.entries_to_check + item.entries_checked) as u64,
|
||||
item.entries_to_check as u64 * (item.max_stage + 1) as u64,
|
||||
);
|
||||
} else {
|
||||
progress_bar_all_stages.set_fraction((1f64) / (item.max_stage + 1) as f64);
|
||||
progress_bar_current_stage.set_fraction(0f64);
|
||||
taskbar_state.borrow().set_progress_value(1, 1 + item.max_stage as u64);
|
||||
}
|
||||
|
||||
label_stage.set_text(&flg!(
|
||||
"progress_analyzed_partial_hash",
|
||||
generate_translation_hashmap(vec![("file_checked", item.entries_checked.to_string()), ("all_files", item.entries_to_check.to_string())])
|
||||
));
|
||||
}
|
||||
// Hash - normal hash
|
||||
2 => {
|
||||
if item.entries_to_check != 0 {
|
||||
progress_bar_all_stages.set_fraction((2f64 + (item.entries_checked) as f64 / item.entries_to_check as f64) / (item.max_stage + 1) as f64);
|
||||
progress_bar_current_stage.set_fraction((item.entries_checked) as f64 / item.entries_to_check as f64);
|
||||
taskbar_state.borrow().set_progress_value(
|
||||
(2 * item.entries_to_check + item.entries_checked) as u64,
|
||||
item.entries_to_check as u64 * (item.max_stage + 1) as u64,
|
||||
);
|
||||
} else {
|
||||
progress_bar_all_stages.set_fraction((2f64) / (item.max_stage + 1) as f64);
|
||||
progress_bar_current_stage.set_fraction(0f64);
|
||||
taskbar_state.borrow().set_progress_value(2, 1 + item.max_stage as u64);
|
||||
}
|
||||
|
||||
label_stage.set_text(&flg!(
|
||||
"progress_analyzed_full_hash",
|
||||
generate_translation_hashmap(vec![("file_checked", item.entries_checked.to_string()), ("all_files", item.entries_to_check.to_string())])
|
||||
));
|
||||
}
|
||||
_ => {
|
||||
panic!("Not available current_stage");
|
||||
}
|
||||
}
|
||||
}
|
||||
common_dir_traversal::CheckingMethod::Name => {
|
||||
label_stage.show();
|
||||
grid_progress_stages.hide();
|
||||
|
||||
label_stage.set_text(&flg!(
|
||||
"progress_scanning_name",
|
||||
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
|
||||
));
|
||||
taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE);
|
||||
}
|
||||
common_dir_traversal::CheckingMethod::SizeName => {
|
||||
label_stage.show();
|
||||
grid_progress_stages.hide();
|
||||
|
||||
label_stage.set_text(&flg!(
|
||||
"progress_scanning_size_name",
|
||||
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
|
||||
));
|
||||
taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE);
|
||||
}
|
||||
common_dir_traversal::CheckingMethod::Size => {
|
||||
label_stage.show();
|
||||
grid_progress_stages.hide();
|
||||
|
||||
label_stage.set_text(&flg!(
|
||||
"progress_scanning_size",
|
||||
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
|
||||
));
|
||||
taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE);
|
||||
}
|
||||
common_dir_traversal::CheckingMethod::None => {
|
||||
panic!();
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
main_context.spawn_local(future);
|
||||
}
|
||||
{
|
||||
// Empty Files
|
||||
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 future = async move {
|
||||
|
@ -152,8 +56,7 @@ pub fn connect_progress_window(
|
|||
};
|
||||
main_context.spawn_local(future);
|
||||
}
|
||||
{
|
||||
// Empty Folder
|
||||
fn process_bar_empty_folder(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_empty_folder: UnboundedReceiver<ProgressData>) {
|
||||
let label_stage = gui_data.progress_window.label_stage.clone();
|
||||
let taskbar_state = gui_data.taskbar_state.clone();
|
||||
let future = async move {
|
||||
|
@ -167,8 +70,7 @@ pub fn connect_progress_window(
|
|||
};
|
||||
main_context.spawn_local(future);
|
||||
}
|
||||
{
|
||||
// Big Files
|
||||
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 {
|
||||
|
@ -182,8 +84,7 @@ pub fn connect_progress_window(
|
|||
};
|
||||
main_context.spawn_local(future);
|
||||
}
|
||||
{
|
||||
// Same Music
|
||||
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();
|
||||
|
@ -244,8 +145,7 @@ pub fn connect_progress_window(
|
|||
};
|
||||
main_context.spawn_local(future);
|
||||
}
|
||||
{
|
||||
// Similar Images
|
||||
fn process_bar_similar_images(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_similar_images: 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();
|
||||
|
@ -307,8 +207,7 @@ pub fn connect_progress_window(
|
|||
};
|
||||
main_context.spawn_local(future);
|
||||
}
|
||||
{
|
||||
// Similar Videos
|
||||
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();
|
||||
|
@ -351,8 +250,7 @@ pub fn connect_progress_window(
|
|||
};
|
||||
main_context.spawn_local(future);
|
||||
}
|
||||
{
|
||||
// Temporary
|
||||
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 {
|
||||
|
@ -366,8 +264,7 @@ pub fn connect_progress_window(
|
|||
};
|
||||
main_context.spawn_local(future);
|
||||
}
|
||||
{
|
||||
// Invalid Symlinks
|
||||
fn process_bar_invalid_symlinks(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_invalid_symlinks: UnboundedReceiver<ProgressData>) {
|
||||
let label_stage = gui_data.progress_window.label_stage.clone();
|
||||
let taskbar_state = gui_data.taskbar_state.clone();
|
||||
let future = async move {
|
||||
|
@ -381,8 +278,7 @@ pub fn connect_progress_window(
|
|||
};
|
||||
main_context.spawn_local(future);
|
||||
}
|
||||
{
|
||||
// Broken Files
|
||||
fn process_bar_broken_files(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_broken_files: 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();
|
||||
|
@ -425,8 +321,7 @@ pub fn connect_progress_window(
|
|||
};
|
||||
main_context.spawn_local(future);
|
||||
}
|
||||
{
|
||||
// Broken Files
|
||||
fn process_bar_bad_extensions(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_bad_extensions: 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();
|
||||
|
@ -469,4 +364,109 @@ pub fn connect_progress_window(
|
|||
};
|
||||
main_context.spawn_local(future);
|
||||
}
|
||||
fn process_bar_duplicates(gui_data: &GuiData, main_context: &MainContext, mut futures_receiver_duplicate_files: 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 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",
|
||||
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
|
||||
));
|
||||
taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE);
|
||||
}
|
||||
// Hash - first 1KB file
|
||||
1 => {
|
||||
progress_bar_current_stage.show();
|
||||
// progress_bar_all_stages.show();
|
||||
if item.entries_to_check != 0 {
|
||||
progress_bar_all_stages.set_fraction((1f64 + (item.entries_checked) as f64 / item.entries_to_check as f64) / (item.max_stage + 1) as f64);
|
||||
progress_bar_current_stage.set_fraction((item.entries_checked) as f64 / item.entries_to_check as f64);
|
||||
taskbar_state.borrow().set_progress_value(
|
||||
(item.entries_to_check + item.entries_checked) as u64,
|
||||
item.entries_to_check as u64 * (item.max_stage + 1) as u64,
|
||||
);
|
||||
} else {
|
||||
progress_bar_all_stages.set_fraction((1f64) / (item.max_stage + 1) as f64);
|
||||
progress_bar_current_stage.set_fraction(0f64);
|
||||
taskbar_state.borrow().set_progress_value(1, 1 + item.max_stage as u64);
|
||||
}
|
||||
|
||||
label_stage.set_text(&flg!(
|
||||
"progress_analyzed_partial_hash",
|
||||
generate_translation_hashmap(vec![("file_checked", item.entries_checked.to_string()), ("all_files", item.entries_to_check.to_string())])
|
||||
));
|
||||
}
|
||||
// Hash - normal hash
|
||||
2 => {
|
||||
if item.entries_to_check != 0 {
|
||||
progress_bar_all_stages.set_fraction((2f64 + (item.entries_checked) as f64 / item.entries_to_check as f64) / (item.max_stage + 1) as f64);
|
||||
progress_bar_current_stage.set_fraction((item.entries_checked) as f64 / item.entries_to_check as f64);
|
||||
taskbar_state.borrow().set_progress_value(
|
||||
(2 * item.entries_to_check + item.entries_checked) as u64,
|
||||
item.entries_to_check as u64 * (item.max_stage + 1) as u64,
|
||||
);
|
||||
} else {
|
||||
progress_bar_all_stages.set_fraction((2f64) / (item.max_stage + 1) as f64);
|
||||
progress_bar_current_stage.set_fraction(0f64);
|
||||
taskbar_state.borrow().set_progress_value(2, 1 + item.max_stage as u64);
|
||||
}
|
||||
|
||||
label_stage.set_text(&flg!(
|
||||
"progress_analyzed_full_hash",
|
||||
generate_translation_hashmap(vec![("file_checked", item.entries_checked.to_string()), ("all_files", item.entries_to_check.to_string())])
|
||||
));
|
||||
}
|
||||
_ => {
|
||||
panic!("Not available current_stage");
|
||||
}
|
||||
}
|
||||
}
|
||||
CheckingMethod::Name => {
|
||||
label_stage.show();
|
||||
grid_progress_stages.hide();
|
||||
|
||||
label_stage.set_text(&flg!(
|
||||
"progress_scanning_name",
|
||||
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
|
||||
));
|
||||
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",
|
||||
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
|
||||
));
|
||||
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",
|
||||
generate_translation_hashmap(vec![("file_number", item.entries_checked.to_string())])
|
||||
));
|
||||
taskbar_state.borrow().set_progress_state(TBPF_INDETERMINATE);
|
||||
}
|
||||
_ => panic!(),
|
||||
};
|
||||
}
|
||||
};
|
||||
main_context.spawn_local(future);
|
||||
}
|
||||
|
|
|
@ -550,7 +550,7 @@ impl GuiMainNotebook {
|
|||
CheckingMethod::Size => flg!("duplicate_mode_size_combo_box"),
|
||||
CheckingMethod::Name => flg!("duplicate_mode_name_combo_box"),
|
||||
CheckingMethod::SizeName => flg!("duplicate_mode_size_name_combo_box"),
|
||||
CheckingMethod::None => panic!(),
|
||||
_ => panic!(),
|
||||
};
|
||||
self.combo_box_duplicate_check_method.append_text(&text);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue