1
0
Fork 0
mirror of synced 2024-06-27 18:40:50 +12:00

Bigger stack size

This commit is contained in:
Rafał Mikrut 2023-11-24 20:13:08 +01:00
parent b70ab684cd
commit 85da7f3feb
4 changed files with 376 additions and 295 deletions

View file

@ -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] = &[

View file

@ -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")]

View file

@ -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();
}

View file

@ -21,32 +21,64 @@ 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;
height: SettingsSize.item_height;
}
}
}
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 {
}
}
}
}