|
|
|
@ -5,7 +5,6 @@ use std::thread;
|
|
|
|
|
|
|
|
|
|
use crossbeam_channel::{Receiver, Sender};
|
|
|
|
|
use fun_time::fun_time;
|
|
|
|
|
use glib::Sender as glibSender;
|
|
|
|
|
use gtk4::prelude::*;
|
|
|
|
|
use gtk4::Grid;
|
|
|
|
|
|
|
|
|
@ -35,10 +34,10 @@ 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: glibSender<Message>, progress_sender: Sender<ProgressData>) {
|
|
|
|
|
pub fn connect_button_search(gui_data: &GuiData, result_sender: Sender<Message>, progress_sender: Sender<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();
|
|
|
|
|
let grid_progress = gui_data.progress_window.grid_progress.clone();
|
|
|
|
|
let label_stage = gui_data.progress_window.label_stage.clone();
|
|
|
|
|
let notebook_main = gui_data.main_notebook.notebook_main.clone();
|
|
|
|
|
let notebook_upper = gui_data.upper_notebook.notebook_upper.clone();
|
|
|
|
@ -55,7 +54,7 @@ pub fn connect_button_search(gui_data: &GuiData, glib_stop_sender: glibSender<Me
|
|
|
|
|
|
|
|
|
|
let gui_data = gui_data.clone();
|
|
|
|
|
buttons_search_clone.connect_clicked(move |_| {
|
|
|
|
|
let loaded_common_items = LoadedCommonItems::load_items(&gui_data);
|
|
|
|
|
let loaded_commons = LoadedCommonItems::load_items(&gui_data);
|
|
|
|
|
|
|
|
|
|
// Check if user selected all referenced folders
|
|
|
|
|
let list_store_included_directories = get_list_store(&tree_view_included_directories);
|
|
|
|
@ -83,104 +82,27 @@ pub fn connect_button_search(gui_data: &GuiData, glib_stop_sender: glibSender<Me
|
|
|
|
|
|
|
|
|
|
reset_text_view(&text_view_errors);
|
|
|
|
|
|
|
|
|
|
let glib_stop_sender = glib_stop_sender.clone();
|
|
|
|
|
let result_sender = result_sender.clone();
|
|
|
|
|
let stop_receiver = stop_receiver.clone();
|
|
|
|
|
// Consume any stale stop messages.
|
|
|
|
|
stop_receiver.try_iter().for_each(|()| ());
|
|
|
|
|
|
|
|
|
|
label_stage.show();
|
|
|
|
|
|
|
|
|
|
let progress_sender = progress_sender.clone();
|
|
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
progress_sender.clone(),
|
|
|
|
|
),
|
|
|
|
|
NotebookMainEnum::EmptyFiles => empty_files_search(
|
|
|
|
|
&gui_data,
|
|
|
|
|
loaded_common_items,
|
|
|
|
|
stop_receiver,
|
|
|
|
|
glib_stop_sender,
|
|
|
|
|
&grid_progress_stages,
|
|
|
|
|
progress_sender.clone(),
|
|
|
|
|
),
|
|
|
|
|
NotebookMainEnum::EmptyDirectories => empty_directories_search(
|
|
|
|
|
&gui_data,
|
|
|
|
|
loaded_common_items,
|
|
|
|
|
stop_receiver,
|
|
|
|
|
glib_stop_sender,
|
|
|
|
|
&grid_progress_stages,
|
|
|
|
|
progress_sender.clone(),
|
|
|
|
|
),
|
|
|
|
|
NotebookMainEnum::BigFiles => big_files_search(
|
|
|
|
|
&gui_data,
|
|
|
|
|
loaded_common_items,
|
|
|
|
|
stop_receiver,
|
|
|
|
|
glib_stop_sender,
|
|
|
|
|
&grid_progress_stages,
|
|
|
|
|
progress_sender.clone(),
|
|
|
|
|
),
|
|
|
|
|
NotebookMainEnum::Temporary => temporary_files_search(
|
|
|
|
|
&gui_data,
|
|
|
|
|
loaded_common_items,
|
|
|
|
|
stop_receiver,
|
|
|
|
|
glib_stop_sender,
|
|
|
|
|
&grid_progress_stages,
|
|
|
|
|
progress_sender.clone(),
|
|
|
|
|
),
|
|
|
|
|
NotebookMainEnum::SimilarImages => similar_image_search(
|
|
|
|
|
&gui_data,
|
|
|
|
|
loaded_common_items,
|
|
|
|
|
stop_receiver,
|
|
|
|
|
glib_stop_sender,
|
|
|
|
|
&grid_progress_stages,
|
|
|
|
|
progress_sender.clone(),
|
|
|
|
|
),
|
|
|
|
|
NotebookMainEnum::SimilarVideos => similar_video_search(
|
|
|
|
|
&gui_data,
|
|
|
|
|
loaded_common_items,
|
|
|
|
|
stop_receiver,
|
|
|
|
|
glib_stop_sender,
|
|
|
|
|
&grid_progress_stages,
|
|
|
|
|
progress_sender.clone(),
|
|
|
|
|
),
|
|
|
|
|
NotebookMainEnum::SameMusic => same_music_search(
|
|
|
|
|
&gui_data,
|
|
|
|
|
loaded_common_items,
|
|
|
|
|
stop_receiver,
|
|
|
|
|
glib_stop_sender,
|
|
|
|
|
&grid_progress_stages,
|
|
|
|
|
progress_sender.clone(),
|
|
|
|
|
&show_dialog,
|
|
|
|
|
),
|
|
|
|
|
NotebookMainEnum::Symlinks => bad_symlinks_search(
|
|
|
|
|
&gui_data,
|
|
|
|
|
loaded_common_items,
|
|
|
|
|
stop_receiver,
|
|
|
|
|
glib_stop_sender,
|
|
|
|
|
&grid_progress_stages,
|
|
|
|
|
progress_sender.clone(),
|
|
|
|
|
),
|
|
|
|
|
NotebookMainEnum::BrokenFiles => broken_files_search(
|
|
|
|
|
&gui_data,
|
|
|
|
|
loaded_common_items,
|
|
|
|
|
stop_receiver,
|
|
|
|
|
glib_stop_sender,
|
|
|
|
|
&grid_progress_stages,
|
|
|
|
|
progress_sender.clone(),
|
|
|
|
|
&show_dialog,
|
|
|
|
|
),
|
|
|
|
|
NotebookMainEnum::BadExtensions => bad_extensions_search(
|
|
|
|
|
&gui_data,
|
|
|
|
|
loaded_common_items,
|
|
|
|
|
stop_receiver,
|
|
|
|
|
glib_stop_sender,
|
|
|
|
|
&grid_progress_stages,
|
|
|
|
|
progress_sender.clone(),
|
|
|
|
|
),
|
|
|
|
|
NotebookMainEnum::Duplicate => duplicate_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
|
|
|
|
|
NotebookMainEnum::EmptyFiles => empty_files_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
|
|
|
|
|
NotebookMainEnum::EmptyDirectories => empty_dirs_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
|
|
|
|
|
NotebookMainEnum::BigFiles => big_files_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
|
|
|
|
|
NotebookMainEnum::Temporary => temporary_files_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
|
|
|
|
|
NotebookMainEnum::SimilarImages => similar_image_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
|
|
|
|
|
NotebookMainEnum::SimilarVideos => similar_video_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
|
|
|
|
|
NotebookMainEnum::SameMusic => same_music_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender, &show_dialog),
|
|
|
|
|
NotebookMainEnum::Symlinks => bad_symlinks_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
|
|
|
|
|
NotebookMainEnum::BrokenFiles => broken_files_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender, &show_dialog),
|
|
|
|
|
NotebookMainEnum::BadExtensions => bad_extensions_search(&gui_data, loaded_commons, stop_receiver, result_sender, &grid_progress, progress_sender),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
window_progress.set_default_size(1, 1);
|
|
|
|
@ -286,13 +208,13 @@ impl LoadedCommonItems {
|
|
|
|
|
|
|
|
|
|
fn duplicate_search(
|
|
|
|
|
gui_data: &GuiData,
|
|
|
|
|
loaded_common_items: LoadedCommonItems,
|
|
|
|
|
loaded_commons: LoadedCommonItems,
|
|
|
|
|
stop_receiver: Receiver<()>,
|
|
|
|
|
glib_stop_sender: glibSender<Message>,
|
|
|
|
|
grid_progress_stages: &Grid,
|
|
|
|
|
result_sender: Sender<Message>,
|
|
|
|
|
grid_progress: &Grid,
|
|
|
|
|
progress_data_sender: Sender<ProgressData>,
|
|
|
|
|
) {
|
|
|
|
|
grid_progress_stages.show();
|
|
|
|
|
grid_progress.show();
|
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
@ -325,30 +247,30 @@ fn duplicate_search(
|
|
|
|
|
.spawn(move || {
|
|
|
|
|
let mut item = DuplicateFinder::new();
|
|
|
|
|
|
|
|
|
|
set_common_settings(&mut item, &loaded_common_items);
|
|
|
|
|
item.set_minimal_cache_file_size(loaded_common_items.minimal_cache_file_size);
|
|
|
|
|
set_common_settings(&mut item, &loaded_commons);
|
|
|
|
|
item.set_minimal_cache_file_size(loaded_commons.minimal_cache_file_size);
|
|
|
|
|
item.set_minimal_prehash_cache_file_size(minimal_prehash_cache_file_size);
|
|
|
|
|
item.set_check_method(check_method);
|
|
|
|
|
item.set_hash_type(hash_type);
|
|
|
|
|
item.set_ignore_hard_links(loaded_common_items.hide_hard_links);
|
|
|
|
|
item.set_ignore_hard_links(loaded_commons.hide_hard_links);
|
|
|
|
|
item.set_use_prehash_cache(use_prehash_cache);
|
|
|
|
|
item.set_delete_outdated_cache(delete_outdated_cache);
|
|
|
|
|
item.set_case_sensitive_name_comparison(case_sensitive_name_comparison);
|
|
|
|
|
item.find_duplicates(Some(&stop_receiver), Some(&progress_data_sender));
|
|
|
|
|
glib_stop_sender.send(Message::Duplicates(item)).unwrap();
|
|
|
|
|
result_sender.send(Message::Duplicates(item)).unwrap();
|
|
|
|
|
})
|
|
|
|
|
.unwrap();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn empty_files_search(
|
|
|
|
|
gui_data: &GuiData,
|
|
|
|
|
loaded_common_items: LoadedCommonItems,
|
|
|
|
|
loaded_commons: LoadedCommonItems,
|
|
|
|
|
stop_receiver: Receiver<()>,
|
|
|
|
|
glib_stop_sender: glibSender<Message>,
|
|
|
|
|
grid_progress_stages: &Grid,
|
|
|
|
|
result_sender: Sender<Message>,
|
|
|
|
|
grid_progress: &Grid,
|
|
|
|
|
progress_data_sender: Sender<ProgressData>,
|
|
|
|
|
) {
|
|
|
|
|
grid_progress_stages.hide();
|
|
|
|
|
grid_progress.hide();
|
|
|
|
|
|
|
|
|
|
let tree_view_empty_files_finder = gui_data.main_notebook.tree_view_empty_files_finder.clone();
|
|
|
|
|
clean_tree_view(&tree_view_empty_files_finder);
|
|
|
|
@ -358,22 +280,22 @@ fn empty_files_search(
|
|
|
|
|
.spawn(move || {
|
|
|
|
|
let mut item = EmptyFiles::new();
|
|
|
|
|
|
|
|
|
|
set_common_settings(&mut item, &loaded_common_items);
|
|
|
|
|
set_common_settings(&mut item, &loaded_commons);
|
|
|
|
|
item.find_empty_files(Some(&stop_receiver), Some(&progress_data_sender));
|
|
|
|
|
glib_stop_sender.send(Message::EmptyFiles(item)).unwrap();
|
|
|
|
|
result_sender.send(Message::EmptyFiles(item)).unwrap();
|
|
|
|
|
})
|
|
|
|
|
.unwrap();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn empty_directories_search(
|
|
|
|
|
fn empty_dirs_search(
|
|
|
|
|
gui_data: &GuiData,
|
|
|
|
|
loaded_common_items: LoadedCommonItems,
|
|
|
|
|
loaded_commons: LoadedCommonItems,
|
|
|
|
|
stop_receiver: Receiver<()>,
|
|
|
|
|
glib_stop_sender: glibSender<Message>,
|
|
|
|
|
grid_progress_stages: &Grid,
|
|
|
|
|
result_sender: Sender<Message>,
|
|
|
|
|
grid_progress: &Grid,
|
|
|
|
|
progress_data_sender: Sender<ProgressData>,
|
|
|
|
|
) {
|
|
|
|
|
grid_progress_stages.hide();
|
|
|
|
|
grid_progress.hide();
|
|
|
|
|
|
|
|
|
|
let tree_view_empty_folder_finder = gui_data.main_notebook.tree_view_empty_folder_finder.clone();
|
|
|
|
|
clean_tree_view(&tree_view_empty_folder_finder);
|
|
|
|
@ -383,22 +305,22 @@ fn empty_directories_search(
|
|
|
|
|
.spawn(move || {
|
|
|
|
|
let mut item = EmptyFolder::new();
|
|
|
|
|
|
|
|
|
|
set_common_settings(&mut item, &loaded_common_items);
|
|
|
|
|
set_common_settings(&mut item, &loaded_commons);
|
|
|
|
|
item.find_empty_folders(Some(&stop_receiver), Some(&progress_data_sender));
|
|
|
|
|
glib_stop_sender.send(Message::EmptyFolders(item)).unwrap();
|
|
|
|
|
result_sender.send(Message::EmptyFolders(item)).unwrap();
|
|
|
|
|
})
|
|
|
|
|
.unwrap();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn big_files_search(
|
|
|
|
|
gui_data: &GuiData,
|
|
|
|
|
loaded_common_items: LoadedCommonItems,
|
|
|
|
|
loaded_commons: LoadedCommonItems,
|
|
|
|
|
stop_receiver: Receiver<()>,
|
|
|
|
|
glib_stop_sender: glibSender<Message>,
|
|
|
|
|
grid_progress_stages: &Grid,
|
|
|
|
|
result_sender: Sender<Message>,
|
|
|
|
|
grid_progress: &Grid,
|
|
|
|
|
progress_data_sender: Sender<ProgressData>,
|
|
|
|
|
) {
|
|
|
|
|
grid_progress_stages.hide();
|
|
|
|
|
grid_progress.hide();
|
|
|
|
|
|
|
|
|
|
let combo_box_big_files_mode = gui_data.main_notebook.combo_box_big_files_mode.clone();
|
|
|
|
|
let entry_big_files_number = gui_data.main_notebook.entry_big_files_number.clone();
|
|
|
|
@ -415,24 +337,24 @@ fn big_files_search(
|
|
|
|
|
.spawn(move || {
|
|
|
|
|
let mut item = BigFile::new();
|
|
|
|
|
|
|
|
|
|
set_common_settings(&mut item, &loaded_common_items);
|
|
|
|
|
set_common_settings(&mut item, &loaded_commons);
|
|
|
|
|
item.set_number_of_files_to_check(numbers_of_files_to_check);
|
|
|
|
|
item.set_search_mode(big_files_mode);
|
|
|
|
|
item.find_big_files(Some(&stop_receiver), Some(&progress_data_sender));
|
|
|
|
|
glib_stop_sender.send(Message::BigFiles(item)).unwrap();
|
|
|
|
|
result_sender.send(Message::BigFiles(item)).unwrap();
|
|
|
|
|
})
|
|
|
|
|
.unwrap();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn temporary_files_search(
|
|
|
|
|
gui_data: &GuiData,
|
|
|
|
|
loaded_common_items: LoadedCommonItems,
|
|
|
|
|
loaded_commons: LoadedCommonItems,
|
|
|
|
|
stop_receiver: Receiver<()>,
|
|
|
|
|
glib_stop_sender: glibSender<Message>,
|
|
|
|
|
grid_progress_stages: &Grid,
|
|
|
|
|
result_sender: Sender<Message>,
|
|
|
|
|
grid_progress: &Grid,
|
|
|
|
|
progress_data_sender: Sender<ProgressData>,
|
|
|
|
|
) {
|
|
|
|
|
grid_progress_stages.hide();
|
|
|
|
|
grid_progress.hide();
|
|
|
|
|
|
|
|
|
|
let tree_view_temporary_files_finder = gui_data.main_notebook.tree_view_temporary_files_finder.clone();
|
|
|
|
|
clean_tree_view(&tree_view_temporary_files_finder);
|
|
|
|
@ -442,23 +364,23 @@ fn temporary_files_search(
|
|
|
|
|
.spawn(move || {
|
|
|
|
|
let mut item = Temporary::new();
|
|
|
|
|
|
|
|
|
|
set_common_settings(&mut item, &loaded_common_items);
|
|
|
|
|
set_common_settings(&mut item, &loaded_commons);
|
|
|
|
|
item.find_temporary_files(Some(&stop_receiver), Some(&progress_data_sender));
|
|
|
|
|
glib_stop_sender.send(Message::Temporary(item)).unwrap();
|
|
|
|
|
result_sender.send(Message::Temporary(item)).unwrap();
|
|
|
|
|
})
|
|
|
|
|
.unwrap();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn same_music_search(
|
|
|
|
|
gui_data: &GuiData,
|
|
|
|
|
loaded_common_items: LoadedCommonItems,
|
|
|
|
|
loaded_commons: LoadedCommonItems,
|
|
|
|
|
stop_receiver: Receiver<()>,
|
|
|
|
|
glib_stop_sender: glibSender<Message>,
|
|
|
|
|
grid_progress_stages: &Grid,
|
|
|
|
|
result_sender: Sender<Message>,
|
|
|
|
|
grid_progress: &Grid,
|
|
|
|
|
progress_data_sender: Sender<ProgressData>,
|
|
|
|
|
show_dialog: &Arc<AtomicBool>,
|
|
|
|
|
) {
|
|
|
|
|
grid_progress_stages.show();
|
|
|
|
|
grid_progress.show();
|
|
|
|
|
|
|
|
|
|
let check_button_music_artist: gtk4::CheckButton = gui_data.main_notebook.check_button_music_artist.clone();
|
|
|
|
|
let check_button_music_title: gtk4::CheckButton = gui_data.main_notebook.check_button_music_title.clone();
|
|
|
|
@ -509,14 +431,14 @@ fn same_music_search(
|
|
|
|
|
.spawn(move || {
|
|
|
|
|
let mut item = SameMusic::new();
|
|
|
|
|
|
|
|
|
|
set_common_settings(&mut item, &loaded_common_items);
|
|
|
|
|
set_common_settings(&mut item, &loaded_commons);
|
|
|
|
|
item.set_music_similarity(music_similarity);
|
|
|
|
|
item.set_maximum_difference(maximum_difference);
|
|
|
|
|
item.set_minimum_segment_duration(minimum_segment_duration);
|
|
|
|
|
item.set_check_type(check_method);
|
|
|
|
|
item.set_approximate_comparison(approximate_comparison);
|
|
|
|
|
item.find_same_music(Some(&stop_receiver), Some(&progress_data_sender));
|
|
|
|
|
glib_stop_sender.send(Message::SameMusic(item)).unwrap();
|
|
|
|
|
result_sender.send(Message::SameMusic(item)).unwrap();
|
|
|
|
|
})
|
|
|
|
|
.unwrap();
|
|
|
|
|
} else {
|
|
|
|
@ -546,14 +468,14 @@ fn same_music_search(
|
|
|
|
|
|
|
|
|
|
fn broken_files_search(
|
|
|
|
|
gui_data: &GuiData,
|
|
|
|
|
loaded_common_items: LoadedCommonItems,
|
|
|
|
|
loaded_commons: LoadedCommonItems,
|
|
|
|
|
stop_receiver: Receiver<()>,
|
|
|
|
|
glib_stop_sender: glibSender<Message>,
|
|
|
|
|
grid_progress_stages: &Grid,
|
|
|
|
|
result_sender: Sender<Message>,
|
|
|
|
|
grid_progress: &Grid,
|
|
|
|
|
progress_data_sender: Sender<ProgressData>,
|
|
|
|
|
show_dialog: &Arc<AtomicBool>,
|
|
|
|
|
) {
|
|
|
|
|
grid_progress_stages.show();
|
|
|
|
|
grid_progress.show();
|
|
|
|
|
|
|
|
|
|
let check_button_broken_files_archive: gtk4::CheckButton = gui_data.main_notebook.check_button_broken_files_archive.clone();
|
|
|
|
|
let check_button_broken_files_pdf: gtk4::CheckButton = gui_data.main_notebook.check_button_broken_files_pdf.clone();
|
|
|
|
@ -584,10 +506,10 @@ fn broken_files_search(
|
|
|
|
|
.spawn(move || {
|
|
|
|
|
let mut item = BrokenFiles::new();
|
|
|
|
|
|
|
|
|
|
set_common_settings(&mut item, &loaded_common_items);
|
|
|
|
|
set_common_settings(&mut item, &loaded_commons);
|
|
|
|
|
item.set_checked_types(checked_types);
|
|
|
|
|
item.find_broken_files(Some(&stop_receiver), Some(&progress_data_sender));
|
|
|
|
|
glib_stop_sender.send(Message::BrokenFiles(item)).unwrap();
|
|
|
|
|
result_sender.send(Message::BrokenFiles(item)).unwrap();
|
|
|
|
|
})
|
|
|
|
|
.unwrap();
|
|
|
|
|
} else {
|
|
|
|
@ -617,13 +539,13 @@ fn broken_files_search(
|
|
|
|
|
|
|
|
|
|
fn similar_image_search(
|
|
|
|
|
gui_data: &GuiData,
|
|
|
|
|
loaded_common_items: LoadedCommonItems,
|
|
|
|
|
loaded_commons: LoadedCommonItems,
|
|
|
|
|
stop_receiver: Receiver<()>,
|
|
|
|
|
glib_stop_sender: glibSender<Message>,
|
|
|
|
|
grid_progress_stages: &Grid,
|
|
|
|
|
result_sender: Sender<Message>,
|
|
|
|
|
grid_progress: &Grid,
|
|
|
|
|
progress_data_sender: Sender<ProgressData>,
|
|
|
|
|
) {
|
|
|
|
|
grid_progress_stages.show();
|
|
|
|
|
grid_progress.show();
|
|
|
|
|
|
|
|
|
|
let combo_box_image_hash_size = gui_data.main_notebook.combo_box_image_hash_size.clone();
|
|
|
|
|
let combo_box_image_hash_algorithm = gui_data.main_notebook.combo_box_image_hash_algorithm.clone();
|
|
|
|
@ -657,7 +579,7 @@ fn similar_image_search(
|
|
|
|
|
.spawn(move || {
|
|
|
|
|
let mut item = SimilarImages::new();
|
|
|
|
|
|
|
|
|
|
set_common_settings(&mut item, &loaded_common_items);
|
|
|
|
|
set_common_settings(&mut item, &loaded_commons);
|
|
|
|
|
item.set_similarity(similarity);
|
|
|
|
|
item.set_hash_alg(hash_alg);
|
|
|
|
|
item.set_hash_size(hash_size);
|
|
|
|
@ -665,20 +587,20 @@ fn similar_image_search(
|
|
|
|
|
item.set_delete_outdated_cache(delete_outdated_cache);
|
|
|
|
|
item.set_exclude_images_with_same_size(ignore_same_size);
|
|
|
|
|
item.find_similar_images(Some(&stop_receiver), Some(&progress_data_sender));
|
|
|
|
|
glib_stop_sender.send(Message::SimilarImages(item)).unwrap();
|
|
|
|
|
result_sender.send(Message::SimilarImages(item)).unwrap();
|
|
|
|
|
})
|
|
|
|
|
.unwrap();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn similar_video_search(
|
|
|
|
|
gui_data: &GuiData,
|
|
|
|
|
loaded_common_items: LoadedCommonItems,
|
|
|
|
|
loaded_commons: LoadedCommonItems,
|
|
|
|
|
stop_receiver: Receiver<()>,
|
|
|
|
|
glib_stop_sender: glibSender<Message>,
|
|
|
|
|
grid_progress_stages: &Grid,
|
|
|
|
|
result_sender: Sender<Message>,
|
|
|
|
|
grid_progress: &Grid,
|
|
|
|
|
progress_data_sender: Sender<ProgressData>,
|
|
|
|
|
) {
|
|
|
|
|
grid_progress_stages.show();
|
|
|
|
|
grid_progress.show();
|
|
|
|
|
|
|
|
|
|
let check_button_video_ignore_same_size = gui_data.main_notebook.check_button_video_ignore_same_size.clone();
|
|
|
|
|
let check_button_settings_similar_videos_delete_outdated_cache = gui_data.settings.check_button_settings_similar_videos_delete_outdated_cache.clone();
|
|
|
|
@ -697,25 +619,25 @@ fn similar_video_search(
|
|
|
|
|
.spawn(move || {
|
|
|
|
|
let mut item = SimilarVideos::new();
|
|
|
|
|
|
|
|
|
|
set_common_settings(&mut item, &loaded_common_items);
|
|
|
|
|
set_common_settings(&mut item, &loaded_commons);
|
|
|
|
|
item.set_tolerance(tolerance);
|
|
|
|
|
item.set_delete_outdated_cache(delete_outdated_cache);
|
|
|
|
|
item.set_exclude_videos_with_same_size(ignore_same_size);
|
|
|
|
|
item.find_similar_videos(Some(&stop_receiver), Some(&progress_data_sender));
|
|
|
|
|
glib_stop_sender.send(Message::SimilarVideos(item)).unwrap();
|
|
|
|
|
result_sender.send(Message::SimilarVideos(item)).unwrap();
|
|
|
|
|
})
|
|
|
|
|
.unwrap();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn bad_symlinks_search(
|
|
|
|
|
gui_data: &GuiData,
|
|
|
|
|
loaded_common_items: LoadedCommonItems,
|
|
|
|
|
loaded_commons: LoadedCommonItems,
|
|
|
|
|
stop_receiver: Receiver<()>,
|
|
|
|
|
glib_stop_sender: glibSender<Message>,
|
|
|
|
|
grid_progress_stages: &Grid,
|
|
|
|
|
result_sender: Sender<Message>,
|
|
|
|
|
grid_progress: &Grid,
|
|
|
|
|
progress_data_sender: Sender<ProgressData>,
|
|
|
|
|
) {
|
|
|
|
|
grid_progress_stages.hide();
|
|
|
|
|
grid_progress.hide();
|
|
|
|
|
|
|
|
|
|
let tree_view_invalid_symlinks = gui_data.main_notebook.tree_view_invalid_symlinks.clone();
|
|
|
|
|
clean_tree_view(&tree_view_invalid_symlinks);
|
|
|
|
@ -725,22 +647,22 @@ fn bad_symlinks_search(
|
|
|
|
|
.spawn(move || {
|
|
|
|
|
let mut item = InvalidSymlinks::new();
|
|
|
|
|
|
|
|
|
|
set_common_settings(&mut item, &loaded_common_items);
|
|
|
|
|
set_common_settings(&mut item, &loaded_commons);
|
|
|
|
|
item.find_invalid_links(Some(&stop_receiver), Some(&progress_data_sender));
|
|
|
|
|
glib_stop_sender.send(Message::InvalidSymlinks(item)).unwrap();
|
|
|
|
|
result_sender.send(Message::InvalidSymlinks(item)).unwrap();
|
|
|
|
|
})
|
|
|
|
|
.unwrap();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn bad_extensions_search(
|
|
|
|
|
gui_data: &GuiData,
|
|
|
|
|
loaded_common_items: LoadedCommonItems,
|
|
|
|
|
loaded_commons: LoadedCommonItems,
|
|
|
|
|
stop_receiver: Receiver<()>,
|
|
|
|
|
glib_stop_sender: glibSender<Message>,
|
|
|
|
|
grid_progress_stages: &Grid,
|
|
|
|
|
result_sender: Sender<Message>,
|
|
|
|
|
grid_progress: &Grid,
|
|
|
|
|
progress_data_sender: Sender<ProgressData>,
|
|
|
|
|
) {
|
|
|
|
|
grid_progress_stages.show();
|
|
|
|
|
grid_progress.show();
|
|
|
|
|
|
|
|
|
|
let tree_view_bad_extensions = gui_data.main_notebook.tree_view_bad_extensions.clone();
|
|
|
|
|
clean_tree_view(&tree_view_bad_extensions);
|
|
|
|
@ -750,29 +672,29 @@ fn bad_extensions_search(
|
|
|
|
|
.spawn(move || {
|
|
|
|
|
let mut item = BadExtensions::new();
|
|
|
|
|
|
|
|
|
|
set_common_settings(&mut item, &loaded_common_items);
|
|
|
|
|
set_common_settings(&mut item, &loaded_commons);
|
|
|
|
|
item.find_bad_extensions_files(Some(&stop_receiver), Some(&progress_data_sender));
|
|
|
|
|
glib_stop_sender.send(Message::BadExtensions(item)).unwrap();
|
|
|
|
|
result_sender.send(Message::BadExtensions(item)).unwrap();
|
|
|
|
|
})
|
|
|
|
|
.unwrap();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn set_common_settings<T>(component: &mut T, loaded_common_items: &LoadedCommonItems)
|
|
|
|
|
fn set_common_settings<T>(component: &mut T, loaded_commons: &LoadedCommonItems)
|
|
|
|
|
where
|
|
|
|
|
T: CommonData,
|
|
|
|
|
{
|
|
|
|
|
component.set_included_directory(loaded_common_items.included_directories.clone());
|
|
|
|
|
component.set_excluded_directory(loaded_common_items.excluded_directories.clone());
|
|
|
|
|
component.set_reference_directory(loaded_common_items.reference_directories.clone());
|
|
|
|
|
component.set_recursive_search(loaded_common_items.recursive_search);
|
|
|
|
|
component.set_allowed_extensions(loaded_common_items.allowed_extensions.clone());
|
|
|
|
|
component.set_excluded_extensions(loaded_common_items.excluded_extensions.clone());
|
|
|
|
|
component.set_excluded_items(loaded_common_items.excluded_items.clone());
|
|
|
|
|
component.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);
|
|
|
|
|
component.set_use_cache(loaded_common_items.use_cache);
|
|
|
|
|
component.set_save_also_as_json(loaded_common_items.save_also_as_json);
|
|
|
|
|
component.set_minimal_file_size(loaded_common_items.minimal_file_size);
|
|
|
|
|
component.set_maximal_file_size(loaded_common_items.maximal_file_size);
|
|
|
|
|
component.set_included_directory(loaded_commons.included_directories.clone());
|
|
|
|
|
component.set_excluded_directory(loaded_commons.excluded_directories.clone());
|
|
|
|
|
component.set_reference_directory(loaded_commons.reference_directories.clone());
|
|
|
|
|
component.set_recursive_search(loaded_commons.recursive_search);
|
|
|
|
|
component.set_allowed_extensions(loaded_commons.allowed_extensions.clone());
|
|
|
|
|
component.set_excluded_extensions(loaded_commons.excluded_extensions.clone());
|
|
|
|
|
component.set_excluded_items(loaded_commons.excluded_items.clone());
|
|
|
|
|
component.set_exclude_other_filesystems(loaded_commons.ignore_other_filesystems);
|
|
|
|
|
component.set_use_cache(loaded_commons.use_cache);
|
|
|
|
|
component.set_save_also_as_json(loaded_commons.save_also_as_json);
|
|
|
|
|
component.set_minimal_file_size(loaded_commons.minimal_file_size);
|
|
|
|
|
component.set_maximal_file_size(loaded_commons.maximal_file_size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[fun_time(message = "clean_tree_view", level = "debug")]
|
|
|
|
|