2021-12-20 02:45:10 +13:00
|
|
|
use std::collections::BTreeMap;
|
|
|
|
use std::default::Default;
|
|
|
|
|
2021-12-01 00:45:09 +13:00
|
|
|
use directories_next::ProjectDirs;
|
2022-05-22 20:59:09 +12:00
|
|
|
use gtk4::prelude::*;
|
2023-02-19 22:21:14 +13:00
|
|
|
use gtk4::{Label, ResponseType, Window};
|
2021-12-01 00:45:09 +13:00
|
|
|
use image::imageops::FilterType;
|
2022-04-03 02:11:28 +12:00
|
|
|
use image_hasher::HashAlg;
|
2021-12-20 02:45:10 +13:00
|
|
|
|
|
|
|
use czkawka_core::common_messages::Messages;
|
|
|
|
use czkawka_core::duplicate::HashType;
|
2020-12-08 03:25:44 +13:00
|
|
|
|
2022-06-01 03:52:55 +12:00
|
|
|
use crate::flg;
|
2022-01-14 03:58:33 +13:00
|
|
|
use crate::gui_structs::gui_data::GuiData;
|
2021-12-01 00:45:09 +13:00
|
|
|
use crate::help_functions::get_dialog_box_child;
|
2021-11-28 08:49:20 +13:00
|
|
|
use crate::saving_loading::{load_configuration, reset_configuration, save_configuration};
|
|
|
|
|
2020-12-08 03:25:44 +13:00
|
|
|
pub fn connect_settings(gui_data: &GuiData) {
|
2022-11-26 08:38:27 +13:00
|
|
|
// Connect scale
|
|
|
|
{
|
|
|
|
let label_restart_needed = gui_data.settings.label_restart_needed.clone();
|
|
|
|
gui_data.settings.scale_settings_number_of_threads.connect_value_changed(move |_| {
|
|
|
|
if label_restart_needed.label().is_empty() {
|
|
|
|
label_restart_needed.set_label(&flg!("settings_label_restart"));
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2021-02-23 21:40:19 +13:00
|
|
|
// Connect button settings
|
|
|
|
{
|
|
|
|
let button_settings = gui_data.header.button_settings.clone();
|
|
|
|
let window_settings = gui_data.settings.window_settings.clone();
|
|
|
|
button_settings.connect_clicked(move |_| {
|
|
|
|
window_settings.show();
|
|
|
|
});
|
|
|
|
|
|
|
|
let window_settings = gui_data.settings.window_settings.clone();
|
|
|
|
|
2022-05-22 20:59:09 +12:00
|
|
|
window_settings.connect_close_request(move |window| {
|
2021-02-23 21:40:19 +13:00
|
|
|
window.hide();
|
2022-05-22 20:59:09 +12:00
|
|
|
gtk4::Inhibit(true)
|
2021-02-23 21:40:19 +13:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-12-08 03:25:44 +13:00
|
|
|
// Connect save configuration button
|
|
|
|
{
|
2021-11-25 20:36:49 +13:00
|
|
|
let upper_notebook = gui_data.upper_notebook.clone();
|
|
|
|
let settings = gui_data.settings.clone();
|
2022-01-08 04:45:08 +13:00
|
|
|
let main_notebook = gui_data.main_notebook.clone();
|
2021-11-25 20:36:49 +13:00
|
|
|
let text_view_errors = gui_data.text_view_errors.clone();
|
2021-02-23 21:40:19 +13:00
|
|
|
let button_settings_save_configuration = gui_data.settings.button_settings_save_configuration.clone();
|
2020-12-08 03:25:44 +13:00
|
|
|
button_settings_save_configuration.connect_clicked(move |_| {
|
2022-01-08 04:45:08 +13:00
|
|
|
save_configuration(true, &upper_notebook, &main_notebook, &settings, &text_view_errors);
|
2020-12-08 03:25:44 +13:00
|
|
|
});
|
|
|
|
}
|
|
|
|
// Connect load configuration button
|
|
|
|
{
|
2021-11-25 20:36:49 +13:00
|
|
|
let upper_notebook = gui_data.upper_notebook.clone();
|
|
|
|
let settings = gui_data.settings.clone();
|
2022-01-08 04:45:08 +13:00
|
|
|
let main_notebook = gui_data.main_notebook.clone();
|
2021-11-25 20:36:49 +13:00
|
|
|
let text_view_errors = gui_data.text_view_errors.clone();
|
2021-02-23 21:40:19 +13:00
|
|
|
let button_settings_load_configuration = gui_data.settings.button_settings_load_configuration.clone();
|
2021-11-25 20:36:49 +13:00
|
|
|
let scrolled_window_errors = gui_data.scrolled_window_errors.clone();
|
2020-12-08 03:25:44 +13:00
|
|
|
button_settings_load_configuration.connect_clicked(move |_| {
|
2023-01-29 06:54:02 +13:00
|
|
|
load_configuration(true, &upper_notebook, &main_notebook, &settings, &text_view_errors, &scrolled_window_errors, &Vec::new());
|
2020-12-08 03:25:44 +13:00
|
|
|
});
|
|
|
|
}
|
|
|
|
// Connect reset configuration button
|
|
|
|
{
|
2021-11-25 20:36:49 +13:00
|
|
|
let upper_notebook = gui_data.upper_notebook.clone();
|
|
|
|
let settings = gui_data.settings.clone();
|
2022-01-08 04:45:08 +13:00
|
|
|
let main_notebook = gui_data.main_notebook.clone();
|
2021-11-25 20:36:49 +13:00
|
|
|
let text_view_errors = gui_data.text_view_errors.clone();
|
2021-02-23 21:40:19 +13:00
|
|
|
let button_settings_reset_configuration = gui_data.settings.button_settings_reset_configuration.clone();
|
2020-12-08 03:25:44 +13:00
|
|
|
button_settings_reset_configuration.connect_clicked(move |_| {
|
2022-01-08 04:45:08 +13:00
|
|
|
reset_configuration(true, &upper_notebook, &main_notebook, &settings, &text_view_errors);
|
2020-12-08 03:25:44 +13:00
|
|
|
});
|
|
|
|
}
|
2021-12-01 00:45:09 +13:00
|
|
|
// Connect button for opening cache
|
|
|
|
{
|
|
|
|
let button_settings_open_cache_folder = gui_data.settings.button_settings_open_cache_folder.clone();
|
|
|
|
button_settings_open_cache_folder.connect_clicked(move |_| {
|
|
|
|
if let Some(proj_dirs) = ProjectDirs::from("pl", "Qarmin", "Czkawka") {
|
|
|
|
let cache_dir = proj_dirs.cache_dir();
|
2022-06-18 20:59:46 +12:00
|
|
|
|
2022-11-24 08:23:17 +13:00
|
|
|
if let Err(e) = open::that(cache_dir) {
|
2022-12-21 20:44:26 +13:00
|
|
|
println!("Failed to open config folder {cache_dir:?}, reason {e}");
|
2022-06-18 20:59:46 +12:00
|
|
|
};
|
2021-12-01 00:45:09 +13:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
// Connect button for opening settings
|
|
|
|
{
|
|
|
|
let button_settings_open_settings_folder = gui_data.settings.button_settings_open_settings_folder.clone();
|
|
|
|
button_settings_open_settings_folder.connect_clicked(move |_| {
|
|
|
|
if let Some(proj_dirs) = ProjectDirs::from("pl", "Qarmin", "Czkawka") {
|
|
|
|
let config_dir = proj_dirs.config_dir();
|
2022-06-18 20:59:46 +12:00
|
|
|
|
2022-11-24 08:23:17 +13:00
|
|
|
if let Err(e) = open::that(config_dir) {
|
2022-12-21 20:44:26 +13:00
|
|
|
println!("Failed to open config folder {config_dir:?}, reason {e}");
|
2022-06-18 20:59:46 +12:00
|
|
|
};
|
2021-12-01 00:45:09 +13:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
// Connect clear cache methods
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let button_settings_duplicates_clear_cache = gui_data.settings.button_settings_duplicates_clear_cache.clone();
|
|
|
|
let settings_window = gui_data.settings.window_settings.clone();
|
|
|
|
let text_view_errors = gui_data.text_view_errors.clone();
|
|
|
|
let entry_settings_cache_file_minimal_size = gui_data.settings.entry_settings_cache_file_minimal_size.clone();
|
|
|
|
|
|
|
|
button_settings_duplicates_clear_cache.connect_clicked(move |_| {
|
2023-01-29 06:54:02 +13:00
|
|
|
let dialog = create_clear_cache_dialog(&flg!("cache_clear_duplicates_title"), &settings_window);
|
2022-05-22 20:59:09 +12:00
|
|
|
dialog.show();
|
2021-12-01 00:45:09 +13:00
|
|
|
|
|
|
|
let text_view_errors = text_view_errors.clone();
|
|
|
|
let entry_settings_cache_file_minimal_size = entry_settings_cache_file_minimal_size.clone();
|
|
|
|
|
|
|
|
dialog.connect_response(move |dialog, response_type| {
|
|
|
|
if response_type == ResponseType::Ok {
|
|
|
|
let mut messages: Messages = Messages::new();
|
2021-12-02 00:37:17 +13:00
|
|
|
for use_prehash in [true, false] {
|
2023-01-29 06:54:02 +13:00
|
|
|
for type_of_hash in &[HashType::Xxh3, HashType::Blake3, HashType::Crc32] {
|
2021-12-02 00:37:17 +13:00
|
|
|
if let Some(cache_entries) = czkawka_core::duplicate::load_hashes_from_file(&mut messages, true, type_of_hash, use_prehash) {
|
2022-01-02 09:07:20 +13:00
|
|
|
let mut hashmap_to_save: BTreeMap<String, czkawka_core::common_dir_traversal::FileEntry> = Default::default();
|
2021-12-02 00:37:17 +13:00
|
|
|
for (_, vec_file_entry) in cache_entries {
|
|
|
|
for file_entry in vec_file_entry {
|
|
|
|
hashmap_to_save.insert(file_entry.path.to_string_lossy().to_string(), file_entry);
|
|
|
|
}
|
2021-12-01 00:45:09 +13:00
|
|
|
}
|
2021-12-02 00:37:17 +13:00
|
|
|
czkawka_core::duplicate::save_hashes_to_file(
|
|
|
|
&hashmap_to_save,
|
|
|
|
&mut messages,
|
|
|
|
type_of_hash,
|
|
|
|
use_prehash,
|
|
|
|
entry_settings_cache_file_minimal_size.text().as_str().parse::<u64>().unwrap_or(2 * 1024 * 1024),
|
2023-01-29 06:54:02 +13:00
|
|
|
);
|
2021-12-01 00:45:09 +13:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-20 10:35:07 +13:00
|
|
|
messages.messages.push(flg!("cache_properly_cleared"));
|
2022-05-22 20:59:09 +12:00
|
|
|
text_view_errors.buffer().set_text(messages.create_messages_text().as_str());
|
2021-12-02 00:37:17 +13:00
|
|
|
}
|
2021-12-01 00:45:09 +13:00
|
|
|
}
|
|
|
|
dialog.close();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
{
|
|
|
|
let button_settings_similar_images_clear_cache = gui_data.settings.button_settings_similar_images_clear_cache.clone();
|
|
|
|
let settings_window = gui_data.settings.window_settings.clone();
|
|
|
|
let text_view_errors = gui_data.text_view_errors.clone();
|
|
|
|
|
|
|
|
button_settings_similar_images_clear_cache.connect_clicked(move |_| {
|
2023-01-29 06:54:02 +13:00
|
|
|
let dialog = create_clear_cache_dialog(&flg!("cache_clear_similar_images_title"), &settings_window);
|
2022-05-22 20:59:09 +12:00
|
|
|
dialog.show();
|
2021-12-01 00:45:09 +13:00
|
|
|
|
|
|
|
let text_view_errors = text_view_errors.clone();
|
|
|
|
|
|
|
|
dialog.connect_response(move |dialog, response_type| {
|
|
|
|
if response_type == ResponseType::Ok {
|
|
|
|
let mut messages: Messages = Messages::new();
|
2023-01-29 06:54:02 +13:00
|
|
|
for hash_size in &[8, 16, 32, 64] {
|
|
|
|
for image_filter in &[
|
2021-12-22 06:44:20 +13:00
|
|
|
FilterType::Lanczos3,
|
|
|
|
FilterType::CatmullRom,
|
|
|
|
FilterType::Gaussian,
|
|
|
|
FilterType::Nearest,
|
|
|
|
FilterType::Triangle,
|
2023-01-29 06:54:02 +13:00
|
|
|
] {
|
|
|
|
for hash_alg in &[HashAlg::Blockhash, HashAlg::Gradient, HashAlg::DoubleGradient, HashAlg::VertGradient, HashAlg::Mean] {
|
2021-12-01 00:45:09 +13:00
|
|
|
if let Some(cache_entries) = czkawka_core::similar_images::load_hashes_from_file(&mut messages, true, *hash_size, *hash_alg, *image_filter) {
|
2022-01-06 10:47:27 +13:00
|
|
|
czkawka_core::similar_images::save_hashes_to_file(&cache_entries, &mut messages, false, *hash_size, *hash_alg, *image_filter);
|
2021-12-01 00:45:09 +13:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-20 10:35:07 +13:00
|
|
|
messages.messages.push(flg!("cache_properly_cleared"));
|
2022-05-22 20:59:09 +12:00
|
|
|
text_view_errors.buffer().set_text(messages.create_messages_text().as_str());
|
2021-12-01 00:45:09 +13:00
|
|
|
}
|
|
|
|
dialog.close();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
{
|
|
|
|
let button_settings_similar_videos_clear_cache = gui_data.settings.button_settings_similar_videos_clear_cache.clone();
|
|
|
|
let settings_window = gui_data.settings.window_settings.clone();
|
|
|
|
let text_view_errors = gui_data.text_view_errors.clone();
|
|
|
|
|
|
|
|
button_settings_similar_videos_clear_cache.connect_clicked(move |_| {
|
2023-01-29 06:54:02 +13:00
|
|
|
let dialog = create_clear_cache_dialog(&flg!("cache_clear_similar_videos_title"), &settings_window);
|
2022-05-22 20:59:09 +12:00
|
|
|
dialog.show();
|
2021-12-01 00:45:09 +13:00
|
|
|
|
|
|
|
let text_view_errors = text_view_errors.clone();
|
|
|
|
|
|
|
|
dialog.connect_response(move |dialog, response_type| {
|
|
|
|
if response_type == ResponseType::Ok {
|
|
|
|
let mut messages: Messages = Messages::new();
|
|
|
|
if let Some(cache_entries) = czkawka_core::similar_videos::load_hashes_from_file(&mut messages, true) {
|
2022-01-06 10:47:27 +13:00
|
|
|
czkawka_core::similar_videos::save_hashes_to_file(&cache_entries, &mut messages, false);
|
2021-12-01 00:45:09 +13:00
|
|
|
}
|
|
|
|
|
2022-01-20 10:35:07 +13:00
|
|
|
messages.messages.push(flg!("cache_properly_cleared"));
|
2022-05-22 20:59:09 +12:00
|
|
|
text_view_errors.buffer().set_text(messages.create_messages_text().as_str());
|
2021-12-01 00:45:09 +13:00
|
|
|
}
|
|
|
|
dialog.close();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-29 06:54:02 +13:00
|
|
|
fn create_clear_cache_dialog(title_str: &str, window_settings: &Window) -> gtk4::Dialog {
|
|
|
|
let dialog = gtk4::Dialog::builder().title(title_str).modal(true).transient_for(window_settings).build();
|
2022-01-20 10:35:07 +13:00
|
|
|
dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
|
|
|
|
dialog.add_button(&flg!("general_close_button"), ResponseType::Cancel);
|
2021-12-13 00:02:53 +13:00
|
|
|
|
2023-02-19 22:21:14 +13:00
|
|
|
let label = Label::builder().label(flg!("cache_clear_message_label_1")).build();
|
|
|
|
let label2 = Label::builder().label(flg!("cache_clear_message_label_2")).build();
|
|
|
|
let label3 = Label::builder().label(flg!("cache_clear_message_label_3")).build();
|
|
|
|
let label4 = Label::builder().label(flg!("cache_clear_message_label_4")).build();
|
2021-12-01 00:45:09 +13:00
|
|
|
|
|
|
|
let internal_box = get_dialog_box_child(&dialog);
|
2022-05-22 20:59:09 +12:00
|
|
|
internal_box.append(&label);
|
|
|
|
internal_box.append(&label2);
|
|
|
|
internal_box.append(&label3);
|
|
|
|
internal_box.append(&label4);
|
2021-12-01 00:45:09 +13:00
|
|
|
dialog
|
2020-12-08 03:25:44 +13:00
|
|
|
}
|