Bigger stack size
This commit is contained in:
parent
b70ab684cd
commit
85da7f3feb
4 changed files with 376 additions and 295 deletions
|
@ -32,6 +32,8 @@ use crate::duplicate::make_hard_link;
|
|||
use crate::CZKAWKA_VERSION;
|
||||
|
||||
static NUMBER_OF_THREADS: state::InitCell<usize> = state::InitCell::new();
|
||||
pub const DEFAULT_THREAD_SIZE: usize = 8 * 1024 * 1024; // 8 MB
|
||||
pub const DEFAULT_WORKER_THREAD_SIZE: usize = 4 * 1024 * 1024; // 4 MB
|
||||
|
||||
pub fn get_number_of_threads() -> usize {
|
||||
let data = NUMBER_OF_THREADS.get();
|
||||
|
@ -62,7 +64,6 @@ pub fn print_version_mode() {
|
|||
Ok(meta) => meta.semver.to_string(),
|
||||
Err(_) => "<unknown>".to_string(),
|
||||
};
|
||||
let info = os_info::get();
|
||||
let debug_release = if cfg!(debug_assertions) { "debug" } else { "release" };
|
||||
|
||||
let processors = match thread::available_parallelism() {
|
||||
|
@ -70,6 +71,7 @@ pub fn print_version_mode() {
|
|||
Err(_) => 1,
|
||||
};
|
||||
|
||||
let info = os_info::get();
|
||||
info!(
|
||||
"App version: {CZKAWKA_VERSION}, {debug_release} mode, rust {rust_version}, os {} {} [{} {}], {processors} cpu/threads",
|
||||
info.os_type(),
|
||||
|
@ -93,7 +95,11 @@ pub fn get_default_number_of_threads() -> usize {
|
|||
pub fn set_number_of_threads(thread_number: usize) {
|
||||
NUMBER_OF_THREADS.set(thread_number);
|
||||
|
||||
rayon::ThreadPoolBuilder::new().num_threads(get_number_of_threads()).build_global().unwrap();
|
||||
rayon::ThreadPoolBuilder::new()
|
||||
.num_threads(get_number_of_threads())
|
||||
.stack_size(DEFAULT_WORKER_THREAD_SIZE)
|
||||
.build_global()
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
pub const RAW_IMAGE_EXTENSIONS: &[&str] = &[
|
||||
|
|
|
@ -12,6 +12,7 @@ use gtk4::Grid;
|
|||
use czkawka_core::bad_extensions::BadExtensions;
|
||||
use czkawka_core::big_file::BigFile;
|
||||
use czkawka_core::broken_files::{BrokenFiles, CheckedTypes};
|
||||
use czkawka_core::common::DEFAULT_THREAD_SIZE;
|
||||
use czkawka_core::common_dir_traversal::{CheckingMethod, ProgressData};
|
||||
use czkawka_core::common_tool::CommonData;
|
||||
use czkawka_core::duplicate::DuplicateFinder;
|
||||
|
@ -315,30 +316,33 @@ fn duplicate_search(
|
|||
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_save_also_as_json(loaded_common_items.save_also_as_json);
|
||||
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();
|
||||
});
|
||||
thread::Builder::new()
|
||||
.stack_size(DEFAULT_THREAD_SIZE)
|
||||
.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_save_also_as_json(loaded_common_items.save_also_as_json);
|
||||
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();
|
||||
})
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn empty_files_search(
|
||||
|
@ -354,18 +358,21 @@ fn empty_files_search(
|
|||
let tree_view_empty_files_finder = gui_data.main_notebook.tree_view_empty_files_finder.clone();
|
||||
clean_tree_view(&tree_view_empty_files_finder);
|
||||
// Find empty files
|
||||
thread::spawn(move || {
|
||||
let mut vf = EmptyFiles::new();
|
||||
thread::Builder::new()
|
||||
.stack_size(DEFAULT_THREAD_SIZE)
|
||||
.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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::EmptyFiles(vf)).unwrap();
|
||||
});
|
||||
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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::EmptyFiles(vf)).unwrap();
|
||||
})
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn empty_directories_search(
|
||||
|
@ -381,15 +388,18 @@ fn empty_directories_search(
|
|||
let tree_view_empty_folder_finder = gui_data.main_notebook.tree_view_empty_folder_finder.clone();
|
||||
clean_tree_view(&tree_view_empty_folder_finder);
|
||||
|
||||
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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::EmptyFolders(ef)).unwrap();
|
||||
});
|
||||
thread::Builder::new()
|
||||
.stack_size(DEFAULT_THREAD_SIZE)
|
||||
.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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::EmptyFolders(ef)).unwrap();
|
||||
})
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn big_files_search(
|
||||
|
@ -412,20 +422,23 @@ fn big_files_search(
|
|||
|
||||
let numbers_of_files_to_check = entry_big_files_number.text().as_str().parse::<usize>().unwrap_or(50);
|
||||
|
||||
thread::spawn(move || {
|
||||
let mut bf = BigFile::new();
|
||||
thread::Builder::new()
|
||||
.stack_size(DEFAULT_THREAD_SIZE)
|
||||
.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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::BigFiles(bf)).unwrap();
|
||||
});
|
||||
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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::BigFiles(bf)).unwrap();
|
||||
})
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn temporary_files_search(
|
||||
|
@ -441,17 +454,20 @@ fn temporary_files_search(
|
|||
let tree_view_temporary_files_finder = gui_data.main_notebook.tree_view_temporary_files_finder.clone();
|
||||
clean_tree_view(&tree_view_temporary_files_finder);
|
||||
|
||||
thread::spawn(move || {
|
||||
let mut tf = Temporary::new();
|
||||
thread::Builder::new()
|
||||
.stack_size(DEFAULT_THREAD_SIZE)
|
||||
.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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::Temporary(tf)).unwrap();
|
||||
});
|
||||
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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::Temporary(tf)).unwrap();
|
||||
})
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn same_music_search(
|
||||
|
@ -509,28 +525,31 @@ fn same_music_search(
|
|||
let minimum_segment_duration = scale_seconds_same_music.value() as f32;
|
||||
|
||||
if music_similarity != MusicSimilarity::NONE || check_method == CheckingMethod::AudioContent {
|
||||
thread::spawn(move || {
|
||||
let mut mf = SameMusic::new();
|
||||
thread::Builder::new()
|
||||
.stack_size(DEFAULT_THREAD_SIZE)
|
||||
.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_maximum_difference(maximum_difference);
|
||||
mf.set_minimum_segment_duration(minimum_segment_duration);
|
||||
mf.set_check_type(check_method);
|
||||
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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::SameMusic(mf)).unwrap();
|
||||
});
|
||||
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_maximum_difference(maximum_difference);
|
||||
mf.set_minimum_segment_duration(minimum_segment_duration);
|
||||
mf.set_check_type(check_method);
|
||||
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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::SameMusic(mf)).unwrap();
|
||||
})
|
||||
.unwrap();
|
||||
} else {
|
||||
let shared_buttons = gui_data.shared_buttons.clone();
|
||||
let buttons_array = gui_data.bottom_buttons.buttons_array.clone();
|
||||
|
@ -591,21 +610,24 @@ fn broken_files_search(
|
|||
}
|
||||
|
||||
if checked_types != CheckedTypes::NONE {
|
||||
thread::spawn(move || {
|
||||
let mut br = BrokenFiles::new();
|
||||
thread::Builder::new()
|
||||
.stack_size(DEFAULT_THREAD_SIZE)
|
||||
.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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::BrokenFiles(br)).unwrap();
|
||||
});
|
||||
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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::BrokenFiles(br)).unwrap();
|
||||
})
|
||||
.unwrap();
|
||||
} else {
|
||||
let shared_buttons = gui_data.shared_buttons.clone();
|
||||
let buttons_array = gui_data.bottom_buttons.buttons_array.clone();
|
||||
|
@ -668,29 +690,32 @@ fn similar_image_search(
|
|||
|
||||
let delete_outdated_cache = check_button_settings_similar_images_delete_outdated_cache.is_active();
|
||||
|
||||
thread::spawn(move || {
|
||||
let mut sf = SimilarImages::new();
|
||||
thread::Builder::new()
|
||||
.stack_size(DEFAULT_THREAD_SIZE)
|
||||
.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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::SimilarImages(sf)).unwrap();
|
||||
});
|
||||
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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::SimilarImages(sf)).unwrap();
|
||||
})
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn similar_video_search(
|
||||
|
@ -715,26 +740,29 @@ fn similar_video_search(
|
|||
|
||||
let ignore_same_size = check_button_video_ignore_same_size.is_active();
|
||||
|
||||
thread::spawn(move || {
|
||||
let mut sf = SimilarVideos::new();
|
||||
thread::Builder::new()
|
||||
.stack_size(DEFAULT_THREAD_SIZE)
|
||||
.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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::SimilarVideos(sf)).unwrap();
|
||||
});
|
||||
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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::SimilarVideos(sf)).unwrap();
|
||||
})
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn bad_symlinks_search(
|
||||
|
@ -750,18 +778,21 @@ fn bad_symlinks_search(
|
|||
let tree_view_invalid_symlinks = gui_data.main_notebook.tree_view_invalid_symlinks.clone();
|
||||
clean_tree_view(&tree_view_invalid_symlinks);
|
||||
|
||||
thread::spawn(move || {
|
||||
let mut isf = InvalidSymlinks::new();
|
||||
thread::Builder::new()
|
||||
.stack_size(DEFAULT_THREAD_SIZE)
|
||||
.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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::InvalidSymlinks(isf)).unwrap();
|
||||
});
|
||||
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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::InvalidSymlinks(isf)).unwrap();
|
||||
})
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn bad_extensions_search(
|
||||
|
@ -777,20 +808,23 @@ fn bad_extensions_search(
|
|||
let tree_view_bad_extensions = gui_data.main_notebook.tree_view_bad_extensions.clone();
|
||||
clean_tree_view(&tree_view_bad_extensions);
|
||||
|
||||
thread::spawn(move || {
|
||||
let mut be = BadExtensions::new();
|
||||
thread::Builder::new()
|
||||
.stack_size(DEFAULT_THREAD_SIZE)
|
||||
.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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::BadExtensions(be)).unwrap();
|
||||
});
|
||||
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(&progress_data_sender));
|
||||
glib_stop_sender.send(Message::BadExtensions(be)).unwrap();
|
||||
})
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
#[fun_time(message = "clean_tree_view", level = "debug")]
|
||||
|
|
|
@ -3,7 +3,7 @@ use crate::settings::{collect_settings, SettingsCustom};
|
|||
use crate::{CurrentTab, GuiState, MainListModel, MainWindow, ProgressToSend};
|
||||
use chrono::NaiveDateTime;
|
||||
use crossbeam_channel::{Receiver, Sender};
|
||||
use czkawka_core::common::split_path;
|
||||
use czkawka_core::common::{split_path, DEFAULT_THREAD_SIZE};
|
||||
use czkawka_core::common_dir_traversal::ProgressData;
|
||||
use czkawka_core::common_tool::CommonData;
|
||||
use czkawka_core::common_traits::ResultEntry;
|
||||
|
@ -50,40 +50,87 @@ pub fn connect_scan_button(app: &MainWindow, progress_sender: Sender<ProgressDat
|
|||
|
||||
// TODO handle referenced folders
|
||||
fn scan_similar_images(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>, stop_receiver: Receiver<()>, custom_settings: SettingsCustom) {
|
||||
thread::spawn(move || {
|
||||
let mut finder = SimilarImages::new();
|
||||
finder.set_included_directory(custom_settings.included_directories.clone());
|
||||
finder.set_excluded_directory(custom_settings.excluded_directories.clone());
|
||||
finder.find_similar_images(Some(&stop_receiver), Some(&progress_sender));
|
||||
thread::Builder::new()
|
||||
.stack_size(DEFAULT_THREAD_SIZE)
|
||||
.spawn(move || {
|
||||
let mut finder = SimilarImages::new();
|
||||
finder.set_included_directory(custom_settings.included_directories.clone());
|
||||
finder.set_excluded_directory(custom_settings.excluded_directories.clone());
|
||||
finder.find_similar_images(Some(&stop_receiver), Some(&progress_sender));
|
||||
|
||||
let mut vector = finder.get_similar_images().clone();
|
||||
let messages = finder.get_text_messages().create_messages_text();
|
||||
let mut vector = finder.get_similar_images().clone();
|
||||
let messages = finder.get_text_messages().create_messages_text();
|
||||
|
||||
for vec_fe in &mut vector {
|
||||
vec_fe.sort_unstable_by_key(|e| e.similarity);
|
||||
}
|
||||
for vec_fe in &mut vector {
|
||||
vec_fe.sort_unstable_by_key(|e| e.similarity);
|
||||
}
|
||||
|
||||
let hash_size = finder.hash_size;
|
||||
let hash_size = finder.hash_size;
|
||||
|
||||
a.upgrade_in_event_loop(move |app| {
|
||||
let number_of_empty_files = vector.len();
|
||||
let items = Rc::new(VecModel::default());
|
||||
for vec_fe in vector {
|
||||
items.push(MainListModel {
|
||||
checked: false,
|
||||
header_row: true,
|
||||
selected_row: false,
|
||||
val: ModelRc::new(VecModel::default()),
|
||||
});
|
||||
for fe in vec_fe {
|
||||
a.upgrade_in_event_loop(move |app| {
|
||||
let number_of_empty_files = vector.len();
|
||||
let items = Rc::new(VecModel::default());
|
||||
for vec_fe in vector {
|
||||
items.push(MainListModel {
|
||||
checked: false,
|
||||
header_row: true,
|
||||
selected_row: false,
|
||||
val: ModelRc::new(VecModel::default()),
|
||||
});
|
||||
for fe in vec_fe {
|
||||
let (directory, file) = split_path(fe.get_path());
|
||||
let data_model = create_vec_model_from_vec_string(vec![
|
||||
similar_images::get_string_from_similarity(&fe.similarity, hash_size),
|
||||
format_size(fe.size, BINARY),
|
||||
fe.dimensions.clone(),
|
||||
file,
|
||||
directory,
|
||||
NaiveDateTime::from_timestamp_opt(fe.get_modified_date() as i64, 0).unwrap().to_string(),
|
||||
]);
|
||||
|
||||
let main = MainListModel {
|
||||
checked: false,
|
||||
header_row: false,
|
||||
selected_row: false,
|
||||
val: ModelRc::new(data_model),
|
||||
};
|
||||
items.push(main);
|
||||
}
|
||||
}
|
||||
app.set_similar_images_model(items.into());
|
||||
app.invoke_scan_ended(format!("Found {} similar images files", number_of_empty_files).into());
|
||||
app.global::<GuiState>().set_info_text(messages.into());
|
||||
})
|
||||
})
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn scan_empty_files(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>, stop_receiver: Receiver<()>, custom_settings: SettingsCustom) {
|
||||
thread::Builder::new()
|
||||
.stack_size(DEFAULT_THREAD_SIZE)
|
||||
.spawn(move || {
|
||||
let mut finder = EmptyFiles::new();
|
||||
finder.set_included_directory(custom_settings.included_directories.clone());
|
||||
finder.set_excluded_directory(custom_settings.excluded_directories.clone());
|
||||
finder.find_empty_files(Some(&stop_receiver), Some(&progress_sender));
|
||||
|
||||
let mut vector = finder.get_empty_files().clone();
|
||||
let messages = finder.get_text_messages().create_messages_text();
|
||||
|
||||
vector.sort_unstable_by_key(|e| {
|
||||
let t = split_path(e.get_path());
|
||||
(t.0, t.1)
|
||||
});
|
||||
|
||||
a.upgrade_in_event_loop(move |app| {
|
||||
let number_of_empty_files = vector.len();
|
||||
let items = Rc::new(VecModel::default());
|
||||
for fe in vector {
|
||||
let (directory, file) = split_path(fe.get_path());
|
||||
let data_model = create_vec_model_from_vec_string(vec![
|
||||
similar_images::get_string_from_similarity(&fe.similarity, hash_size),
|
||||
format_size(fe.size, BINARY),
|
||||
fe.dimensions.clone(),
|
||||
file,
|
||||
directory,
|
||||
NaiveDateTime::from_timestamp_opt(fe.get_modified_date() as i64, 0).unwrap().to_string(),
|
||||
let data_model = VecModel::from_slice(&[
|
||||
SharedString::from(file),
|
||||
SharedString::from(directory),
|
||||
SharedString::from(NaiveDateTime::from_timestamp_opt(fe.get_modified_date() as i64, 0).unwrap().to_string()),
|
||||
]);
|
||||
|
||||
let main = MainListModel {
|
||||
|
@ -94,92 +141,54 @@ fn scan_similar_images(a: Weak<MainWindow>, progress_sender: Sender<ProgressData
|
|||
};
|
||||
items.push(main);
|
||||
}
|
||||
}
|
||||
app.set_similar_images_model(items.into());
|
||||
app.invoke_scan_ended(format!("Found {} similar images files", number_of_empty_files).into());
|
||||
app.global::<GuiState>().set_info_text(messages.into());
|
||||
app.set_empty_files_model(items.into());
|
||||
app.invoke_scan_ended(format!("Found {} empty files", number_of_empty_files).into());
|
||||
app.global::<GuiState>().set_info_text(messages.into());
|
||||
})
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
fn scan_empty_files(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>, stop_receiver: Receiver<()>, custom_settings: SettingsCustom) {
|
||||
thread::spawn(move || {
|
||||
let mut finder = EmptyFiles::new();
|
||||
finder.set_included_directory(custom_settings.included_directories.clone());
|
||||
finder.set_excluded_directory(custom_settings.excluded_directories.clone());
|
||||
finder.find_empty_files(Some(&stop_receiver), Some(&progress_sender));
|
||||
|
||||
let mut vector = finder.get_empty_files().clone();
|
||||
let messages = finder.get_text_messages().create_messages_text();
|
||||
|
||||
vector.sort_unstable_by_key(|e| {
|
||||
let t = split_path(e.get_path());
|
||||
(t.0, t.1)
|
||||
});
|
||||
|
||||
a.upgrade_in_event_loop(move |app| {
|
||||
let number_of_empty_files = vector.len();
|
||||
let items = Rc::new(VecModel::default());
|
||||
for fe in vector {
|
||||
let (directory, file) = split_path(fe.get_path());
|
||||
let data_model = VecModel::from_slice(&[
|
||||
SharedString::from(file),
|
||||
SharedString::from(directory),
|
||||
SharedString::from(NaiveDateTime::from_timestamp_opt(fe.get_modified_date() as i64, 0).unwrap().to_string()),
|
||||
]);
|
||||
|
||||
let main = MainListModel {
|
||||
checked: false,
|
||||
header_row: false,
|
||||
selected_row: false,
|
||||
val: ModelRc::new(data_model),
|
||||
};
|
||||
items.push(main);
|
||||
}
|
||||
app.set_empty_files_model(items.into());
|
||||
app.invoke_scan_ended(format!("Found {} empty files", number_of_empty_files).into());
|
||||
app.global::<GuiState>().set_info_text(messages.into());
|
||||
})
|
||||
});
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
fn scan_empty_folders(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>, stop_receiver: Receiver<()>, custom_settings: SettingsCustom) {
|
||||
thread::spawn(move || {
|
||||
let mut finder = EmptyFolder::new();
|
||||
finder.set_included_directory(custom_settings.included_directories.clone());
|
||||
finder.set_excluded_directory(custom_settings.excluded_directories.clone());
|
||||
finder.find_empty_folders(Some(&stop_receiver), Some(&progress_sender));
|
||||
thread::Builder::new()
|
||||
.stack_size(DEFAULT_THREAD_SIZE)
|
||||
.spawn(move || {
|
||||
let mut finder = EmptyFolder::new();
|
||||
finder.set_included_directory(custom_settings.included_directories.clone());
|
||||
finder.set_excluded_directory(custom_settings.excluded_directories.clone());
|
||||
finder.find_empty_folders(Some(&stop_receiver), Some(&progress_sender));
|
||||
|
||||
let mut vector = finder.get_empty_folder_list().keys().cloned().collect::<Vec<PathBuf>>();
|
||||
let messages = finder.get_text_messages().create_messages_text();
|
||||
let mut vector = finder.get_empty_folder_list().keys().cloned().collect::<Vec<PathBuf>>();
|
||||
let messages = finder.get_text_messages().create_messages_text();
|
||||
|
||||
vector.sort_unstable_by_key(|e| {
|
||||
let t = split_path(e.as_path());
|
||||
(t.0, t.1)
|
||||
});
|
||||
vector.sort_unstable_by_key(|e| {
|
||||
let t = split_path(e.as_path());
|
||||
(t.0, t.1)
|
||||
});
|
||||
|
||||
a.upgrade_in_event_loop(move |app| {
|
||||
let folder_map = finder.get_empty_folder_list();
|
||||
let items = Rc::new(VecModel::default());
|
||||
for path in vector {
|
||||
let (directory, file) = split_path(&path);
|
||||
let data_model = VecModel::from_slice(&[
|
||||
SharedString::from(file),
|
||||
SharedString::from(directory),
|
||||
SharedString::from(NaiveDateTime::from_timestamp_opt(folder_map[&path].modified_date as i64, 0).unwrap().to_string()),
|
||||
]);
|
||||
a.upgrade_in_event_loop(move |app| {
|
||||
let folder_map = finder.get_empty_folder_list();
|
||||
let items = Rc::new(VecModel::default());
|
||||
for path in vector {
|
||||
let (directory, file) = split_path(&path);
|
||||
let data_model = VecModel::from_slice(&[
|
||||
SharedString::from(file),
|
||||
SharedString::from(directory),
|
||||
SharedString::from(NaiveDateTime::from_timestamp_opt(folder_map[&path].modified_date as i64, 0).unwrap().to_string()),
|
||||
]);
|
||||
|
||||
let main = MainListModel {
|
||||
checked: false,
|
||||
header_row: false,
|
||||
selected_row: false,
|
||||
val: ModelRc::new(data_model),
|
||||
};
|
||||
items.push(main);
|
||||
}
|
||||
app.set_empty_folder_model(items.into());
|
||||
app.invoke_scan_ended(format!("Found {} empty folders", folder_map.len()).into());
|
||||
app.global::<GuiState>().set_info_text(messages.into());
|
||||
let main = MainListModel {
|
||||
checked: false,
|
||||
header_row: false,
|
||||
selected_row: false,
|
||||
val: ModelRc::new(data_model),
|
||||
};
|
||||
items.push(main);
|
||||
}
|
||||
app.set_empty_folder_model(items.into());
|
||||
app.invoke_scan_ended(format!("Found {} empty folders", folder_map.len()).into());
|
||||
app.global::<GuiState>().set_info_text(messages.into());
|
||||
})
|
||||
})
|
||||
});
|
||||
.unwrap();
|
||||
}
|
||||
|
|
|
@ -21,28 +21,27 @@ component TextComponent inherits HorizontalLayout {
|
|||
}
|
||||
}
|
||||
|
||||
export component SettingsList inherits ScrollView {
|
||||
min-height: 300px;
|
||||
VerticalLayout {
|
||||
component MinMaxSizeComponent inherits HorizontalLayout {
|
||||
spacing: 20px;
|
||||
Text {
|
||||
horizontal-stretch: 0.0;
|
||||
text:"Size";
|
||||
vertical-alignment: TextVerticalAlignment.center;
|
||||
}
|
||||
HorizontalLayout {
|
||||
spacing: 5px;
|
||||
horizontal-stretch: 1.0;
|
||||
Text {
|
||||
text: "Settings";
|
||||
text:"Min:";
|
||||
vertical-alignment: TextVerticalAlignment.center;
|
||||
}
|
||||
SpinBox {
|
||||
enabled: true;
|
||||
height: SettingsSize.item_height;
|
||||
horizontal-alignment: TextHorizontalAlignment.center;
|
||||
font-size: 20px;
|
||||
}
|
||||
Text {
|
||||
text: "General settings";
|
||||
height: SettingsSize.item_height;
|
||||
horizontal-alignment: TextHorizontalAlignment.center;
|
||||
}
|
||||
TextComponent {
|
||||
name: "Excluded item:";
|
||||
model <=> Settings.excluded_items;
|
||||
}
|
||||
TextComponent {
|
||||
name: "Allowed extensions:";
|
||||
model <=> Settings.allowed_extensions;
|
||||
text:"Max:";
|
||||
vertical-alignment: TextVerticalAlignment.center;
|
||||
}
|
||||
SpinBox {
|
||||
enabled: true;
|
||||
|
@ -50,3 +49,36 @@ export component SettingsList inherits ScrollView {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
export component SettingsList inherits VerticalLayout {
|
||||
preferred-height: 300px;
|
||||
preferred-width: 400px;
|
||||
|
||||
Text {
|
||||
text: "Settings";
|
||||
height: SettingsSize.item_height;
|
||||
horizontal-alignment: TextHorizontalAlignment.center;
|
||||
font-size: 20px;
|
||||
}
|
||||
ScrollView {
|
||||
VerticalLayout {
|
||||
spacing: 5px;
|
||||
Text {
|
||||
text: "General settings";
|
||||
height: SettingsSize.item_height;
|
||||
horizontal-alignment: TextHorizontalAlignment.center;
|
||||
}
|
||||
TextComponent {
|
||||
name: "Excluded item:";
|
||||
model <=> Settings.excluded_items;
|
||||
}
|
||||
TextComponent {
|
||||
name: "Allowed extensions:";
|
||||
model <=> Settings.allowed_extensions;
|
||||
}
|
||||
MinMaxSizeComponent {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue