1
0
Fork 0
mirror of synced 2024-05-17 19:03:08 +12:00
This commit is contained in:
Rafał Mikrut 2023-05-07 11:41:25 +02:00
parent 466970eb41
commit 1cc948110a

View file

@ -1,3 +1,5 @@
use crossbeam_channel::Receiver;
use std::path::PathBuf;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use std::thread;
@ -5,6 +7,7 @@ use std::thread;
use futures::channel::mpsc::UnboundedSender;
use glib::Sender;
use gtk4::prelude::*;
use gtk4::{Grid, ListStore};
use czkawka_core::bad_extensions::BadExtensions;
use czkawka_core::big_file::BigFile;
@ -116,7 +119,10 @@ pub fn connect_button_search(
let check_button_music_approximate_comparison = gui_data.main_notebook.check_button_music_approximate_comparison.clone();
let check_button_settings_save_also_json = gui_data.settings.check_button_settings_save_also_json.clone();
let gui_data = gui_data.clone();
buttons_search_clone.connect_clicked(move |_| {
let loaded_common_items = LoadedCommonItems::load_items(&gui_data);
// Check if user selected all referenced folders
let list_store_included_directories = get_list_store(&tree_view_included_directories);
if check_if_list_store_column_have_all_same_values(&list_store_included_directories, ColumnsIncludedDirectory::ReferenceButton as i32, true) {
@ -124,6 +130,409 @@ pub fn connect_button_search(
return;
}
let show_dialog = Arc::new(AtomicBool::new(true));
window_progress.set_title(Some(&flg!("window_progress_title")));
hide_all_buttons(&buttons_array);
notebook_main.set_sensitive(false);
notebook_upper.set_sensitive(false);
button_settings.set_sensitive(false);
button_app_info.set_sensitive(false);
entry_info.set_text(&flg!("searching_for_data"));
// Resets progress bars
progress_bar_all_stages.set_fraction(0 as f64);
progress_bar_current_stage.set_fraction(0 as f64);
reset_text_view(&text_view_errors);
let glib_stop_sender = glib_stop_sender.clone();
let stop_receiver = stop_receiver.clone();
// Consume any stale stop messages.
stop_receiver.try_iter().for_each(|_| ());
label_stage.show();
match to_notebook_main_enum(notebook_main.current_page().unwrap()) {
NotebookMainEnum::Duplicate => duplicate_search(
&gui_data,
loaded_common_items,
stop_receiver,
glib_stop_sender,
&grid_progress_stages,
futures_sender_duplicate_files.clone(),
),
NotebookMainEnum::EmptyFiles => {
grid_progress_stages.hide();
get_list_store(&tree_view_empty_files_finder).clear();
let futures_sender_empty_files = futures_sender_empty_files.clone();
// Find empty files
thread::spawn(move || {
let mut vf = EmptyFiles::new();
vf.set_included_directory(loaded_common_items.included_directories);
vf.set_excluded_directory(loaded_common_items.excluded_directories);
vf.set_recursive_search(loaded_common_items.recursive_search);
vf.set_excluded_items(loaded_common_items.excluded_items);
vf.set_allowed_extensions(loaded_common_items.allowed_extensions);
vf.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);
vf.find_empty_files(Some(&stop_receiver), Some(&futures_sender_empty_files));
glib_stop_sender.send(Message::EmptyFiles(vf)).unwrap();
});
}
NotebookMainEnum::EmptyDirectories => {
grid_progress_stages.hide();
get_list_store(&tree_view_empty_folder_finder).clear();
let futures_sender_empty_folder = futures_sender_empty_folder.clone();
// Find empty folders
thread::spawn(move || {
let mut ef = EmptyFolder::new();
ef.set_included_directory(loaded_common_items.included_directories);
ef.set_excluded_directory(loaded_common_items.excluded_directories);
ef.set_excluded_items(loaded_common_items.excluded_items);
ef.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);
ef.find_empty_folders(Some(&stop_receiver), Some(&futures_sender_empty_folder));
glib_stop_sender.send(Message::EmptyFolders(ef)).unwrap();
});
}
NotebookMainEnum::BigFiles => {
grid_progress_stages.hide();
get_list_store(&tree_view_big_files_finder).clear();
let big_files_mode_index = combo_box_big_files_mode.active().unwrap() as usize;
let big_files_mode = BIG_FILES_CHECK_METHOD_COMBO_BOX[big_files_mode_index].check_method;
let numbers_of_files_to_check = entry_big_files_number.text().as_str().parse::<usize>().unwrap_or(50);
let futures_sender_big_file = futures_sender_big_file.clone();
// Find big files
thread::spawn(move || {
let mut bf = BigFile::new();
bf.set_included_directory(loaded_common_items.included_directories);
bf.set_excluded_directory(loaded_common_items.excluded_directories);
bf.set_recursive_search(loaded_common_items.recursive_search);
bf.set_excluded_items(loaded_common_items.excluded_items);
bf.set_allowed_extensions(loaded_common_items.allowed_extensions);
bf.set_number_of_files_to_check(numbers_of_files_to_check);
bf.set_search_mode(big_files_mode);
bf.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);
bf.find_big_files(Some(&stop_receiver), Some(&futures_sender_big_file));
glib_stop_sender.send(Message::BigFiles(bf)).unwrap();
});
}
NotebookMainEnum::Temporary => {
grid_progress_stages.hide();
get_list_store(&tree_view_temporary_files_finder).clear();
let futures_sender_temporary = futures_sender_temporary.clone();
// Find temporary files
thread::spawn(move || {
let mut tf = Temporary::new();
tf.set_included_directory(loaded_common_items.included_directories);
tf.set_excluded_directory(loaded_common_items.excluded_directories);
tf.set_recursive_search(loaded_common_items.recursive_search);
tf.set_excluded_items(loaded_common_items.excluded_items);
tf.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);
tf.find_temporary_files(Some(&stop_receiver), Some(&futures_sender_temporary));
glib_stop_sender.send(Message::Temporary(tf)).unwrap();
});
}
NotebookMainEnum::SimilarImages => {
image_preview_similar_images.hide();
grid_progress_stages.show();
get_list_store(&tree_view_similar_images_finder).clear();
let hash_size_index = combo_box_image_hash_size.active().unwrap() as usize;
let hash_size = IMAGES_HASH_SIZE_COMBO_BOX[hash_size_index] as u8;
let image_filter_index = combo_box_image_resize_algorithm.active().unwrap() as usize;
let image_filter = IMAGES_RESIZE_ALGORITHM_COMBO_BOX[image_filter_index].filter;
let hash_alg_index = combo_box_image_hash_algorithm.active().unwrap() as usize;
let hash_alg = IMAGES_HASH_TYPE_COMBO_BOX[hash_alg_index].hash_alg;
let ignore_same_size = check_button_image_ignore_same_size.is_active();
let similarity = scale_similarity_similar_images.value() as u32;
let delete_outdated_cache = check_button_settings_similar_images_delete_outdated_cache.is_active();
let futures_sender_similar_images = futures_sender_similar_images.clone();
// Find similar images
thread::spawn(move || {
let mut sf = SimilarImages::new();
sf.set_included_directory(loaded_common_items.included_directories);
sf.set_excluded_directory(loaded_common_items.excluded_directories);
sf.set_reference_directory(loaded_common_items.reference_directories);
sf.set_recursive_search(loaded_common_items.recursive_search);
sf.set_excluded_items(loaded_common_items.excluded_items);
sf.set_minimal_file_size(loaded_common_items.minimal_file_size);
sf.set_maximal_file_size(loaded_common_items.maximal_file_size);
sf.set_similarity(similarity);
sf.set_use_cache(loaded_common_items.use_cache);
sf.set_hash_alg(hash_alg);
sf.set_hash_size(hash_size);
sf.set_image_filter(image_filter);
sf.set_allowed_extensions(loaded_common_items.allowed_extensions);
sf.set_delete_outdated_cache(delete_outdated_cache);
sf.set_exclude_images_with_same_size(ignore_same_size);
sf.set_save_also_as_json(loaded_common_items.save_also_as_json);
sf.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);
sf.find_similar_images(Some(&stop_receiver), Some(&futures_sender_similar_images));
glib_stop_sender.send(Message::SimilarImages(sf)).unwrap();
});
}
NotebookMainEnum::SimilarVideos => {
grid_progress_stages.show();
get_list_store(&tree_view_similar_videos_finder).clear();
let tolerance = scale_similarity_similar_videos.value() as i32;
let delete_outdated_cache = check_button_settings_similar_videos_delete_outdated_cache.is_active();
let ignore_same_size = check_button_video_ignore_same_size.is_active();
let futures_sender_similar_videos = futures_sender_similar_videos.clone();
// Find similar videos
thread::spawn(move || {
let mut sf = SimilarVideos::new();
sf.set_included_directory(loaded_common_items.included_directories);
sf.set_excluded_directory(loaded_common_items.excluded_directories);
sf.set_reference_directory(loaded_common_items.reference_directories);
sf.set_recursive_search(loaded_common_items.recursive_search);
sf.set_excluded_items(loaded_common_items.excluded_items);
sf.set_minimal_file_size(loaded_common_items.minimal_file_size);
sf.set_maximal_file_size(loaded_common_items.maximal_file_size);
sf.set_allowed_extensions(loaded_common_items.allowed_extensions);
sf.set_use_cache(loaded_common_items.use_cache);
sf.set_tolerance(tolerance);
sf.set_delete_outdated_cache(delete_outdated_cache);
sf.set_exclude_videos_with_same_size(ignore_same_size);
sf.set_save_also_as_json(loaded_common_items.save_also_as_json);
sf.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);
sf.find_similar_videos(Some(&stop_receiver), Some(&futures_sender_similar_videos));
glib_stop_sender.send(Message::SimilarVideos(sf)).unwrap();
});
}
NotebookMainEnum::SameMusic => {
grid_progress_stages.show();
get_list_store(&tree_view_same_music_finder).clear();
let approximate_comparison = check_button_music_approximate_comparison.is_active();
let mut music_similarity: MusicSimilarity = MusicSimilarity::NONE;
if check_button_music_title.is_active() {
music_similarity |= MusicSimilarity::TRACK_TITLE;
}
if check_button_music_artist.is_active() {
music_similarity |= MusicSimilarity::TRACK_ARTIST;
}
if check_button_music_year.is_active() {
music_similarity |= MusicSimilarity::YEAR;
}
if check_button_music_bitrate.is_active() {
music_similarity |= MusicSimilarity::BITRATE;
}
if check_button_music_genre.is_active() {
music_similarity |= MusicSimilarity::GENRE;
}
if check_button_music_length.is_active() {
music_similarity |= MusicSimilarity::LENGTH;
}
if music_similarity != MusicSimilarity::NONE {
let futures_sender_same_music = futures_sender_same_music.clone();
// Find Similar music
thread::spawn(move || {
let mut mf = SameMusic::new();
mf.set_included_directory(loaded_common_items.included_directories);
mf.set_excluded_directory(loaded_common_items.excluded_directories);
mf.set_reference_directory(loaded_common_items.reference_directories);
mf.set_excluded_items(loaded_common_items.excluded_items);
mf.set_use_cache(loaded_common_items.use_cache);
mf.set_minimal_file_size(loaded_common_items.minimal_file_size);
mf.set_maximal_file_size(loaded_common_items.maximal_file_size);
mf.set_allowed_extensions(loaded_common_items.allowed_extensions);
mf.set_recursive_search(loaded_common_items.recursive_search);
mf.set_music_similarity(music_similarity);
mf.set_approximate_comparison(approximate_comparison);
mf.set_save_also_as_json(loaded_common_items.save_also_as_json);
mf.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);
mf.find_same_music(Some(&stop_receiver), Some(&futures_sender_same_music));
glib_stop_sender.send(Message::SameMusic(mf)).unwrap();
});
} else {
set_buttons(
&mut *shared_buttons.borrow_mut().get_mut(&NotebookMainEnum::SameMusic).unwrap(),
&buttons_array,
&buttons_names,
);
entry_info.set_text(&flg!("search_not_choosing_any_music"));
show_dialog.store(false, Ordering::Relaxed);
notebook_main.set_sensitive(true);
notebook_upper.set_sensitive(true);
button_settings.set_sensitive(true);
button_app_info.set_sensitive(true);
}
}
NotebookMainEnum::Symlinks => {
grid_progress_stages.hide();
get_list_store(&tree_view_invalid_symlinks).clear();
let futures_sender_invalid_symlinks = futures_sender_invalid_symlinks.clone();
thread::spawn(move || {
let mut isf = InvalidSymlinks::new();
isf.set_included_directory(loaded_common_items.included_directories);
isf.set_excluded_directory(loaded_common_items.excluded_directories);
isf.set_recursive_search(loaded_common_items.recursive_search);
isf.set_excluded_items(loaded_common_items.excluded_items);
isf.set_allowed_extensions(loaded_common_items.allowed_extensions);
isf.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);
isf.find_invalid_links(Some(&stop_receiver), Some(&futures_sender_invalid_symlinks));
glib_stop_sender.send(Message::InvalidSymlinks(isf)).unwrap();
});
}
NotebookMainEnum::BrokenFiles => {
grid_progress_stages.show();
get_list_store(&tree_view_broken_files).clear();
let futures_sender_broken_files = futures_sender_broken_files.clone();
let mut checked_types: CheckedTypes = CheckedTypes::NONE;
if check_button_broken_files_audio.is_active() {
checked_types |= CheckedTypes::AUDIO;
}
if check_button_broken_files_pdf.is_active() {
checked_types |= CheckedTypes::PDF;
}
if check_button_broken_files_image.is_active() {
checked_types |= CheckedTypes::IMAGE;
}
if check_button_broken_files_archive.is_active() {
checked_types |= CheckedTypes::ARCHIVE;
}
if checked_types != CheckedTypes::NONE {
thread::spawn(move || {
let mut br = BrokenFiles::new();
br.set_included_directory(loaded_common_items.included_directories);
br.set_excluded_directory(loaded_common_items.excluded_directories);
br.set_recursive_search(loaded_common_items.recursive_search);
br.set_excluded_items(loaded_common_items.excluded_items);
br.set_use_cache(loaded_common_items.use_cache);
br.set_allowed_extensions(loaded_common_items.allowed_extensions);
br.set_save_also_as_json(loaded_common_items.save_also_as_json);
br.set_checked_types(checked_types);
br.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);
br.find_broken_files(Some(&stop_receiver), Some(&futures_sender_broken_files));
glib_stop_sender.send(Message::BrokenFiles(br)).unwrap();
});
} else {
set_buttons(
&mut *shared_buttons.borrow_mut().get_mut(&NotebookMainEnum::BrokenFiles).unwrap(),
&buttons_array,
&buttons_names,
);
entry_info.set_text(&flg!("search_not_choosing_any_broken_files"));
show_dialog.store(false, Ordering::Relaxed);
notebook_main.set_sensitive(true);
notebook_upper.set_sensitive(true);
button_settings.set_sensitive(true);
button_app_info.set_sensitive(true);
}
}
NotebookMainEnum::BadExtensions => {
grid_progress_stages.show();
get_list_store(&tree_view_bad_extensions).clear();
let futures_sender_bad_extensions = futures_sender_bad_extensions.clone();
// Find Similar music
thread::spawn(move || {
let mut be = BadExtensions::new();
be.set_included_directory(loaded_common_items.included_directories);
be.set_excluded_directory(loaded_common_items.excluded_directories);
be.set_excluded_items(loaded_common_items.excluded_items);
be.set_minimal_file_size(loaded_common_items.minimal_file_size);
be.set_maximal_file_size(loaded_common_items.maximal_file_size);
be.set_allowed_extensions(loaded_common_items.allowed_extensions);
be.set_recursive_search(loaded_common_items.recursive_search);
be.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);
be.find_bad_extensions_files(Some(&stop_receiver), Some(&futures_sender_bad_extensions));
glib_stop_sender.send(Message::BadExtensions(be)).unwrap();
});
}
}
window_progress.set_default_size(1, 1);
// Show progress dialog
if show_dialog.load(Ordering::Relaxed) {
window_progress.show();
taskbar_state.borrow().show();
taskbar_state.borrow().set_progress_state(TBPF_NOPROGRESS);
}
});
}
struct LoadedCommonItems {
included_directories: Vec<PathBuf>,
excluded_directories: Vec<PathBuf>,
reference_directories: Vec<PathBuf>,
recursive_search: bool,
excluded_items: Vec<String>,
allowed_extensions: String,
hide_hard_links: bool,
use_cache: bool,
save_also_as_json: bool,
minimal_cache_file_size: u64,
minimal_file_size: u64,
maximal_file_size: u64,
ignore_other_filesystems: bool,
}
impl LoadedCommonItems {
fn load_items(gui_data: &GuiData) -> Self {
let check_button_settings_one_filesystem = gui_data.settings.check_button_settings_one_filesystem.clone();
let check_button_recursive = gui_data.upper_notebook.check_button_recursive.clone();
let check_button_settings_hide_hard_links = gui_data.settings.check_button_settings_hide_hard_links.clone();
let check_button_settings_use_cache = gui_data.settings.check_button_settings_use_cache.clone();
let entry_allowed_extensions = gui_data.upper_notebook.entry_allowed_extensions.clone();
let entry_excluded_items = gui_data.upper_notebook.entry_excluded_items.clone();
let entry_general_maximal_size = gui_data.upper_notebook.entry_general_maximal_size.clone();
let entry_general_minimal_size = gui_data.upper_notebook.entry_general_minimal_size.clone();
let entry_settings_cache_file_minimal_size = gui_data.settings.entry_settings_cache_file_minimal_size.clone();
let tree_view_excluded_directories = gui_data.upper_notebook.tree_view_excluded_directories.clone();
let tree_view_included_directories = gui_data.upper_notebook.tree_view_included_directories.clone();
let check_button_settings_save_also_json = gui_data.settings.check_button_settings_save_also_json.clone();
let included_directories = get_path_buf_from_vector_of_strings(&get_string_from_list_store(&tree_view_included_directories, ColumnsIncludedDirectory::Path as i32, None));
let excluded_directories = get_path_buf_from_vector_of_strings(&get_string_from_list_store(&tree_view_excluded_directories, ColumnsExcludedDirectory::Path as i32, None));
let reference_directories = get_path_buf_from_vector_of_strings(&get_string_from_list_store(
@ -159,433 +568,82 @@ pub fn connect_button_search(
.as_str()
.parse::<u64>()
.unwrap_or_else(|_| DEFAULT_MAXIMAL_FILE_SIZE.parse::<u64>().unwrap());
let show_dialog = Arc::new(AtomicBool::new(true));
let ignore_other_filesystems = check_button_settings_one_filesystem.is_active();
window_progress.set_title(Some(&flg!("window_progress_title")));
hide_all_buttons(&buttons_array);
notebook_main.set_sensitive(false);
notebook_upper.set_sensitive(false);
button_settings.set_sensitive(false);
button_app_info.set_sensitive(false);
entry_info.set_text(&flg!("searching_for_data"));
// Resets progress bars
progress_bar_all_stages.set_fraction(0 as f64);
progress_bar_current_stage.set_fraction(0 as f64);
reset_text_view(&text_view_errors);
let glib_stop_sender = glib_stop_sender.clone();
let stop_receiver = stop_receiver.clone();
// Consume any stale stop messages.
stop_receiver.try_iter().for_each(|_| ());
match to_notebook_main_enum(notebook_main.current_page().unwrap()) {
NotebookMainEnum::Duplicate => {
image_preview_duplicates.hide();
label_stage.show();
grid_progress_stages.show();
window_progress.set_default_size(1, 1);
get_list_store(&tree_view_duplicate_finder).clear();
let check_method_index = combo_box_duplicate_check_method.active().unwrap() as usize;
let check_method = DUPLICATES_CHECK_METHOD_COMBO_BOX[check_method_index].check_method;
let hash_type_index = combo_box_duplicate_hash_type.active().unwrap() as usize;
let hash_type = DUPLICATES_HASH_TYPE_COMBO_BOX[hash_type_index].hash_type;
let use_prehash_cache = check_button_duplicates_use_prehash_cache.is_active();
let minimal_prehash_cache_file_size = entry_settings_prehash_cache_file_minimal_size.text().as_str().parse::<u64>().unwrap_or(0);
let case_sensitive_name_comparison = check_button_duplicate_case_sensitive_name.is_active();
let delete_outdated_cache = check_button_settings_duplicates_delete_outdated_cache.is_active();
let futures_sender_duplicate_files = futures_sender_duplicate_files.clone();
// Find duplicates
thread::spawn(move || {
let mut df = DuplicateFinder::new();
df.set_included_directory(included_directories);
df.set_excluded_directory(excluded_directories);
df.set_reference_directory(reference_directories);
df.set_recursive_search(recursive_search);
df.set_excluded_items(excluded_items);
df.set_allowed_extensions(allowed_extensions);
df.set_minimal_file_size(minimal_file_size);
df.set_maximal_file_size(maximal_file_size);
df.set_minimal_cache_file_size(minimal_cache_file_size);
df.set_minimal_prehash_cache_file_size(minimal_prehash_cache_file_size);
df.set_check_method(check_method);
df.set_hash_type(hash_type);
df.set_ignore_hard_links(hide_hard_links);
df.set_use_cache(use_cache);
df.set_use_prehash_cache(use_prehash_cache);
df.set_delete_outdated_cache(delete_outdated_cache);
df.set_case_sensitive_name_comparison(case_sensitive_name_comparison);
df.set_exclude_other_filesystems(ignore_other_filesystems);
df.find_duplicates(Some(&stop_receiver), Some(&futures_sender_duplicate_files));
glib_stop_sender.send(Message::Duplicates(df)).unwrap();
});
}
NotebookMainEnum::EmptyFiles => {
label_stage.show();
grid_progress_stages.hide();
window_progress.set_default_size(1, 1);
get_list_store(&tree_view_empty_files_finder).clear();
let futures_sender_empty_files = futures_sender_empty_files.clone();
// Find empty files
thread::spawn(move || {
let mut vf = EmptyFiles::new();
vf.set_included_directory(included_directories);
vf.set_excluded_directory(excluded_directories);
vf.set_recursive_search(recursive_search);
vf.set_excluded_items(excluded_items);
vf.set_allowed_extensions(allowed_extensions);
vf.set_exclude_other_filesystems(ignore_other_filesystems);
vf.find_empty_files(Some(&stop_receiver), Some(&futures_sender_empty_files));
glib_stop_sender.send(Message::EmptyFiles(vf)).unwrap();
});
}
NotebookMainEnum::EmptyDirectories => {
label_stage.show();
grid_progress_stages.hide();
window_progress.set_default_size(1, 1);
get_list_store(&tree_view_empty_folder_finder).clear();
let futures_sender_empty_folder = futures_sender_empty_folder.clone();
// Find empty folders
thread::spawn(move || {
let mut ef = EmptyFolder::new();
ef.set_included_directory(included_directories);
ef.set_excluded_directory(excluded_directories);
ef.set_excluded_items(excluded_items);
ef.set_exclude_other_filesystems(ignore_other_filesystems);
ef.find_empty_folders(Some(&stop_receiver), Some(&futures_sender_empty_folder));
glib_stop_sender.send(Message::EmptyFolders(ef)).unwrap();
});
}
NotebookMainEnum::BigFiles => {
label_stage.show();
grid_progress_stages.hide();
window_progress.set_default_size(1, 1);
get_list_store(&tree_view_big_files_finder).clear();
let big_files_mode_index = combo_box_big_files_mode.active().unwrap() as usize;
let big_files_mode = BIG_FILES_CHECK_METHOD_COMBO_BOX[big_files_mode_index].check_method;
let numbers_of_files_to_check = entry_big_files_number.text().as_str().parse::<usize>().unwrap_or(50);
let futures_sender_big_file = futures_sender_big_file.clone();
// Find big files
thread::spawn(move || {
let mut bf = BigFile::new();
bf.set_included_directory(included_directories);
bf.set_excluded_directory(excluded_directories);
bf.set_recursive_search(recursive_search);
bf.set_excluded_items(excluded_items);
bf.set_allowed_extensions(allowed_extensions);
bf.set_number_of_files_to_check(numbers_of_files_to_check);
bf.set_search_mode(big_files_mode);
bf.set_exclude_other_filesystems(ignore_other_filesystems);
bf.find_big_files(Some(&stop_receiver), Some(&futures_sender_big_file));
glib_stop_sender.send(Message::BigFiles(bf)).unwrap();
});
}
NotebookMainEnum::Temporary => {
label_stage.show();
grid_progress_stages.hide();
window_progress.set_default_size(1, 1);
get_list_store(&tree_view_temporary_files_finder).clear();
let futures_sender_temporary = futures_sender_temporary.clone();
// Find temporary files
thread::spawn(move || {
let mut tf = Temporary::new();
tf.set_included_directory(included_directories);
tf.set_excluded_directory(excluded_directories);
tf.set_recursive_search(recursive_search);
tf.set_excluded_items(excluded_items);
tf.set_exclude_other_filesystems(ignore_other_filesystems);
tf.find_temporary_files(Some(&stop_receiver), Some(&futures_sender_temporary));
glib_stop_sender.send(Message::Temporary(tf)).unwrap();
});
}
NotebookMainEnum::SimilarImages => {
image_preview_similar_images.hide();
label_stage.show();
grid_progress_stages.show();
window_progress.set_default_size(1, 1);
get_list_store(&tree_view_similar_images_finder).clear();
let hash_size_index = combo_box_image_hash_size.active().unwrap() as usize;
let hash_size = IMAGES_HASH_SIZE_COMBO_BOX[hash_size_index] as u8;
let image_filter_index = combo_box_image_resize_algorithm.active().unwrap() as usize;
let image_filter = IMAGES_RESIZE_ALGORITHM_COMBO_BOX[image_filter_index].filter;
let hash_alg_index = combo_box_image_hash_algorithm.active().unwrap() as usize;
let hash_alg = IMAGES_HASH_TYPE_COMBO_BOX[hash_alg_index].hash_alg;
let ignore_same_size = check_button_image_ignore_same_size.is_active();
let similarity = scale_similarity_similar_images.value() as u32;
let delete_outdated_cache = check_button_settings_similar_images_delete_outdated_cache.is_active();
let futures_sender_similar_images = futures_sender_similar_images.clone();
// Find similar images
thread::spawn(move || {
let mut sf = SimilarImages::new();
sf.set_included_directory(included_directories);
sf.set_excluded_directory(excluded_directories);
sf.set_reference_directory(reference_directories);
sf.set_recursive_search(recursive_search);
sf.set_excluded_items(excluded_items);
sf.set_minimal_file_size(minimal_file_size);
sf.set_maximal_file_size(maximal_file_size);
sf.set_similarity(similarity);
sf.set_use_cache(use_cache);
sf.set_hash_alg(hash_alg);
sf.set_hash_size(hash_size);
sf.set_image_filter(image_filter);
sf.set_allowed_extensions(allowed_extensions);
sf.set_delete_outdated_cache(delete_outdated_cache);
sf.set_exclude_images_with_same_size(ignore_same_size);
sf.set_save_also_as_json(save_also_as_json);
sf.set_exclude_other_filesystems(ignore_other_filesystems);
sf.find_similar_images(Some(&stop_receiver), Some(&futures_sender_similar_images));
glib_stop_sender.send(Message::SimilarImages(sf)).unwrap();
});
}
NotebookMainEnum::SimilarVideos => {
label_stage.show();
grid_progress_stages.show();
window_progress.set_default_size(1, 1);
get_list_store(&tree_view_similar_videos_finder).clear();
let tolerance = scale_similarity_similar_videos.value() as i32;
let delete_outdated_cache = check_button_settings_similar_videos_delete_outdated_cache.is_active();
let ignore_same_size = check_button_video_ignore_same_size.is_active();
let futures_sender_similar_videos = futures_sender_similar_videos.clone();
// Find similar videos
thread::spawn(move || {
let mut sf = SimilarVideos::new();
sf.set_included_directory(included_directories);
sf.set_excluded_directory(excluded_directories);
sf.set_reference_directory(reference_directories);
sf.set_recursive_search(recursive_search);
sf.set_excluded_items(excluded_items);
sf.set_minimal_file_size(minimal_file_size);
sf.set_maximal_file_size(maximal_file_size);
sf.set_allowed_extensions(allowed_extensions);
sf.set_use_cache(use_cache);
sf.set_tolerance(tolerance);
sf.set_delete_outdated_cache(delete_outdated_cache);
sf.set_exclude_videos_with_same_size(ignore_same_size);
sf.set_save_also_as_json(save_also_as_json);
sf.set_exclude_other_filesystems(ignore_other_filesystems);
sf.find_similar_videos(Some(&stop_receiver), Some(&futures_sender_similar_videos));
glib_stop_sender.send(Message::SimilarVideos(sf)).unwrap();
});
}
NotebookMainEnum::SameMusic => {
label_stage.show();
grid_progress_stages.show();
window_progress.set_default_size(1, 1);
get_list_store(&tree_view_same_music_finder).clear();
let approximate_comparison = check_button_music_approximate_comparison.is_active();
let mut music_similarity: MusicSimilarity = MusicSimilarity::NONE;
if check_button_music_title.is_active() {
music_similarity |= MusicSimilarity::TRACK_TITLE;
}
if check_button_music_artist.is_active() {
music_similarity |= MusicSimilarity::TRACK_ARTIST;
}
if check_button_music_year.is_active() {
music_similarity |= MusicSimilarity::YEAR;
}
if check_button_music_bitrate.is_active() {
music_similarity |= MusicSimilarity::BITRATE;
}
if check_button_music_genre.is_active() {
music_similarity |= MusicSimilarity::GENRE;
}
if check_button_music_length.is_active() {
music_similarity |= MusicSimilarity::LENGTH;
}
if music_similarity != MusicSimilarity::NONE {
let futures_sender_same_music = futures_sender_same_music.clone();
// Find Similar music
thread::spawn(move || {
let mut mf = SameMusic::new();
mf.set_included_directory(included_directories);
mf.set_excluded_directory(excluded_directories);
mf.set_reference_directory(reference_directories);
mf.set_excluded_items(excluded_items);
mf.set_use_cache(use_cache);
mf.set_minimal_file_size(minimal_file_size);
mf.set_maximal_file_size(maximal_file_size);
mf.set_allowed_extensions(allowed_extensions);
mf.set_recursive_search(recursive_search);
mf.set_music_similarity(music_similarity);
mf.set_approximate_comparison(approximate_comparison);
mf.set_save_also_as_json(save_also_as_json);
mf.set_exclude_other_filesystems(ignore_other_filesystems);
mf.find_same_music(Some(&stop_receiver), Some(&futures_sender_same_music));
glib_stop_sender.send(Message::SameMusic(mf)).unwrap();
});
} else {
set_buttons(
&mut *shared_buttons.borrow_mut().get_mut(&NotebookMainEnum::SameMusic).unwrap(),
&buttons_array,
&buttons_names,
);
entry_info.set_text(&flg!("search_not_choosing_any_music"));
show_dialog.store(false, Ordering::Relaxed);
notebook_main.set_sensitive(true);
notebook_upper.set_sensitive(true);
button_settings.set_sensitive(true);
button_app_info.set_sensitive(true);
}
}
NotebookMainEnum::Symlinks => {
label_stage.show();
grid_progress_stages.hide();
window_progress.set_default_size(1, 1);
get_list_store(&tree_view_invalid_symlinks).clear();
let futures_sender_invalid_symlinks = futures_sender_invalid_symlinks.clone();
thread::spawn(move || {
let mut isf = InvalidSymlinks::new();
isf.set_included_directory(included_directories);
isf.set_excluded_directory(excluded_directories);
isf.set_recursive_search(recursive_search);
isf.set_excluded_items(excluded_items);
isf.set_allowed_extensions(allowed_extensions);
isf.set_exclude_other_filesystems(ignore_other_filesystems);
isf.find_invalid_links(Some(&stop_receiver), Some(&futures_sender_invalid_symlinks));
glib_stop_sender.send(Message::InvalidSymlinks(isf)).unwrap();
});
}
NotebookMainEnum::BrokenFiles => {
label_stage.show();
grid_progress_stages.show();
window_progress.set_default_size(1, 1);
get_list_store(&tree_view_broken_files).clear();
let futures_sender_broken_files = futures_sender_broken_files.clone();
let mut checked_types: CheckedTypes = CheckedTypes::NONE;
if check_button_broken_files_audio.is_active() {
checked_types |= CheckedTypes::AUDIO;
}
if check_button_broken_files_pdf.is_active() {
checked_types |= CheckedTypes::PDF;
}
if check_button_broken_files_image.is_active() {
checked_types |= CheckedTypes::IMAGE;
}
if check_button_broken_files_archive.is_active() {
checked_types |= CheckedTypes::ARCHIVE;
}
if checked_types != CheckedTypes::NONE {
thread::spawn(move || {
let mut br = BrokenFiles::new();
br.set_included_directory(included_directories);
br.set_excluded_directory(excluded_directories);
br.set_recursive_search(recursive_search);
br.set_excluded_items(excluded_items);
br.set_use_cache(use_cache);
br.set_allowed_extensions(allowed_extensions);
br.set_save_also_as_json(save_also_as_json);
br.set_checked_types(checked_types);
br.set_exclude_other_filesystems(ignore_other_filesystems);
br.find_broken_files(Some(&stop_receiver), Some(&futures_sender_broken_files));
glib_stop_sender.send(Message::BrokenFiles(br)).unwrap();
});
} else {
set_buttons(
&mut *shared_buttons.borrow_mut().get_mut(&NotebookMainEnum::BrokenFiles).unwrap(),
&buttons_array,
&buttons_names,
);
entry_info.set_text(&flg!("search_not_choosing_any_broken_files"));
show_dialog.store(false, Ordering::Relaxed);
notebook_main.set_sensitive(true);
notebook_upper.set_sensitive(true);
button_settings.set_sensitive(true);
button_app_info.set_sensitive(true);
}
}
NotebookMainEnum::BadExtensions => {
label_stage.show();
grid_progress_stages.show();
window_progress.set_default_size(1, 1);
get_list_store(&tree_view_bad_extensions).clear();
let futures_sender_bad_extensions = futures_sender_bad_extensions.clone();
// Find Similar music
thread::spawn(move || {
let mut be = BadExtensions::new();
be.set_included_directory(included_directories);
be.set_excluded_directory(excluded_directories);
be.set_excluded_items(excluded_items);
be.set_minimal_file_size(minimal_file_size);
be.set_maximal_file_size(maximal_file_size);
be.set_allowed_extensions(allowed_extensions);
be.set_recursive_search(recursive_search);
be.set_exclude_other_filesystems(ignore_other_filesystems);
be.find_bad_extensions_files(Some(&stop_receiver), Some(&futures_sender_bad_extensions));
glib_stop_sender.send(Message::BadExtensions(be)).unwrap();
});
}
LoadedCommonItems {
included_directories,
excluded_directories,
reference_directories,
recursive_search,
excluded_items,
allowed_extensions,
hide_hard_links,
use_cache,
save_also_as_json,
minimal_cache_file_size,
minimal_file_size,
maximal_file_size,
ignore_other_filesystems,
}
}
}
fn duplicate_search(
gui_data: &GuiData,
loaded_common_items: LoadedCommonItems,
stop_receiver: Receiver<()>,
glib_stop_sender: Sender<Message>,
grid_progress_stages: &Grid,
progress_data_sender: UnboundedSender<ProgressData>,
) {
grid_progress_stages.show();
// Show progress dialog
if show_dialog.load(Ordering::Relaxed) {
window_progress.show();
taskbar_state.borrow().show();
taskbar_state.borrow().set_progress_state(TBPF_NOPROGRESS);
}
let combo_box_duplicate_check_method = gui_data.main_notebook.combo_box_duplicate_check_method.clone();
let combo_box_duplicate_hash_type = gui_data.main_notebook.combo_box_duplicate_hash_type.clone();
let check_button_duplicates_use_prehash_cache = gui_data.settings.check_button_duplicates_use_prehash_cache.clone();
let check_button_duplicate_case_sensitive_name: gtk4::CheckButton = gui_data.main_notebook.check_button_duplicate_case_sensitive_name.clone();
let check_button_settings_duplicates_delete_outdated_cache = gui_data.settings.check_button_settings_duplicates_delete_outdated_cache.clone();
let entry_settings_prehash_cache_file_minimal_size = gui_data.settings.entry_settings_prehash_cache_file_minimal_size.clone();
let image_preview_duplicates = gui_data.main_notebook.image_preview_duplicates.clone();
let tree_view_duplicate_finder = gui_data.main_notebook.tree_view_duplicate_finder.clone();
image_preview_duplicates.hide();
get_list_store(&tree_view_duplicate_finder).clear();
let check_method_index = combo_box_duplicate_check_method.active().unwrap() as usize;
let check_method = DUPLICATES_CHECK_METHOD_COMBO_BOX[check_method_index].check_method;
let hash_type_index = combo_box_duplicate_hash_type.active().unwrap() as usize;
let hash_type = DUPLICATES_HASH_TYPE_COMBO_BOX[hash_type_index].hash_type;
let use_prehash_cache = check_button_duplicates_use_prehash_cache.is_active();
let minimal_prehash_cache_file_size = entry_settings_prehash_cache_file_minimal_size.text().as_str().parse::<u64>().unwrap_or(0);
let case_sensitive_name_comparison = check_button_duplicate_case_sensitive_name.is_active();
let delete_outdated_cache = check_button_settings_duplicates_delete_outdated_cache.is_active();
// Find duplicates
thread::spawn(move || {
let mut df = DuplicateFinder::new();
df.set_included_directory(loaded_common_items.included_directories);
df.set_excluded_directory(loaded_common_items.excluded_directories);
df.set_reference_directory(loaded_common_items.reference_directories);
df.set_recursive_search(loaded_common_items.recursive_search);
df.set_excluded_items(loaded_common_items.excluded_items);
df.set_allowed_extensions(loaded_common_items.allowed_extensions);
df.set_minimal_file_size(loaded_common_items.minimal_file_size);
df.set_maximal_file_size(loaded_common_items.maximal_file_size);
df.set_minimal_cache_file_size(loaded_common_items.minimal_cache_file_size);
df.set_minimal_prehash_cache_file_size(minimal_prehash_cache_file_size);
df.set_check_method(check_method);
df.set_hash_type(hash_type);
df.set_ignore_hard_links(loaded_common_items.hide_hard_links);
df.set_use_cache(loaded_common_items.use_cache);
df.set_use_prehash_cache(use_prehash_cache);
df.set_delete_outdated_cache(delete_outdated_cache);
df.set_case_sensitive_name_comparison(case_sensitive_name_comparison);
df.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);
df.find_duplicates(Some(&stop_receiver), Some(&progress_data_sender));
glib_stop_sender.send(Message::Duplicates(df)).unwrap();
});
}