diff --git a/czkawka_gui/src/connect_button_delete.rs b/czkawka_gui/src/connect_button_delete.rs index c3c494e..5957a4e 100644 --- a/czkawka_gui/src/connect_button_delete.rs +++ b/czkawka_gui/src/connect_button_delete.rs @@ -11,9 +11,9 @@ use std::fs::Metadata; pub fn connect_button_delete(gui_data: &GuiData) { let gui_data = gui_data.clone(); - let buttons_delete = gui_data.buttons_delete.clone(); + let buttons_delete = gui_data.bottom_buttons.buttons_delete.clone(); let tree_view_duplicate_finder = gui_data.main_notebook.tree_view_duplicate_finder.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); let window_main = gui_data.window_main.clone(); let tree_view_empty_folder_finder = gui_data.main_notebook.tree_view_empty_folder_finder.clone(); let tree_view_big_files_finder = gui_data.main_notebook.tree_view_big_files_finder.clone(); @@ -23,8 +23,8 @@ pub fn connect_button_delete(gui_data: &GuiData) { let tree_view_zeroed_files_finder = gui_data.main_notebook.tree_view_zeroed_files_finder.clone(); let tree_view_same_music_finder = gui_data.main_notebook.tree_view_same_music_finder.clone(); let tree_view_invalid_symlinks = gui_data.main_notebook.tree_view_invalid_symlinks.clone(); - let check_button_settings_confirm_deletion = gui_data.check_button_settings_confirm_deletion.clone(); - let image_preview_similar_images = gui_data.image_preview_similar_images.clone(); + let check_button_settings_confirm_deletion = gui_data.upper_notebook.check_button_settings_confirm_deletion.clone(); + let image_preview_similar_images = gui_data.main_notebook.image_preview_similar_images.clone(); buttons_delete.connect_clicked(move |_| { if check_button_settings_confirm_deletion.get_active() { diff --git a/czkawka_gui/src/connect_button_save.rs b/czkawka_gui/src/connect_button_save.rs index f01b908..deaed4b 100644 --- a/czkawka_gui/src/connect_button_save.rs +++ b/czkawka_gui/src/connect_button_save.rs @@ -6,7 +6,7 @@ use gtk::prelude::*; pub fn connect_button_save(gui_data: &GuiData) { let gui_data = gui_data.clone(); - let buttons_save = gui_data.buttons_save.clone(); + let buttons_save = gui_data.bottom_buttons.buttons_save.clone(); let shared_duplication_state = gui_data.shared_duplication_state.clone(); let shared_empty_folders_state = gui_data.shared_empty_folders_state.clone(); let shared_big_files_state = gui_data.shared_big_files_state.clone(); @@ -16,7 +16,7 @@ pub fn connect_button_save(gui_data: &GuiData) { let shared_same_music_state = gui_data.shared_same_music_state.clone(); let shared_zeroed_files_state = gui_data.shared_zeroed_files_state.clone(); let shared_same_invalid_symlinks = gui_data.shared_same_invalid_symlinks.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); buttons_save.connect_clicked(move |_| { let file_name; @@ -72,7 +72,7 @@ pub fn connect_button_save(gui_data: &GuiData) { } fn post_save_things(file_name: &str, type_of_tab: &NotebookMainEnum, gui_data: &GuiData) { let entry_info = gui_data.entry_info.clone(); - let buttons_save = gui_data.buttons_save.clone(); + let buttons_save = gui_data.bottom_buttons.buttons_save.clone(); let shared_buttons = gui_data.shared_buttons.clone(); entry_info.set_text(format!("Saved results to file {}", file_name).as_str()); diff --git a/czkawka_gui/src/connect_button_search.rs b/czkawka_gui/src/connect_button_search.rs index 5e5994a..4ffe496 100644 --- a/czkawka_gui/src/connect_button_search.rs +++ b/czkawka_gui/src/connect_button_search.rs @@ -35,35 +35,35 @@ pub fn connect_button_search( futures_sender_invalid_symlinks: futures::channel::mpsc::Sender, ) { let entry_info = gui_data.entry_info.clone(); - let notebook_main = gui_data.notebook_main.clone(); - let tree_view_included_directories = gui_data.tree_view_included_directories.clone(); - let tree_view_excluded_directories = gui_data.tree_view_excluded_directories.clone(); - let buttons_search_clone = gui_data.buttons_search.clone(); - let buttons_array = gui_data.buttons_array.clone(); - let check_button_recursive = gui_data.check_button_recursive.clone(); - let entry_excluded_items = gui_data.entry_excluded_items.clone(); - let entry_same_music_minimal_size = gui_data.entry_same_music_minimal_size.clone(); - let entry_allowed_extensions = gui_data.entry_allowed_extensions.clone(); - let buttons_names = gui_data.buttons_names.clone(); - let radio_button_duplicates_name = gui_data.radio_button_duplicates_name.clone(); - let radio_button_duplicates_size = gui_data.radio_button_duplicates_size.clone(); - let radio_button_duplicates_hashmb = gui_data.radio_button_duplicates_hashmb.clone(); - let radio_button_duplicates_hash = gui_data.radio_button_duplicates_hash.clone(); - let radio_button_similar_images_minimal = gui_data.radio_button_similar_images_minimal.clone(); - let radio_button_similar_images_very_small = gui_data.radio_button_similar_images_very_small.clone(); - let radio_button_similar_images_small = gui_data.radio_button_similar_images_small.clone(); - let radio_button_similar_images_medium = gui_data.radio_button_similar_images_medium.clone(); - let radio_button_similar_images_high = gui_data.radio_button_similar_images_high.clone(); - let radio_button_similar_images_very_high = gui_data.radio_button_similar_images_very_high.clone(); - let entry_duplicate_minimal_size = gui_data.entry_duplicate_minimal_size.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); + let tree_view_included_directories = gui_data.upper_notebook.tree_view_included_directories.clone(); + let tree_view_excluded_directories = gui_data.upper_notebook.tree_view_excluded_directories.clone(); + let buttons_search_clone = gui_data.bottom_buttons.buttons_search.clone(); + let buttons_array = gui_data.bottom_buttons.buttons_array.clone(); + let check_button_recursive = gui_data.upper_notebook.check_button_recursive.clone(); + let entry_excluded_items = gui_data.upper_notebook.entry_excluded_items.clone(); + let entry_same_music_minimal_size = gui_data.main_notebook.entry_same_music_minimal_size.clone(); + let entry_allowed_extensions = gui_data.upper_notebook.entry_allowed_extensions.clone(); + let buttons_names = gui_data.bottom_buttons.buttons_names.clone(); + let radio_button_duplicates_name = gui_data.main_notebook.radio_button_duplicates_name.clone(); + let radio_button_duplicates_size = gui_data.main_notebook.radio_button_duplicates_size.clone(); + let radio_button_duplicates_hashmb = gui_data.main_notebook.radio_button_duplicates_hashmb.clone(); + let radio_button_duplicates_hash = gui_data.main_notebook.radio_button_duplicates_hash.clone(); + let radio_button_similar_images_minimal = gui_data.main_notebook.radio_button_similar_images_minimal.clone(); + let radio_button_similar_images_very_small = gui_data.main_notebook.radio_button_similar_images_very_small.clone(); + let radio_button_similar_images_small = gui_data.main_notebook.radio_button_similar_images_small.clone(); + let radio_button_similar_images_medium = gui_data.main_notebook.radio_button_similar_images_medium.clone(); + let radio_button_similar_images_high = gui_data.main_notebook.radio_button_similar_images_high.clone(); + let radio_button_similar_images_very_high = gui_data.main_notebook.radio_button_similar_images_very_high.clone(); + let entry_duplicate_minimal_size = gui_data.main_notebook.entry_duplicate_minimal_size.clone(); let stop_receiver = gui_data.stop_receiver.clone(); - let entry_big_files_number = gui_data.entry_big_files_number.clone(); - let entry_similar_images_minimal_size = gui_data.entry_similar_images_minimal_size.clone(); - let check_button_music_title: gtk::CheckButton = gui_data.check_button_music_title.clone(); - let check_button_music_artist: gtk::CheckButton = gui_data.check_button_music_artist.clone(); - let check_button_music_album_title: gtk::CheckButton = gui_data.check_button_music_album_title.clone(); - let check_button_music_album_artist: gtk::CheckButton = gui_data.check_button_music_album_artist.clone(); - let check_button_music_year: gtk::CheckButton = gui_data.check_button_music_year.clone(); + let entry_big_files_number = gui_data.main_notebook.entry_big_files_number.clone(); + let entry_similar_images_minimal_size = gui_data.main_notebook.entry_similar_images_minimal_size.clone(); + let check_button_music_title: gtk::CheckButton = gui_data.main_notebook.check_button_music_title.clone(); + let check_button_music_artist: gtk::CheckButton = gui_data.main_notebook.check_button_music_artist.clone(); + let check_button_music_album_title: gtk::CheckButton = gui_data.main_notebook.check_button_music_album_title.clone(); + let check_button_music_album_artist: gtk::CheckButton = gui_data.main_notebook.check_button_music_album_artist.clone(); + let check_button_music_year: gtk::CheckButton = gui_data.main_notebook.check_button_music_year.clone(); let shared_buttons = gui_data.shared_buttons.clone(); let tree_view_empty_folder_finder = gui_data.main_notebook.tree_view_empty_folder_finder.clone(); let tree_view_empty_files_finder = gui_data.main_notebook.tree_view_empty_files_finder.clone(); @@ -75,12 +75,12 @@ pub fn connect_button_search( let tree_view_zeroed_files_finder = gui_data.main_notebook.tree_view_zeroed_files_finder.clone(); let tree_view_invalid_symlinks = gui_data.main_notebook.tree_view_invalid_symlinks.clone(); let text_view_errors = gui_data.text_view_errors.clone(); - let dialog_progress = gui_data.dialog_progress.clone(); - let label_stage = gui_data.label_stage.clone(); - let grid_progress_stages = gui_data.grid_progress_stages.clone(); - let progress_bar_current_stage = gui_data.progress_bar_current_stage.clone(); - let progress_bar_all_stages = gui_data.progress_bar_all_stages.clone(); - let image_preview_similar_images = gui_data.image_preview_similar_images.clone(); + let dialog_progress = gui_data.progress_dialog.dialog_progress.clone(); + let label_stage = gui_data.progress_dialog.label_stage.clone(); + let grid_progress_stages = gui_data.progress_dialog.grid_progress_stages.clone(); + let progress_bar_current_stage = gui_data.progress_dialog.progress_bar_current_stage.clone(); + let progress_bar_all_stages = gui_data.progress_dialog.progress_bar_all_stages.clone(); + let image_preview_similar_images = gui_data.main_notebook.image_preview_similar_images.clone(); buttons_search_clone.connect_clicked(move |_| { let included_directories = get_string_from_list_store(&tree_view_included_directories); diff --git a/czkawka_gui/src/connect_button_select.rs b/czkawka_gui/src/connect_button_select.rs index 7c99eb1..5fa9234 100644 --- a/czkawka_gui/src/connect_button_select.rs +++ b/czkawka_gui/src/connect_button_select.rs @@ -32,10 +32,10 @@ pub fn connect_button_select(gui_data: &GuiData) { } let gui_data = gui_data.clone(); - let notebook_main = gui_data.notebook_main.clone(); - let buttons_select_clone = gui_data.buttons_select.clone(); - let popover_select = gui_data.popover_select.clone(); - let buttons_select = gui_data.buttons_select.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); + let buttons_select_clone = gui_data.bottom_buttons.buttons_select.clone(); + let popover_select = gui_data.popovers.popover_select.clone(); + let buttons_select = gui_data.bottom_buttons.buttons_select.clone(); buttons_select_clone.connect_clicked(move |_| { show_required_popovers(&gui_data, &to_notebook_main_enum(notebook_main.get_current_page().unwrap()), &hashmap); @@ -45,22 +45,22 @@ pub fn connect_button_select(gui_data: &GuiData) { } fn show_required_popovers(gui_data: &GuiData, current_mode: &NotebookMainEnum, hashmap: &HashMap>) { - let buttons_popover_select_all = gui_data.buttons_popover_select_all.clone(); - let buttons_popover_unselect_all = gui_data.buttons_popover_unselect_all.clone(); - let buttons_popover_reverse = gui_data.buttons_popover_reverse.clone(); - let buttons_popover_select_all_except_oldest = gui_data.buttons_popover_select_all_except_oldest.clone(); - let buttons_popover_select_all_except_newest = gui_data.buttons_popover_select_all_except_newest.clone(); - let buttons_popover_select_one_oldest = gui_data.buttons_popover_select_one_oldest.clone(); - let buttons_popover_select_one_newest = gui_data.buttons_popover_select_one_newest.clone(); - let buttons_popover_select_custom = gui_data.buttons_popover_select_custom.clone(); - let buttons_popover_unselect_custom = gui_data.buttons_popover_unselect_custom.clone(); - let buttons_popover_select_all_images_except_biggest = gui_data.buttons_popover_select_all_images_except_biggest.clone(); - let buttons_popover_select_all_images_except_smallest = gui_data.buttons_popover_select_all_images_except_smallest.clone(); + let buttons_popover_select_all = gui_data.popovers.buttons_popover_select_all.clone(); + let buttons_popover_unselect_all = gui_data.popovers.buttons_popover_unselect_all.clone(); + let buttons_popover_reverse = gui_data.popovers.buttons_popover_reverse.clone(); + let buttons_popover_select_all_except_oldest = gui_data.popovers.buttons_popover_select_all_except_oldest.clone(); + let buttons_popover_select_all_except_newest = gui_data.popovers.buttons_popover_select_all_except_newest.clone(); + let buttons_popover_select_one_oldest = gui_data.popovers.buttons_popover_select_one_oldest.clone(); + let buttons_popover_select_one_newest = gui_data.popovers.buttons_popover_select_one_newest.clone(); + let buttons_popover_select_custom = gui_data.popovers.buttons_popover_select_custom.clone(); + let buttons_popover_unselect_custom = gui_data.popovers.buttons_popover_unselect_custom.clone(); + let buttons_popover_select_all_images_except_biggest = gui_data.popovers.buttons_popover_select_all_images_except_biggest.clone(); + let buttons_popover_select_all_images_except_smallest = gui_data.popovers.buttons_popover_select_all_images_except_smallest.clone(); - let separator_select_custom = gui_data.separator_select_custom.clone(); - let separator_select_date = gui_data.separator_select_date.clone(); - let separator_select_image_size = gui_data.separator_select_image_size.clone(); - let separator_select_reverse = gui_data.separator_select_reverse.clone(); + let separator_select_custom = gui_data.popovers.separator_select_custom.clone(); + let separator_select_date = gui_data.popovers.separator_select_date.clone(); + let separator_select_image_size = gui_data.popovers.separator_select_image_size.clone(); + let separator_select_reverse = gui_data.popovers.separator_select_reverse.clone(); let vec = hashmap.get(current_mode).unwrap(); diff --git a/czkawka_gui/src/connect_button_stop.rs b/czkawka_gui/src/connect_button_stop.rs index eed5f88..64c686b 100644 --- a/czkawka_gui/src/connect_button_stop.rs +++ b/czkawka_gui/src/connect_button_stop.rs @@ -3,7 +3,7 @@ use crate::gui_data::GuiData; use gtk::prelude::*; pub fn connect_button_stop(gui_data: &GuiData) { - let button_stop_in_dialog = gui_data.button_stop_in_dialog.clone(); + let button_stop_in_dialog = gui_data.progress_dialog.button_stop_in_dialog.clone(); let stop_sender = gui_data.stop_sender.clone(); button_stop_in_dialog.connect_clicked(move |_| { stop_sender.send(()).unwrap(); diff --git a/czkawka_gui/src/connect_button_symlink.rs b/czkawka_gui/src/connect_button_symlink.rs index 196fdbf..ff1508e 100644 --- a/czkawka_gui/src/connect_button_symlink.rs +++ b/czkawka_gui/src/connect_button_symlink.rs @@ -9,14 +9,14 @@ use std::fs; pub fn connect_button_symlink(gui_data: &GuiData) { let gui_data = gui_data.clone(); - let buttons_symlink = gui_data.buttons_symlink.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let buttons_symlink = gui_data.bottom_buttons.buttons_symlink.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); let tree_view_duplicate_finder = gui_data.main_notebook.tree_view_duplicate_finder.clone(); let tree_view_similar_images_finder = gui_data.main_notebook.tree_view_similar_images_finder.clone(); let tree_view_same_music_finder = gui_data.main_notebook.tree_view_same_music_finder.clone(); - let image_preview_similar_images = gui_data.image_preview_similar_images.clone(); + let image_preview_similar_images = gui_data.main_notebook.image_preview_similar_images.clone(); buttons_symlink.connect_clicked(move |_| match to_notebook_main_enum(notebook_main.get_current_page().unwrap()) { NotebookMainEnum::Duplicate => { diff --git a/czkawka_gui/src/connect_compute_results.rs b/czkawka_gui/src/connect_compute_results.rs index e4ad460..91c686a 100644 --- a/czkawka_gui/src/connect_compute_results.rs +++ b/czkawka_gui/src/connect_compute_results.rs @@ -11,14 +11,14 @@ use glib::Receiver; use gtk::prelude::*; pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver) { - let buttons_search = gui_data.buttons_search.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let buttons_search = gui_data.bottom_buttons.buttons_search.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); let entry_info = gui_data.entry_info.clone(); let tree_view_empty_folder_finder = gui_data.main_notebook.tree_view_empty_folder_finder.clone(); let tree_view_empty_files_finder = gui_data.main_notebook.tree_view_empty_files_finder.clone(); let tree_view_duplicate_finder = gui_data.main_notebook.tree_view_duplicate_finder.clone(); let tree_view_similar_images_finder = gui_data.main_notebook.tree_view_similar_images_finder.clone(); - let buttons_array = gui_data.buttons_array.clone(); + let buttons_array = gui_data.bottom_buttons.buttons_array.clone(); let text_view_errors = gui_data.text_view_errors.clone(); let shared_duplication_state = gui_data.shared_duplication_state.clone(); let shared_buttons = gui_data.shared_buttons.clone(); @@ -35,8 +35,8 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< let shared_zeroed_files_state = gui_data.shared_zeroed_files_state.clone(); let tree_view_same_music_finder = gui_data.main_notebook.tree_view_same_music_finder.clone(); let shared_same_music_state = gui_data.shared_same_music_state.clone(); - let buttons_names = gui_data.buttons_names.clone(); - let dialog_progress = gui_data.dialog_progress.clone(); + let buttons_names = gui_data.bottom_buttons.buttons_names.clone(); + let dialog_progress = gui_data.progress_dialog.dialog_progress.clone(); glib_stop_receiver.attach(None, move |msg| { buttons_search.show(); diff --git a/czkawka_gui/src/connect_hide_text_view_errors.rs b/czkawka_gui/src/connect_hide_text_view_errors.rs index 02e1c89..b40e77a 100644 --- a/czkawka_gui/src/connect_hide_text_view_errors.rs +++ b/czkawka_gui/src/connect_hide_text_view_errors.rs @@ -3,8 +3,8 @@ use crate::gui_data::GuiData; use gtk::prelude::*; pub fn connect_hide_text_view_errors(gui_data: &GuiData) { - let check_button_settings_show_text_view = gui_data.check_button_settings_show_text_view.clone(); - let buttons_show_errors = gui_data.buttons_show_errors.clone(); + let check_button_settings_show_text_view = gui_data.upper_notebook.check_button_settings_show_text_view.clone(); + let buttons_show_errors = gui_data.bottom_buttons.buttons_show_errors.clone(); let scrolled_window_errors = gui_data.scrolled_window_errors.clone(); buttons_show_errors.connect_clicked(move |_| { diff --git a/czkawka_gui/src/connect_notebook_tabs.rs b/czkawka_gui/src/connect_notebook_tabs.rs index 9aa9083..d5b3a9a 100644 --- a/czkawka_gui/src/connect_notebook_tabs.rs +++ b/czkawka_gui/src/connect_notebook_tabs.rs @@ -6,11 +6,11 @@ use gtk::prelude::*; pub fn connect_notebook_tabs(gui_data: &GuiData) { let shared_buttons = gui_data.shared_buttons.clone(); - let buttons_array = gui_data.buttons_array.clone(); - let notebook_main_clone = gui_data.notebook_main.clone(); - let buttons_names = gui_data.buttons_names.clone(); + let buttons_array = gui_data.bottom_buttons.buttons_array.clone(); + let notebook_main_clone = gui_data.main_notebook.notebook_main.clone(); + let buttons_names = gui_data.bottom_buttons.buttons_names.clone(); let shared_upper_notebooks = gui_data.shared_upper_notebooks.clone(); - let notebook_upper = gui_data.notebook_upper.clone(); + let notebook_upper = gui_data.upper_notebook.notebook_upper.clone(); notebook_main_clone.connect_switch_page(move |_, _, number| { let current_tab_in_main_notebook = to_notebook_main_enum(number); diff --git a/czkawka_gui/src/connect_popovers.rs b/czkawka_gui/src/connect_popovers.rs index cbf7532..6ebfb4e 100644 --- a/czkawka_gui/src/connect_popovers.rs +++ b/czkawka_gui/src/connect_popovers.rs @@ -763,36 +763,36 @@ pub fn connect_popovers(gui_data: &GuiData) { }, ]; - let popover_select = gui_data.popover_select.clone(); - let buttons_popover_select_all = gui_data.buttons_popover_select_all.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let popover_select = gui_data.popovers.popover_select.clone(); + let buttons_popover_select_all = gui_data.popovers.buttons_popover_select_all.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); let vec_popover_objects = popover_objects.clone(); buttons_popover_select_all.connect_clicked(move |_| { let object_popover = find_name(&to_notebook_main_enum(notebook_main.get_current_page().unwrap()), &vec_popover_objects).unwrap(); popover_select_all(&popover_select, &object_popover.tree_view); }); - let popover_select = gui_data.popover_select.clone(); - let buttons_popover_unselect_all = gui_data.buttons_popover_unselect_all.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let popover_select = gui_data.popovers.popover_select.clone(); + let buttons_popover_unselect_all = gui_data.popovers.buttons_popover_unselect_all.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); let vec_popover_objects = popover_objects.clone(); buttons_popover_unselect_all.connect_clicked(move |_| { let object_popover = find_name(&to_notebook_main_enum(notebook_main.get_current_page().unwrap()), &vec_popover_objects).unwrap(); popover_unselect_all(&popover_select, &object_popover.tree_view); }); - let popover_select = gui_data.popover_select.clone(); - let buttons_popover_reverse = gui_data.buttons_popover_reverse.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let popover_select = gui_data.popovers.popover_select.clone(); + let buttons_popover_reverse = gui_data.popovers.buttons_popover_reverse.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); let vec_popover_objects = popover_objects.clone(); buttons_popover_reverse.connect_clicked(move |_| { let object_popover = find_name(&to_notebook_main_enum(notebook_main.get_current_page().unwrap()), &vec_popover_objects).unwrap(); popover_reverse(&popover_select, &object_popover.tree_view); }); - let popover_select = gui_data.popover_select.clone(); - let buttons_popover_select_all_except_oldest = gui_data.buttons_popover_select_all_except_oldest.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let popover_select = gui_data.popovers.popover_select.clone(); + let buttons_popover_select_all_except_oldest = gui_data.popovers.buttons_popover_select_all_except_oldest.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); let vec_popover_objects = popover_objects.clone(); buttons_popover_select_all_except_oldest.connect_clicked(move |_| { let object_popover = find_name(&to_notebook_main_enum(notebook_main.get_current_page().unwrap()), &vec_popover_objects).unwrap(); @@ -805,9 +805,9 @@ pub fn connect_popovers(gui_data: &GuiData) { ); }); - let popover_select = gui_data.popover_select.clone(); - let buttons_popover_select_all_except_newest = gui_data.buttons_popover_select_all_except_newest.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let popover_select = gui_data.popovers.popover_select.clone(); + let buttons_popover_select_all_except_newest = gui_data.popovers.buttons_popover_select_all_except_newest.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); let vec_popover_objects = popover_objects.clone(); buttons_popover_select_all_except_newest.connect_clicked(move |_| { let object_popover = find_name(&to_notebook_main_enum(notebook_main.get_current_page().unwrap()), &vec_popover_objects).unwrap(); @@ -820,9 +820,9 @@ pub fn connect_popovers(gui_data: &GuiData) { ); }); - let popover_select = gui_data.popover_select.clone(); - let buttons_popover_select_one_oldest = gui_data.buttons_popover_select_one_oldest.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let popover_select = gui_data.popovers.popover_select.clone(); + let buttons_popover_select_one_oldest = gui_data.popovers.buttons_popover_select_one_oldest.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); let vec_popover_objects = popover_objects.clone(); buttons_popover_select_one_oldest.connect_clicked(move |_| { let object_popover = find_name(&to_notebook_main_enum(notebook_main.get_current_page().unwrap()), &vec_popover_objects).unwrap(); @@ -835,9 +835,9 @@ pub fn connect_popovers(gui_data: &GuiData) { ); }); - let popover_select = gui_data.popover_select.clone(); - let buttons_popover_select_one_newest = gui_data.buttons_popover_select_one_newest.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let popover_select = gui_data.popovers.popover_select.clone(); + let buttons_popover_select_one_newest = gui_data.popovers.buttons_popover_select_one_newest.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); let vec_popover_objects = popover_objects.clone(); buttons_popover_select_one_newest.connect_clicked(move |_| { let object_popover = find_name(&to_notebook_main_enum(notebook_main.get_current_page().unwrap()), &vec_popover_objects).unwrap(); @@ -850,9 +850,9 @@ pub fn connect_popovers(gui_data: &GuiData) { ); }); - let popover_select = gui_data.popover_select.clone(); - let buttons_popover_select_custom = gui_data.buttons_popover_select_custom.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let popover_select = gui_data.popovers.popover_select.clone(); + let buttons_popover_select_custom = gui_data.popovers.buttons_popover_select_custom.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); let vec_popover_objects = popover_objects.clone(); let gui_data_clone = gui_data.clone(); buttons_popover_select_custom.connect_clicked(move |_| { @@ -867,9 +867,9 @@ pub fn connect_popovers(gui_data: &GuiData) { ); }); - let popover_select = gui_data.popover_select.clone(); - let buttons_popover_unselect_custom = gui_data.buttons_popover_unselect_custom.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let popover_select = gui_data.popovers.popover_select.clone(); + let buttons_popover_unselect_custom = gui_data.popovers.buttons_popover_unselect_custom.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); let vec_popover_objects = popover_objects.clone(); let gui_data_clone = gui_data.clone(); buttons_popover_unselect_custom.connect_clicked(move |_| { @@ -884,9 +884,9 @@ pub fn connect_popovers(gui_data: &GuiData) { ); }); - let popover_select = gui_data.popover_select.clone(); - let buttons_popover_select_all_images_except_biggest = gui_data.buttons_popover_select_all_images_except_biggest.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let popover_select = gui_data.popovers.popover_select.clone(); + let buttons_popover_select_all_images_except_biggest = gui_data.popovers.buttons_popover_select_all_images_except_biggest.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); let vec_popover_objects = popover_objects.clone(); buttons_popover_select_all_images_except_biggest.connect_clicked(move |_| { let object_popover = find_name(&to_notebook_main_enum(notebook_main.get_current_page().unwrap()), &vec_popover_objects).unwrap(); @@ -899,9 +899,9 @@ pub fn connect_popovers(gui_data: &GuiData) { ); }); - let popover_select = gui_data.popover_select.clone(); - let buttons_popover_select_all_images_except_smallest = gui_data.buttons_popover_select_all_images_except_smallest.clone(); - let notebook_main = gui_data.notebook_main.clone(); + let popover_select = gui_data.popovers.popover_select.clone(); + let buttons_popover_select_all_images_except_smallest = gui_data.popovers.buttons_popover_select_all_images_except_smallest.clone(); + let notebook_main = gui_data.main_notebook.notebook_main.clone(); let vec_popover_objects = popover_objects; //.clone(); buttons_popover_select_all_images_except_smallest.connect_clicked(move |_| { let object_popover = find_name(&to_notebook_main_enum(notebook_main.get_current_page().unwrap()), &vec_popover_objects).unwrap(); diff --git a/czkawka_gui/src/connect_progress_window.rs b/czkawka_gui/src/connect_progress_window.rs index 42a7a57..2bbbe7d 100644 --- a/czkawka_gui/src/connect_progress_window.rs +++ b/czkawka_gui/src/connect_progress_window.rs @@ -22,10 +22,10 @@ pub fn connect_progress_window( { // Duplicate Files - let label_stage = gui_data.label_stage.clone(); - let progress_bar_current_stage = gui_data.progress_bar_current_stage.clone(); - let progress_bar_all_stages = gui_data.progress_bar_all_stages.clone(); - let grid_progress_stages = gui_data.grid_progress_stages.clone(); + let label_stage = gui_data.progress_dialog.label_stage.clone(); + let progress_bar_current_stage = gui_data.progress_dialog.progress_bar_current_stage.clone(); + let progress_bar_all_stages = gui_data.progress_dialog.progress_bar_all_stages.clone(); + let grid_progress_stages = gui_data.progress_dialog.grid_progress_stages.clone(); let future = async move { while let Some(item) = futures_receiver_duplicate_files.next().await { match item.checking_method { @@ -90,7 +90,7 @@ pub fn connect_progress_window( } { // Empty Files - let label_stage = gui_data.label_stage.clone(); + let label_stage = gui_data.progress_dialog.label_stage.clone(); let future = async move { while let Some(item) = futures_receiver_empty_files.next().await { label_stage.set_text(format!("Scanned {} files", item.files_checked).as_str()); @@ -100,7 +100,7 @@ pub fn connect_progress_window( } { // Empty Folder - let label_stage = gui_data.label_stage.clone(); + let label_stage = gui_data.progress_dialog.label_stage.clone(); let future = async move { while let Some(item) = futures_receiver_empty_folder.next().await { label_stage.set_text(format!("Scanned {} folders", item.folders_checked).as_str()); @@ -110,7 +110,7 @@ pub fn connect_progress_window( } { // Big Files - let label_stage = gui_data.label_stage.clone(); + let label_stage = gui_data.progress_dialog.label_stage.clone(); let future = async move { while let Some(item) = futures_receiver_big_files.next().await { label_stage.set_text(format!("Scanned {} files", item.files_checked).as_str()); @@ -120,9 +120,9 @@ pub fn connect_progress_window( } { // Same Music - let label_stage = gui_data.label_stage.clone(); - let progress_bar_current_stage = gui_data.progress_bar_current_stage.clone(); - let progress_bar_all_stages = gui_data.progress_bar_all_stages.clone(); + let label_stage = gui_data.progress_dialog.label_stage.clone(); + let progress_bar_current_stage = gui_data.progress_dialog.progress_bar_current_stage.clone(); + let progress_bar_all_stages = gui_data.progress_dialog.progress_bar_all_stages.clone(); let future = async move { while let Some(item) = futures_receiver_same_music.next().await { match item.current_stage { @@ -161,9 +161,9 @@ pub fn connect_progress_window( } { // Similar Images - let label_stage = gui_data.label_stage.clone(); - let progress_bar_current_stage = gui_data.progress_bar_current_stage.clone(); - let progress_bar_all_stages = gui_data.progress_bar_all_stages.clone(); + let label_stage = gui_data.progress_dialog.label_stage.clone(); + let progress_bar_current_stage = gui_data.progress_dialog.progress_bar_current_stage.clone(); + let progress_bar_all_stages = gui_data.progress_dialog.progress_bar_all_stages.clone(); let future = async move { while let Some(item) = futures_receiver_similar_images.next().await { match item.current_stage { @@ -192,7 +192,7 @@ pub fn connect_progress_window( } { // Temporary - let label_stage = gui_data.label_stage.clone(); + let label_stage = gui_data.progress_dialog.label_stage.clone(); let future = async move { while let Some(item) = futures_receiver_temporary.next().await { label_stage.set_text(format!("Scanned {} files", item.files_checked).as_str()); @@ -202,9 +202,9 @@ pub fn connect_progress_window( } { // Zeroed Files - let label_stage = gui_data.label_stage.clone(); - let progress_bar_current_stage = gui_data.progress_bar_current_stage.clone(); - let progress_bar_all_stages = gui_data.progress_bar_all_stages.clone(); + let label_stage = gui_data.progress_dialog.label_stage.clone(); + let progress_bar_current_stage = gui_data.progress_dialog.progress_bar_current_stage.clone(); + let progress_bar_all_stages = gui_data.progress_dialog.progress_bar_all_stages.clone(); let future = async move { while let Some(item) = futures_receiver_zeroed.next().await { match item.current_stage { @@ -233,7 +233,7 @@ pub fn connect_progress_window( } { // Invalid Symlinks - let label_stage = gui_data.label_stage.clone(); + let label_stage = gui_data.progress_dialog.label_stage.clone(); let future = async move { while let Some(item) = futures_receiver_invalid_symlinks.next().await { label_stage.set_text(format!("Scanned {} files", item.files_checked).as_str()); diff --git a/czkawka_gui/src/connect_selection_of_directories.rs b/czkawka_gui/src/connect_selection_of_directories.rs index 4fd7236..561dc72 100644 --- a/czkawka_gui/src/connect_selection_of_directories.rs +++ b/czkawka_gui/src/connect_selection_of_directories.rs @@ -9,9 +9,9 @@ use czkawka_core::common::Common; pub fn connect_selection_of_directories(gui_data: &GuiData) { // Add manually directory { - let tree_view_included_directories = gui_data.tree_view_included_directories.clone(); + let tree_view_included_directories = gui_data.upper_notebook.tree_view_included_directories.clone(); let window_main = gui_data.window_main.clone(); - let buttons_manual_add_directory = gui_data.buttons_manual_add_directory.clone(); + let buttons_manual_add_directory = gui_data.upper_notebook.buttons_manual_add_directory.clone(); buttons_manual_add_directory.connect_clicked(move |_| { let dialog_manual_add_directory = gtk::Dialog::with_buttons(Some("Add directory manually"), Some(&window_main), gtk::DialogFlags::MODAL, &[("Ok", gtk::ResponseType::Ok), ("Close", gtk::ResponseType::Cancel)]); let entry: gtk::Entry = gtk::Entry::new(); @@ -47,9 +47,9 @@ pub fn connect_selection_of_directories(gui_data: &GuiData) { } // Add manually excluded directory { - let tree_view_excluded_directories = gui_data.tree_view_excluded_directories.clone(); + let tree_view_excluded_directories = gui_data.upper_notebook.tree_view_excluded_directories.clone(); let window_main = gui_data.window_main.clone(); - let buttons_manual_add_excluded_directory = gui_data.buttons_manual_add_excluded_directory.clone(); + let buttons_manual_add_excluded_directory = gui_data.upper_notebook.buttons_manual_add_excluded_directory.clone(); buttons_manual_add_excluded_directory.connect_clicked(move |_| { let dialog_manual_add_directory = gtk::Dialog::with_buttons( Some("Add excluded directory manually"), @@ -90,9 +90,9 @@ pub fn connect_selection_of_directories(gui_data: &GuiData) { } // Add included directory { - let tree_view_included_directories = gui_data.tree_view_included_directories.clone(); + let tree_view_included_directories = gui_data.upper_notebook.tree_view_included_directories.clone(); let window_main = gui_data.window_main.clone(); - let buttons_add_included_directory = gui_data.buttons_add_included_directory.clone(); + let buttons_add_included_directory = gui_data.upper_notebook.buttons_add_included_directory.clone(); buttons_add_included_directory.connect_clicked(move |_| { let chooser = gtk::FileChooserDialog::with_buttons( Some("Folders to include"), @@ -119,9 +119,9 @@ pub fn connect_selection_of_directories(gui_data: &GuiData) { } // Add excluded directory { - let tree_view_excluded_directories = gui_data.tree_view_excluded_directories.clone(); + let tree_view_excluded_directories = gui_data.upper_notebook.tree_view_excluded_directories.clone(); let window_main = gui_data.window_main.clone(); - let buttons_add_excluded_directory = gui_data.buttons_add_excluded_directory.clone(); + let buttons_add_excluded_directory = gui_data.upper_notebook.buttons_add_excluded_directory.clone(); buttons_add_excluded_directory.connect_clicked(move |_| { let chooser = gtk::FileChooserDialog::with_buttons( Some("Folders to exclude"), @@ -149,8 +149,8 @@ pub fn connect_selection_of_directories(gui_data: &GuiData) { } // Remove Excluded Folder { - let buttons_remove_excluded_directory = gui_data.buttons_remove_excluded_directory.clone(); - let tree_view_excluded_directories = gui_data.tree_view_excluded_directories.clone(); + let buttons_remove_excluded_directory = gui_data.upper_notebook.buttons_remove_excluded_directory.clone(); + let tree_view_excluded_directories = gui_data.upper_notebook.tree_view_excluded_directories.clone(); buttons_remove_excluded_directory.connect_clicked(move |_| { let list_store = get_list_store(&tree_view_excluded_directories); let selection = tree_view_excluded_directories.get_selection(); @@ -164,8 +164,8 @@ pub fn connect_selection_of_directories(gui_data: &GuiData) { } // Remove Included Folder { - let buttons_remove_included_directory = gui_data.buttons_remove_included_directory.clone(); - let tree_view_included_directories = gui_data.tree_view_included_directories.clone(); + let buttons_remove_included_directory = gui_data.upper_notebook.buttons_remove_included_directory.clone(); + let tree_view_included_directories = gui_data.upper_notebook.tree_view_included_directories.clone(); buttons_remove_included_directory.connect_clicked(move |_| { let list_store = get_list_store(&tree_view_included_directories); let selection = tree_view_included_directories.get_selection(); diff --git a/czkawka_gui/src/connect_settings.rs b/czkawka_gui/src/connect_settings.rs index 603c846..025546c 100644 --- a/czkawka_gui/src/connect_settings.rs +++ b/czkawka_gui/src/connect_settings.rs @@ -7,7 +7,7 @@ pub fn connect_settings(gui_data: &GuiData) { // Connect save configuration button { let gui_data = gui_data.clone(); - let button_settings_save_configuration = gui_data.button_settings_save_configuration.clone(); + let button_settings_save_configuration = gui_data.upper_notebook.button_settings_save_configuration.clone(); button_settings_save_configuration.connect_clicked(move |_| { save_configuration(&gui_data, true); }); @@ -15,7 +15,7 @@ pub fn connect_settings(gui_data: &GuiData) { // Connect load configuration button { let gui_data = gui_data.clone(); - let button_settings_load_configuration = gui_data.button_settings_load_configuration.clone(); + let button_settings_load_configuration = gui_data.upper_notebook.button_settings_load_configuration.clone(); button_settings_load_configuration.connect_clicked(move |_| { load_configuration(&gui_data, true); }); @@ -23,7 +23,7 @@ pub fn connect_settings(gui_data: &GuiData) { // Connect reset configuration button { let gui_data = gui_data.clone(); - let button_settings_reset_configuration = gui_data.button_settings_reset_configuration.clone(); + let button_settings_reset_configuration = gui_data.upper_notebook.button_settings_reset_configuration.clone(); button_settings_reset_configuration.connect_clicked(move |_| { reset_configuration(&gui_data, true); }); diff --git a/czkawka_gui/src/gui_bottom_buttons.rs b/czkawka_gui/src/gui_bottom_buttons.rs new file mode 100644 index 0000000..6dc4e7e --- /dev/null +++ b/czkawka_gui/src/gui_bottom_buttons.rs @@ -0,0 +1,39 @@ +use gtk::prelude::*; +use gtk::Button; + +#[derive(Clone)] +pub struct GUIBottomButtons { + pub buttons_search: gtk::Button, + pub buttons_select: gtk::Button, + pub buttons_delete: gtk::Button, + pub buttons_save: gtk::Button, + pub buttons_symlink: gtk::Button, + pub buttons_show_errors: gtk::Button, + pub buttons_names: [String; 5], + pub buttons_array: [Button; 5], +} + +impl GUIBottomButtons { + pub fn create_from_builder(builder: >k::Builder) -> Self { + let buttons_search: gtk::Button = builder.get_object("buttons_search").unwrap(); + let buttons_select: gtk::Button = builder.get_object("buttons_select").unwrap(); + let buttons_delete: gtk::Button = builder.get_object("buttons_delete").unwrap(); + let buttons_save: gtk::Button = builder.get_object("buttons_save").unwrap(); + let buttons_symlink: gtk::Button = builder.get_object("buttons_symlink").unwrap(); + + let buttons_show_errors: gtk::Button = builder.get_object("buttons_show_errors").unwrap(); + + let buttons_names = ["search".to_string(), "select".to_string(), "delete".to_string(), "save".to_string(), "symlink".to_string()]; + let buttons_array = [buttons_search.clone(), buttons_select.clone(), buttons_delete.clone(), buttons_save.clone(), buttons_symlink.clone()]; + Self { + buttons_search, + buttons_select, + buttons_delete, + buttons_save, + buttons_symlink, + buttons_show_errors, + buttons_names, + buttons_array, + } + } +} diff --git a/czkawka_gui/src/gui_data.rs b/czkawka_gui/src/gui_data.rs index 78dd1ff..e5124f5 100644 --- a/czkawka_gui/src/gui_data.rs +++ b/czkawka_gui/src/gui_data.rs @@ -1,5 +1,9 @@ extern crate gtk; +use crate::gui_bottom_buttons::GUIBottomButtons; use crate::gui_main_notebook::GUIMainNotebook; +use crate::gui_popovers::GUIPopovers; +use crate::gui_progress_dialog::GUIProgressDialog; +use crate::gui_upper_notepad::GUIUpperNotebook; use crate::notebook_enums::*; use crossbeam_channel::unbounded; use czkawka_core::big_file::BigFile; @@ -12,7 +16,7 @@ use czkawka_core::similar_images::SimilarImages; use czkawka_core::temporary::Temporary; use czkawka_core::zeroed::ZeroedFiles; use gtk::prelude::*; -use gtk::{Builder, Button, TreeView}; +use gtk::Builder; use std::cell::RefCell; use std::collections::HashMap; use std::rc::Rc; @@ -27,9 +31,10 @@ pub struct GuiData { pub window_main: gtk::Window, pub main_notebook: GUIMainNotebook, - - // States - pub buttons_labels: [String; 5], + pub upper_notebook: GUIUpperNotebook, + pub popovers: GUIPopovers, + pub bottom_buttons: GUIBottomButtons, + pub progress_dialog: GUIProgressDialog, // Buttons state pub shared_buttons: Rc>>>, @@ -48,128 +53,13 @@ pub struct GuiData { pub shared_same_music_state: Rc>, pub shared_same_invalid_symlinks: Rc>, - //// GUI Entry - pub entry_similar_images_minimal_size: gtk::Entry, - pub entry_duplicate_minimal_size: gtk::Entry, - pub entry_allowed_extensions: gtk::Entry, - pub entry_excluded_items: gtk::Entry, - pub entry_big_files_number: gtk::Entry, - pub entry_same_music_minimal_size: gtk::Entry, - - //// GUI Buttons - pub buttons_search: gtk::Button, - pub buttons_select: gtk::Button, - pub buttons_delete: gtk::Button, - pub buttons_save: gtk::Button, - pub buttons_symlink: gtk::Button, - pub buttons_show_errors: gtk::Button, - pub buttons_names: [String; 5], - pub buttons_array: [Button; 5], - - pub buttons_manual_add_directory: gtk::Button, - pub buttons_add_included_directory: gtk::Button, - pub buttons_remove_included_directory: gtk::Button, - pub buttons_manual_add_excluded_directory: gtk::Button, - pub buttons_add_excluded_directory: gtk::Button, - pub buttons_remove_excluded_directory: gtk::Button, - - // Buttons search popover buttons - pub buttons_popover_select_all: gtk::Button, - pub buttons_popover_unselect_all: gtk::Button, - pub buttons_popover_reverse: gtk::Button, - pub buttons_popover_select_all_except_oldest: gtk::Button, - pub buttons_popover_select_all_except_newest: gtk::Button, - pub buttons_popover_select_one_oldest: gtk::Button, - pub buttons_popover_select_one_newest: gtk::Button, - pub buttons_popover_select_custom: gtk::Button, - pub buttons_popover_unselect_custom: gtk::Button, - pub buttons_popover_select_all_images_except_biggest: gtk::Button, - pub buttons_popover_select_all_images_except_smallest: gtk::Button, - - pub separator_select_image_size: gtk::Separator, - pub separator_select_reverse: gtk::Separator, - pub separator_select_date: gtk::Separator, - pub separator_select_custom: gtk::Separator, - - pub buttons_popover_right_click_open_file: gtk::Button, - pub buttons_popover_right_click_open_folder: gtk::Button, - - //// Popovers - pub popover_select: gtk::Popover, - pub popover_right_click: gtk::Popover, - - //// Check Buttons - pub check_button_recursive: gtk::CheckButton, - - pub check_button_music_title: gtk::CheckButton, - pub check_button_music_artist: gtk::CheckButton, - pub check_button_music_album_title: gtk::CheckButton, - pub check_button_music_album_artist: gtk::CheckButton, - pub check_button_music_year: gtk::CheckButton, - - //// Radio Buttons - // Duplicates - pub radio_button_duplicates_name: gtk::RadioButton, - pub radio_button_duplicates_size: gtk::RadioButton, - pub radio_button_duplicates_hashmb: gtk::RadioButton, - pub radio_button_duplicates_hash: gtk::RadioButton, - - pub radio_button_similar_images_minimal: gtk::RadioButton, - pub radio_button_similar_images_very_small: gtk::RadioButton, - pub radio_button_similar_images_small: gtk::RadioButton, - pub radio_button_similar_images_medium: gtk::RadioButton, - pub radio_button_similar_images_high: gtk::RadioButton, - pub radio_button_similar_images_very_high: gtk::RadioButton, - - //// Notebooks - pub notebook_main: gtk::Notebook, - pub notebook_upper: gtk::Notebook, - - pub notebook_upper_children_names: Vec, - //// Entry - pub entry_info: gtk::Entry, // To show default + pub entry_info: gtk::Entry, //// Bottom pub text_view_errors: gtk::TextView, pub scrolled_window_errors: gtk::ScrolledWindow, - //// Scrolled windows - - // Upper notebook - pub scrolled_window_included_directories: gtk::ScrolledWindow, - pub scrolled_window_excluded_directories: gtk::ScrolledWindow, - - pub tree_view_included_directories: gtk::TreeView, - pub tree_view_excluded_directories: gtk::TreeView, - - //// Dialog State - dialog with progress state, which allows to stop task - pub dialog_progress: gtk::Dialog, - - pub progress_bar_current_stage: gtk::ProgressBar, - pub progress_bar_all_stages: gtk::ProgressBar, - - pub label_stage: gtk::Label, - - pub grid_progress_stages: gtk::Grid, - - pub button_stop_in_dialog: gtk::Button, - - //// Similar Images - pub image_preview_similar_images: gtk::Image, - - //// Settings - pub check_button_settings_save_at_exit: gtk::CheckButton, - pub check_button_settings_load_at_start: gtk::CheckButton, - pub check_button_settings_confirm_deletion: gtk::CheckButton, - pub check_button_settings_show_preview_similar_images: gtk::CheckButton, - pub check_button_settings_show_text_view: gtk::CheckButton, - - pub button_settings_save_configuration: gtk::Button, - pub button_settings_load_configuration: gtk::Button, - pub button_settings_reset_configuration: gtk::Button, - //// Threads - // Used for sending stop signal to thread pub stop_sender: crossbeam_channel::Sender<()>, pub stop_receiver: crossbeam_channel::Receiver<()>, @@ -187,23 +77,24 @@ impl GuiData { window_main.set_title("Czkawka"); let main_notebook = GUIMainNotebook::create_from_builder(&builder); + let upper_notebook = GUIUpperNotebook::create_from_builder(&builder); + let popovers = GUIPopovers::create_from_builder(&builder); + let bottom_buttons = GUIBottomButtons::create_from_builder(&builder); + let progress_dialog = GUIProgressDialog::create_from_builder(&builder); //////////////////////////////////////////////////////////////////////////////////////////////// - //// States - let buttons_labels = ["search".to_string(), "select".to_string(), "delete".to_string(), "save".to_string(), "symlink".to_string()]; // Buttons State - to remember existence of different buttons on pages - let shared_buttons: Rc> = Rc::new(RefCell::new(HashMap::>::new())); // Show by default only search button for i in get_all_main_tabs().iter() { let mut temp_hashmap: HashMap = Default::default(); - for j in buttons_labels.iter() { - if *j == "search" { - temp_hashmap.insert(j.to_string(), true); + for button_name in bottom_buttons.buttons_names.iter() { + if *button_name == "search" { + temp_hashmap.insert(button_name.to_string(), true); } else { - temp_hashmap.insert(j.to_string(), false); + temp_hashmap.insert(button_name.to_string(), false); } } shared_buttons.borrow_mut().insert(i.clone(), temp_hashmap); @@ -234,91 +125,6 @@ impl GuiData { let shared_same_music_state: Rc> = Rc::new(RefCell::new(SameMusic::new())); let shared_same_invalid_symlinks: Rc> = Rc::new(RefCell::new(InvalidSymlinks::new())); - //////////////////////////////////////////////////////////////////////////////////////////////// - - //// GUI Entry - let entry_similar_images_minimal_size: gtk::Entry = builder.get_object("entry_similar_images_minimal_size").unwrap(); - let entry_duplicate_minimal_size: gtk::Entry = builder.get_object("entry_duplicate_minimal_size").unwrap(); - let entry_allowed_extensions: gtk::Entry = builder.get_object("entry_allowed_extensions").unwrap(); - let entry_excluded_items: gtk::Entry = builder.get_object("entry_excluded_items").unwrap(); - let entry_big_files_number: gtk::Entry = builder.get_object("entry_big_files_number").unwrap(); - let entry_same_music_minimal_size: gtk::Entry = builder.get_object("entry_same_music_minimal_size").unwrap(); - - //// GUI Buttons - let buttons_search: gtk::Button = builder.get_object("buttons_search").unwrap(); - let buttons_select: gtk::Button = builder.get_object("buttons_select").unwrap(); - let buttons_delete: gtk::Button = builder.get_object("buttons_delete").unwrap(); - let buttons_save: gtk::Button = builder.get_object("buttons_save").unwrap(); - let buttons_symlink: gtk::Button = builder.get_object("buttons_symlink").unwrap(); - - let buttons_show_errors: gtk::Button = builder.get_object("buttons_show_errors").unwrap(); - - let buttons_names = ["search".to_string(), "select".to_string(), "delete".to_string(), "save".to_string(), "symlink".to_string()]; - let buttons_array = [buttons_search.clone(), buttons_select.clone(), buttons_delete.clone(), buttons_save.clone(), buttons_symlink.clone()]; - - let buttons_manual_add_directory: gtk::Button = builder.get_object("buttons_manual_add_directory").unwrap(); - let buttons_add_included_directory: gtk::Button = builder.get_object("buttons_add_included_directory").unwrap(); - let buttons_remove_included_directory: gtk::Button = builder.get_object("buttons_remove_included_directory").unwrap(); - let buttons_manual_add_excluded_directory: gtk::Button = builder.get_object("buttons_manual_add_excluded_directory").unwrap(); - let buttons_add_excluded_directory: gtk::Button = builder.get_object("buttons_add_excluded_directory").unwrap(); - let buttons_remove_excluded_directory: gtk::Button = builder.get_object("buttons_remove_excluded_directory").unwrap(); - - // Buttons search popover buttons - let buttons_popover_select_all: gtk::Button = builder.get_object("buttons_popover_select_all").unwrap(); - let buttons_popover_unselect_all: gtk::Button = builder.get_object("buttons_popover_unselect_all").unwrap(); - let buttons_popover_reverse: gtk::Button = builder.get_object("buttons_popover_reverse").unwrap(); - let buttons_popover_select_all_except_oldest: gtk::Button = builder.get_object("buttons_popover_select_all_except_oldest").unwrap(); - let buttons_popover_select_all_except_newest: gtk::Button = builder.get_object("buttons_popover_select_all_except_newest").unwrap(); - let buttons_popover_select_one_oldest: gtk::Button = builder.get_object("buttons_popover_select_one_oldest").unwrap(); - let buttons_popover_select_one_newest: gtk::Button = builder.get_object("buttons_popover_select_one_newest").unwrap(); - let buttons_popover_select_custom: gtk::Button = builder.get_object("buttons_popover_select_custom").unwrap(); - let buttons_popover_unselect_custom: gtk::Button = builder.get_object("buttons_popover_unselect_custom").unwrap(); - let buttons_popover_select_all_images_except_biggest: gtk::Button = builder.get_object("buttons_popover_select_all_images_except_biggest").unwrap(); - let buttons_popover_select_all_images_except_smallest: gtk::Button = builder.get_object("buttons_popover_select_all_images_except_smallest").unwrap(); - - let separator_select_image_size: gtk::Separator = builder.get_object("separator_select_image_size").unwrap(); - let separator_select_reverse: gtk::Separator = builder.get_object("separator_select_reverse").unwrap(); - let separator_select_date: gtk::Separator = builder.get_object("separator_select_date").unwrap(); - let separator_select_custom: gtk::Separator = builder.get_object("separator_select_custom").unwrap(); - - let buttons_popover_right_click_open_file: gtk::Button = builder.get_object("buttons_popover_right_click_open_file").unwrap(); - let buttons_popover_right_click_open_folder: gtk::Button = builder.get_object("buttons_popover_right_click_open_folder").unwrap(); - - //// Popovers - let popover_select: gtk::Popover = builder.get_object("popover_select").unwrap(); - let popover_right_click: gtk::Popover = builder.get_object("popover_right_click").unwrap(); - - //// Check Buttons - let check_button_recursive: gtk::CheckButton = builder.get_object("check_button_recursive").unwrap(); - let check_button_music_title: gtk::CheckButton = builder.get_object("check_button_music_title").unwrap(); - let check_button_music_artist: gtk::CheckButton = builder.get_object("check_button_music_artist").unwrap(); - let check_button_music_album_title: gtk::CheckButton = builder.get_object("check_button_music_album_title").unwrap(); - let check_button_music_album_artist: gtk::CheckButton = builder.get_object("check_button_music_album_artist").unwrap(); - let check_button_music_year: gtk::CheckButton = builder.get_object("check_button_music_year").unwrap(); - - //// Radio Buttons - let radio_button_duplicates_name: gtk::RadioButton = builder.get_object("radio_button_duplicates_name").unwrap(); - let radio_button_duplicates_size: gtk::RadioButton = builder.get_object("radio_button_duplicates_size").unwrap(); - let radio_button_duplicates_hashmb: gtk::RadioButton = builder.get_object("radio_button_duplicates_hashmb").unwrap(); - let radio_button_duplicates_hash: gtk::RadioButton = builder.get_object("radio_button_duplicates_hash").unwrap(); - - let radio_button_similar_images_minimal: gtk::RadioButton = builder.get_object("radio_button_similar_images_minimal").unwrap(); - let radio_button_similar_images_very_small: gtk::RadioButton = builder.get_object("radio_button_similar_images_very_small").unwrap(); - let radio_button_similar_images_small: gtk::RadioButton = builder.get_object("radio_button_similar_images_small").unwrap(); - let radio_button_similar_images_medium: gtk::RadioButton = builder.get_object("radio_button_similar_images_medium").unwrap(); - let radio_button_similar_images_high: gtk::RadioButton = builder.get_object("radio_button_similar_images_high").unwrap(); - let radio_button_similar_images_very_high: gtk::RadioButton = builder.get_object("radio_button_similar_images_very_high").unwrap(); - - //// Notebooks - let notebook_main: gtk::Notebook = builder.get_object("notebook_main").unwrap(); - let notebook_upper: gtk::Notebook = builder.get_object("notebook_upper").unwrap(); - - let mut notebook_upper_children_names: Vec = Vec::new(); - - for i in notebook_upper.get_children() { - notebook_upper_children_names.push(i.get_buildable_name().unwrap().to_string()); - } - //// Entry let entry_info: gtk::Entry = builder.get_object("entry_info").unwrap(); @@ -326,46 +132,6 @@ impl GuiData { let text_view_errors: gtk::TextView = builder.get_object("text_view_errors").unwrap(); let scrolled_window_errors: gtk::ScrolledWindow = builder.get_object("scrolled_window_errors").unwrap(); - //// Scrolled windows - // Main notebook - - // Upper notebook - let scrolled_window_included_directories: gtk::ScrolledWindow = builder.get_object("scrolled_window_included_directories").unwrap(); - let scrolled_window_excluded_directories: gtk::ScrolledWindow = builder.get_object("scrolled_window_excluded_directories").unwrap(); - - let tree_view_included_directories: gtk::TreeView = TreeView::new(); - let tree_view_excluded_directories: gtk::TreeView = TreeView::new(); - - //// Dialog State - dialog with progress state, which allows to stop task - let dialog_progress: gtk::Dialog = builder.get_object("dialog_progress").unwrap(); - dialog_progress.set_title("Czkawka"); - - let progress_bar_current_stage: gtk::ProgressBar = builder.get_object("progress_bar_current_stage").unwrap(); - let progress_bar_all_stages: gtk::ProgressBar = builder.get_object("progress_bar_all_stages").unwrap(); - - let label_stage: gtk::Label = builder.get_object("label_stage").unwrap(); - - let grid_progress_stages: gtk::Grid = builder.get_object("grid_progress_stages").unwrap(); - - let button_stop_in_dialog: gtk::Button = builder.get_object("button_stop_in_dialog").unwrap(); - - //// Similar Images - let image_preview_similar_images: gtk::Image = builder.get_object("image_preview_similar_images").unwrap(); - - //// Settings - let check_button_settings_save_at_exit: gtk::CheckButton = builder.get_object("check_button_settings_save_at_exit").unwrap(); - let check_button_settings_load_at_start: gtk::CheckButton = builder.get_object("check_button_settings_load_at_start").unwrap(); - let check_button_settings_confirm_deletion: gtk::CheckButton = builder.get_object("check_button_settings_confirm_deletion").unwrap(); - let check_button_settings_show_preview_similar_images: gtk::CheckButton = builder.get_object("check_button_settings_show_preview_similar_images").unwrap(); - let check_button_settings_show_text_view: gtk::CheckButton = builder.get_object("check_button_settings_show_text_view").unwrap(); - - let button_settings_save_configuration: gtk::Button = builder.get_object("button_settings_save_configuration").unwrap(); - let button_settings_load_configuration: gtk::Button = builder.get_object("button_settings_load_configuration").unwrap(); - let button_settings_reset_configuration: gtk::Button = builder.get_object("button_settings_reset_configuration").unwrap(); - - //// Threads - // Types of messages to send to main thread where gui can be draw. - // Used for sending stop signal to thread let (stop_sender, stop_receiver): (crossbeam_channel::Sender<()>, crossbeam_channel::Receiver<()>) = unbounded(); @@ -374,7 +140,10 @@ impl GuiData { builder, window_main, main_notebook, - buttons_labels, + upper_notebook, + popovers, + bottom_buttons, + progress_dialog, shared_buttons, shared_upper_notebooks, shared_duplication_state, @@ -386,86 +155,9 @@ impl GuiData { shared_zeroed_files_state, shared_same_music_state, shared_same_invalid_symlinks, - entry_similar_images_minimal_size, - entry_duplicate_minimal_size, - entry_allowed_extensions, - entry_excluded_items, - entry_big_files_number, - entry_same_music_minimal_size, - buttons_search, - buttons_select, - buttons_delete, - buttons_save, - buttons_symlink, - buttons_show_errors, - buttons_names, - buttons_array, - buttons_manual_add_directory, - buttons_add_included_directory, - buttons_remove_included_directory, - buttons_manual_add_excluded_directory, - buttons_add_excluded_directory, - buttons_remove_excluded_directory, - buttons_popover_select_all, - buttons_popover_unselect_all, - buttons_popover_reverse, - buttons_popover_select_all_except_oldest, - buttons_popover_select_all_except_newest, - buttons_popover_select_one_oldest, - buttons_popover_select_one_newest, - buttons_popover_select_custom, - buttons_popover_unselect_custom, - buttons_popover_select_all_images_except_biggest, - buttons_popover_select_all_images_except_smallest, - separator_select_image_size, - separator_select_reverse, - separator_select_date, - separator_select_custom, - buttons_popover_right_click_open_file, - buttons_popover_right_click_open_folder, - popover_select, - popover_right_click, - check_button_recursive, - check_button_music_title, - check_button_music_artist, - check_button_music_album_title, - check_button_music_album_artist, - check_button_music_year, - radio_button_duplicates_name, - radio_button_duplicates_size, - radio_button_duplicates_hashmb, - radio_button_duplicates_hash, - radio_button_similar_images_minimal, - radio_button_similar_images_very_small, - radio_button_similar_images_small, - radio_button_similar_images_medium, - radio_button_similar_images_high, - radio_button_similar_images_very_high, - notebook_main, - notebook_upper, - notebook_upper_children_names, entry_info, text_view_errors, scrolled_window_errors, - scrolled_window_included_directories, - scrolled_window_excluded_directories, - tree_view_included_directories, - tree_view_excluded_directories, - dialog_progress, - progress_bar_current_stage, - progress_bar_all_stages, - label_stage, - grid_progress_stages, - button_stop_in_dialog, - image_preview_similar_images, - check_button_settings_save_at_exit, - check_button_settings_load_at_start, - check_button_settings_confirm_deletion, - check_button_settings_show_preview_similar_images, - check_button_settings_show_text_view, - button_settings_save_configuration, - button_settings_load_configuration, - button_settings_reset_configuration, stop_sender, stop_receiver, } diff --git a/czkawka_gui/src/gui_main_notebook.rs b/czkawka_gui/src/gui_main_notebook.rs index 56d7863..06d28d4 100644 --- a/czkawka_gui/src/gui_main_notebook.rs +++ b/czkawka_gui/src/gui_main_notebook.rs @@ -3,6 +3,8 @@ use gtk::TreeView; #[derive(Clone)] pub struct GUIMainNotebook { + pub notebook_main: gtk::Notebook, + pub scrolled_window_duplicate_finder: gtk::ScrolledWindow, pub scrolled_window_empty_folder_finder: gtk::ScrolledWindow, pub scrolled_window_empty_files_finder: gtk::ScrolledWindow, @@ -22,10 +24,40 @@ pub struct GUIMainNotebook { pub tree_view_zeroed_files_finder: gtk::TreeView, pub tree_view_same_music_finder: gtk::TreeView, pub tree_view_invalid_symlinks: gtk::TreeView, + + pub entry_similar_images_minimal_size: gtk::Entry, + pub entry_duplicate_minimal_size: gtk::Entry, + pub entry_big_files_number: gtk::Entry, + pub entry_same_music_minimal_size: gtk::Entry, + + //// Check Buttons + pub check_button_music_title: gtk::CheckButton, + pub check_button_music_artist: gtk::CheckButton, + pub check_button_music_album_title: gtk::CheckButton, + pub check_button_music_album_artist: gtk::CheckButton, + pub check_button_music_year: gtk::CheckButton, + + //// Radio Buttons + // Duplicates + pub radio_button_duplicates_name: gtk::RadioButton, + pub radio_button_duplicates_size: gtk::RadioButton, + pub radio_button_duplicates_hashmb: gtk::RadioButton, + pub radio_button_duplicates_hash: gtk::RadioButton, + + pub radio_button_similar_images_minimal: gtk::RadioButton, + pub radio_button_similar_images_very_small: gtk::RadioButton, + pub radio_button_similar_images_small: gtk::RadioButton, + pub radio_button_similar_images_medium: gtk::RadioButton, + pub radio_button_similar_images_high: gtk::RadioButton, + pub radio_button_similar_images_very_high: gtk::RadioButton, + + pub image_preview_similar_images: gtk::Image, } impl GUIMainNotebook { pub fn create_from_builder(builder: >k::Builder) -> Self { + let notebook_main: gtk::Notebook = builder.get_object("notebook_main").unwrap(); + let scrolled_window_duplicate_finder: gtk::ScrolledWindow = builder.get_object("scrolled_window_duplicate_finder").unwrap(); let scrolled_window_empty_folder_finder: gtk::ScrolledWindow = builder.get_object("scrolled_window_empty_folder_finder").unwrap(); let scrolled_window_empty_files_finder: gtk::ScrolledWindow = builder.get_object("scrolled_window_empty_files_finder").unwrap(); @@ -46,7 +78,35 @@ impl GUIMainNotebook { let tree_view_same_music_finder: gtk::TreeView = TreeView::new(); let tree_view_invalid_symlinks: gtk::TreeView = TreeView::new(); + let entry_similar_images_minimal_size: gtk::Entry = builder.get_object("entry_similar_images_minimal_size").unwrap(); + let entry_duplicate_minimal_size: gtk::Entry = builder.get_object("entry_duplicate_minimal_size").unwrap(); + let entry_big_files_number: gtk::Entry = builder.get_object("entry_big_files_number").unwrap(); + let entry_same_music_minimal_size: gtk::Entry = builder.get_object("entry_same_music_minimal_size").unwrap(); + + //// Check Buttons + let check_button_music_title: gtk::CheckButton = builder.get_object("check_button_music_title").unwrap(); + let check_button_music_artist: gtk::CheckButton = builder.get_object("check_button_music_artist").unwrap(); + let check_button_music_album_title: gtk::CheckButton = builder.get_object("check_button_music_album_title").unwrap(); + let check_button_music_album_artist: gtk::CheckButton = builder.get_object("check_button_music_album_artist").unwrap(); + let check_button_music_year: gtk::CheckButton = builder.get_object("check_button_music_year").unwrap(); + + //// Radio Buttons + let radio_button_duplicates_name: gtk::RadioButton = builder.get_object("radio_button_duplicates_name").unwrap(); + let radio_button_duplicates_size: gtk::RadioButton = builder.get_object("radio_button_duplicates_size").unwrap(); + let radio_button_duplicates_hashmb: gtk::RadioButton = builder.get_object("radio_button_duplicates_hashmb").unwrap(); + let radio_button_duplicates_hash: gtk::RadioButton = builder.get_object("radio_button_duplicates_hash").unwrap(); + + let radio_button_similar_images_minimal: gtk::RadioButton = builder.get_object("radio_button_similar_images_minimal").unwrap(); + let radio_button_similar_images_very_small: gtk::RadioButton = builder.get_object("radio_button_similar_images_very_small").unwrap(); + let radio_button_similar_images_small: gtk::RadioButton = builder.get_object("radio_button_similar_images_small").unwrap(); + let radio_button_similar_images_medium: gtk::RadioButton = builder.get_object("radio_button_similar_images_medium").unwrap(); + let radio_button_similar_images_high: gtk::RadioButton = builder.get_object("radio_button_similar_images_high").unwrap(); + let radio_button_similar_images_very_high: gtk::RadioButton = builder.get_object("radio_button_similar_images_very_high").unwrap(); + + let image_preview_similar_images: gtk::Image = builder.get_object("image_preview_similar_images").unwrap(); + Self { + notebook_main, scrolled_window_duplicate_finder, scrolled_window_empty_folder_finder, scrolled_window_empty_files_finder, @@ -65,6 +125,26 @@ impl GUIMainNotebook { tree_view_zeroed_files_finder, tree_view_same_music_finder, tree_view_invalid_symlinks, + entry_similar_images_minimal_size, + entry_duplicate_minimal_size, + entry_big_files_number, + entry_same_music_minimal_size, + check_button_music_title, + check_button_music_artist, + check_button_music_album_title, + check_button_music_album_artist, + check_button_music_year, + radio_button_duplicates_name, + radio_button_duplicates_size, + radio_button_duplicates_hashmb, + radio_button_duplicates_hash, + radio_button_similar_images_minimal, + radio_button_similar_images_very_small, + radio_button_similar_images_small, + radio_button_similar_images_medium, + radio_button_similar_images_high, + radio_button_similar_images_very_high, + image_preview_similar_images, } } } diff --git a/czkawka_gui/src/gui_popovers.rs b/czkawka_gui/src/gui_popovers.rs new file mode 100644 index 0000000..607a658 --- /dev/null +++ b/czkawka_gui/src/gui_popovers.rs @@ -0,0 +1,76 @@ +use gtk::prelude::*; + +#[derive(Clone)] +pub struct GUIPopovers { + pub buttons_popover_select_all: gtk::Button, + pub buttons_popover_unselect_all: gtk::Button, + pub buttons_popover_reverse: gtk::Button, + pub buttons_popover_select_all_except_oldest: gtk::Button, + pub buttons_popover_select_all_except_newest: gtk::Button, + pub buttons_popover_select_one_oldest: gtk::Button, + pub buttons_popover_select_one_newest: gtk::Button, + pub buttons_popover_select_custom: gtk::Button, + pub buttons_popover_unselect_custom: gtk::Button, + pub buttons_popover_select_all_images_except_biggest: gtk::Button, + pub buttons_popover_select_all_images_except_smallest: gtk::Button, + + pub separator_select_image_size: gtk::Separator, + pub separator_select_reverse: gtk::Separator, + pub separator_select_date: gtk::Separator, + pub separator_select_custom: gtk::Separator, + + pub buttons_popover_right_click_open_file: gtk::Button, + pub buttons_popover_right_click_open_folder: gtk::Button, + + pub popover_select: gtk::Popover, + pub popover_right_click: gtk::Popover, +} + +impl GUIPopovers { + pub fn create_from_builder(builder: >k::Builder) -> Self { + let buttons_popover_select_all: gtk::Button = builder.get_object("buttons_popover_select_all").unwrap(); + let buttons_popover_unselect_all: gtk::Button = builder.get_object("buttons_popover_unselect_all").unwrap(); + let buttons_popover_reverse: gtk::Button = builder.get_object("buttons_popover_reverse").unwrap(); + let buttons_popover_select_all_except_oldest: gtk::Button = builder.get_object("buttons_popover_select_all_except_oldest").unwrap(); + let buttons_popover_select_all_except_newest: gtk::Button = builder.get_object("buttons_popover_select_all_except_newest").unwrap(); + let buttons_popover_select_one_oldest: gtk::Button = builder.get_object("buttons_popover_select_one_oldest").unwrap(); + let buttons_popover_select_one_newest: gtk::Button = builder.get_object("buttons_popover_select_one_newest").unwrap(); + let buttons_popover_select_custom: gtk::Button = builder.get_object("buttons_popover_select_custom").unwrap(); + let buttons_popover_unselect_custom: gtk::Button = builder.get_object("buttons_popover_unselect_custom").unwrap(); + let buttons_popover_select_all_images_except_biggest: gtk::Button = builder.get_object("buttons_popover_select_all_images_except_biggest").unwrap(); + let buttons_popover_select_all_images_except_smallest: gtk::Button = builder.get_object("buttons_popover_select_all_images_except_smallest").unwrap(); + + let separator_select_image_size: gtk::Separator = builder.get_object("separator_select_image_size").unwrap(); + let separator_select_reverse: gtk::Separator = builder.get_object("separator_select_reverse").unwrap(); + let separator_select_date: gtk::Separator = builder.get_object("separator_select_date").unwrap(); + let separator_select_custom: gtk::Separator = builder.get_object("separator_select_custom").unwrap(); + + let buttons_popover_right_click_open_file: gtk::Button = builder.get_object("buttons_popover_right_click_open_file").unwrap(); + let buttons_popover_right_click_open_folder: gtk::Button = builder.get_object("buttons_popover_right_click_open_folder").unwrap(); + + let popover_select: gtk::Popover = builder.get_object("popover_select").unwrap(); + let popover_right_click: gtk::Popover = builder.get_object("popover_right_click").unwrap(); + + Self { + buttons_popover_select_all, + buttons_popover_unselect_all, + buttons_popover_reverse, + buttons_popover_select_all_except_oldest, + buttons_popover_select_all_except_newest, + buttons_popover_select_one_oldest, + buttons_popover_select_one_newest, + buttons_popover_select_custom, + buttons_popover_unselect_custom, + buttons_popover_select_all_images_except_biggest, + buttons_popover_select_all_images_except_smallest, + separator_select_image_size, + separator_select_reverse, + separator_select_date, + separator_select_custom, + buttons_popover_right_click_open_file, + buttons_popover_right_click_open_folder, + popover_select, + popover_right_click, + } + } +} diff --git a/czkawka_gui/src/gui_progress_dialog.rs b/czkawka_gui/src/gui_progress_dialog.rs new file mode 100644 index 0000000..7e1a98b --- /dev/null +++ b/czkawka_gui/src/gui_progress_dialog.rs @@ -0,0 +1,40 @@ +use gtk::prelude::*; + +#[derive(Clone)] +pub struct GUIProgressDialog { + pub dialog_progress: gtk::Dialog, + + pub progress_bar_current_stage: gtk::ProgressBar, + pub progress_bar_all_stages: gtk::ProgressBar, + + pub label_stage: gtk::Label, + + pub grid_progress_stages: gtk::Grid, + + pub button_stop_in_dialog: gtk::Button, +} + +impl GUIProgressDialog { + pub fn create_from_builder(builder: >k::Builder) -> Self { + let dialog_progress: gtk::Dialog = builder.get_object("dialog_progress").unwrap(); + dialog_progress.set_title("Czkawka"); + + let progress_bar_current_stage: gtk::ProgressBar = builder.get_object("progress_bar_current_stage").unwrap(); + let progress_bar_all_stages: gtk::ProgressBar = builder.get_object("progress_bar_all_stages").unwrap(); + + let label_stage: gtk::Label = builder.get_object("label_stage").unwrap(); + + let grid_progress_stages: gtk::Grid = builder.get_object("grid_progress_stages").unwrap(); + + let button_stop_in_dialog: gtk::Button = builder.get_object("button_stop_in_dialog").unwrap(); + + Self { + dialog_progress, + progress_bar_current_stage, + progress_bar_all_stages, + label_stage, + grid_progress_stages, + button_stop_in_dialog, + } + } +} diff --git a/czkawka_gui/src/gui_upper_notepad.rs b/czkawka_gui/src/gui_upper_notepad.rs new file mode 100644 index 0000000..cb5ffac --- /dev/null +++ b/czkawka_gui/src/gui_upper_notepad.rs @@ -0,0 +1,96 @@ +use gtk::prelude::*; +use gtk::TreeView; + +#[derive(Clone)] +pub struct GUIUpperNotebook { + pub notebook_upper: gtk::Notebook, + + pub scrolled_window_included_directories: gtk::ScrolledWindow, + pub scrolled_window_excluded_directories: gtk::ScrolledWindow, + + pub tree_view_included_directories: gtk::TreeView, + pub tree_view_excluded_directories: gtk::TreeView, + + pub entry_excluded_items: gtk::Entry, + pub entry_allowed_extensions: gtk::Entry, + + //// Settings + pub check_button_settings_save_at_exit: gtk::CheckButton, + pub check_button_settings_load_at_start: gtk::CheckButton, + pub check_button_settings_confirm_deletion: gtk::CheckButton, + pub check_button_settings_show_preview_similar_images: gtk::CheckButton, + pub check_button_settings_show_text_view: gtk::CheckButton, + + pub button_settings_save_configuration: gtk::Button, + pub button_settings_load_configuration: gtk::Button, + pub button_settings_reset_configuration: gtk::Button, + + pub check_button_recursive: gtk::CheckButton, + + pub buttons_manual_add_directory: gtk::Button, + pub buttons_add_included_directory: gtk::Button, + pub buttons_remove_included_directory: gtk::Button, + pub buttons_manual_add_excluded_directory: gtk::Button, + pub buttons_add_excluded_directory: gtk::Button, + pub buttons_remove_excluded_directory: gtk::Button, +} + +impl GUIUpperNotebook { + pub fn create_from_builder(builder: >k::Builder) -> Self { + let notebook_upper: gtk::Notebook = builder.get_object("notebook_upper").unwrap(); + + let scrolled_window_included_directories: gtk::ScrolledWindow = builder.get_object("scrolled_window_included_directories").unwrap(); + let scrolled_window_excluded_directories: gtk::ScrolledWindow = builder.get_object("scrolled_window_excluded_directories").unwrap(); + + let tree_view_included_directories: gtk::TreeView = TreeView::new(); + let tree_view_excluded_directories: gtk::TreeView = TreeView::new(); + + let entry_allowed_extensions: gtk::Entry = builder.get_object("entry_allowed_extensions").unwrap(); + let entry_excluded_items: gtk::Entry = builder.get_object("entry_excluded_items").unwrap(); + + //// Settings + let check_button_settings_save_at_exit: gtk::CheckButton = builder.get_object("check_button_settings_save_at_exit").unwrap(); + let check_button_settings_load_at_start: gtk::CheckButton = builder.get_object("check_button_settings_load_at_start").unwrap(); + let check_button_settings_confirm_deletion: gtk::CheckButton = builder.get_object("check_button_settings_confirm_deletion").unwrap(); + let check_button_settings_show_preview_similar_images: gtk::CheckButton = builder.get_object("check_button_settings_show_preview_similar_images").unwrap(); + let check_button_settings_show_text_view: gtk::CheckButton = builder.get_object("check_button_settings_show_text_view").unwrap(); + + let button_settings_save_configuration: gtk::Button = builder.get_object("button_settings_save_configuration").unwrap(); + let button_settings_load_configuration: gtk::Button = builder.get_object("button_settings_load_configuration").unwrap(); + let button_settings_reset_configuration: gtk::Button = builder.get_object("button_settings_reset_configuration").unwrap(); + + let check_button_recursive: gtk::CheckButton = builder.get_object("check_button_recursive").unwrap(); + + let buttons_manual_add_directory: gtk::Button = builder.get_object("buttons_manual_add_directory").unwrap(); + let buttons_add_included_directory: gtk::Button = builder.get_object("buttons_add_included_directory").unwrap(); + let buttons_remove_included_directory: gtk::Button = builder.get_object("buttons_remove_included_directory").unwrap(); + let buttons_manual_add_excluded_directory: gtk::Button = builder.get_object("buttons_manual_add_excluded_directory").unwrap(); + let buttons_add_excluded_directory: gtk::Button = builder.get_object("buttons_add_excluded_directory").unwrap(); + let buttons_remove_excluded_directory: gtk::Button = builder.get_object("buttons_remove_excluded_directory").unwrap(); + + Self { + notebook_upper, + scrolled_window_included_directories, + scrolled_window_excluded_directories, + tree_view_included_directories, + tree_view_excluded_directories, + entry_excluded_items, + entry_allowed_extensions, + check_button_settings_save_at_exit, + check_button_settings_load_at_start, + check_button_settings_confirm_deletion, + check_button_settings_show_preview_similar_images, + check_button_settings_show_text_view, + button_settings_save_configuration, + button_settings_load_configuration, + button_settings_reset_configuration, + check_button_recursive, + buttons_manual_add_directory, + buttons_add_included_directory, + buttons_remove_included_directory, + buttons_manual_add_excluded_directory, + buttons_add_excluded_directory, + buttons_remove_excluded_directory, + } + } +} diff --git a/czkawka_gui/src/initialize_gui.rs b/czkawka_gui/src/initialize_gui.rs index a2361e6..5febfc7 100644 --- a/czkawka_gui/src/initialize_gui.rs +++ b/czkawka_gui/src/initialize_gui.rs @@ -15,11 +15,11 @@ use std::path::Path; pub fn initialize_gui(gui_data: &mut GuiData) { //// Setup default look(duplicate finder) { - let buttons_search = gui_data.buttons_search.clone(); - let buttons_save = gui_data.buttons_save.clone(); - let buttons_delete = gui_data.buttons_delete.clone(); - let buttons_select = gui_data.buttons_select.clone(); - let buttons_symlink = gui_data.buttons_symlink.clone(); + let buttons_search = gui_data.bottom_buttons.buttons_search.clone(); + let buttons_save = gui_data.bottom_buttons.buttons_save.clone(); + let buttons_delete = gui_data.bottom_buttons.buttons_delete.clone(); + let buttons_select = gui_data.bottom_buttons.buttons_select.clone(); + let buttons_symlink = gui_data.bottom_buttons.buttons_symlink.clone(); let scrolled_window_duplicate_finder = gui_data.main_notebook.scrolled_window_duplicate_finder.clone(); let scrolled_window_empty_folder_finder = gui_data.main_notebook.scrolled_window_empty_folder_finder.clone(); let scrolled_window_empty_files_finder = gui_data.main_notebook.scrolled_window_empty_files_finder.clone(); @@ -29,11 +29,11 @@ pub fn initialize_gui(gui_data: &mut GuiData) { let scrolled_window_same_music_finder = gui_data.main_notebook.scrolled_window_same_music_finder.clone(); let scrolled_window_invalid_symlinks = gui_data.main_notebook.scrolled_window_invalid_symlinks.clone(); let scrolled_window_zeroed_files_finder = gui_data.main_notebook.scrolled_window_zeroed_files_finder.clone(); - let scrolled_window_included_directories = gui_data.scrolled_window_included_directories.clone(); - let scrolled_window_excluded_directories = gui_data.scrolled_window_excluded_directories.clone(); + let scrolled_window_included_directories = gui_data.upper_notebook.scrolled_window_included_directories.clone(); + let scrolled_window_excluded_directories = gui_data.upper_notebook.scrolled_window_excluded_directories.clone(); - let image_preview_similar_images = gui_data.image_preview_similar_images.clone(); - let check_button_settings_show_preview_similar_images = gui_data.check_button_settings_show_preview_similar_images.clone(); + let image_preview_similar_images = gui_data.main_notebook.image_preview_similar_images.clone(); + let check_button_settings_show_preview_similar_images = gui_data.upper_notebook.check_button_settings_show_preview_similar_images.clone(); let text_view_errors = gui_data.text_view_errors.clone(); // Disable and show buttons @@ -433,7 +433,7 @@ pub fn initialize_gui(gui_data: &mut GuiData) { create_tree_view_directories(&mut tree_view); - gui_data.tree_view_included_directories = tree_view.clone(); + gui_data.upper_notebook.tree_view_included_directories = tree_view.clone(); scrolled_window_included_directories.add(&tree_view); scrolled_window_included_directories.show_all(); @@ -465,7 +465,7 @@ pub fn initialize_gui(gui_data: &mut GuiData) { create_tree_view_directories(&mut tree_view); - gui_data.tree_view_excluded_directories = tree_view.clone(); + gui_data.upper_notebook.tree_view_excluded_directories = tree_view.clone(); scrolled_window_excluded_directories.add(&tree_view); scrolled_window_excluded_directories.show_all(); diff --git a/czkawka_gui/src/main.rs b/czkawka_gui/src/main.rs index 737b712..d901fac 100644 --- a/czkawka_gui/src/main.rs +++ b/czkawka_gui/src/main.rs @@ -16,8 +16,12 @@ mod connect_selection_of_directories; mod connect_settings; mod create_tree_view; mod double_click_opening; +mod gui_bottom_buttons; mod gui_data; mod gui_main_notebook; +mod gui_popovers; +mod gui_progress_dialog; +mod gui_upper_notepad; mod help_functions; mod initialize_gui; mod notebook_enums; diff --git a/czkawka_gui/src/saving_loading.rs b/czkawka_gui/src/saving_loading.rs index 9ac86ff..5ba28a5 100644 --- a/czkawka_gui/src/saving_loading.rs +++ b/czkawka_gui/src/saving_loading.rs @@ -13,7 +13,7 @@ use std::{env, fs}; const SAVE_FILE_NAME: &str = "czkawka_gui_config.txt"; pub fn save_configuration(gui_data: &GuiData, manual_execution: bool) { - let check_button_settings_save_at_exit = gui_data.check_button_settings_save_at_exit.clone(); + let check_button_settings_save_at_exit = gui_data.upper_notebook.check_button_settings_save_at_exit.clone(); let text_view_errors = gui_data.text_view_errors.clone(); reset_text_view(&text_view_errors); @@ -42,7 +42,7 @@ pub fn save_configuration(gui_data: &GuiData, manual_execution: bool) { //// Included Directories data_to_save.push("--included_directories:".to_string()); - let tree_view_included_directories = gui_data.tree_view_included_directories.clone(); + let tree_view_included_directories = gui_data.upper_notebook.tree_view_included_directories.clone(); let list_store = get_list_store(&tree_view_included_directories); if let Some(iter) = list_store.get_iter_first() { loop { @@ -55,7 +55,7 @@ pub fn save_configuration(gui_data: &GuiData, manual_execution: bool) { //// Excluded Directories data_to_save.push("--excluded_directories:".to_string()); - let tree_view_excluded_directories = gui_data.tree_view_excluded_directories.clone(); + let tree_view_excluded_directories = gui_data.upper_notebook.tree_view_excluded_directories.clone(); let list_store = get_list_store(&tree_view_excluded_directories); if let Some(iter) = list_store.get_iter_first() { loop { @@ -69,7 +69,7 @@ pub fn save_configuration(gui_data: &GuiData, manual_execution: bool) { { //// Excluded Items data_to_save.push("--excluded_items:".to_string()); - let entry_excluded_items = gui_data.entry_excluded_items.clone(); + let entry_excluded_items = gui_data.upper_notebook.entry_excluded_items.clone(); for item in entry_excluded_items.get_text().split(',') { if item.trim().is_empty() { continue; @@ -79,7 +79,7 @@ pub fn save_configuration(gui_data: &GuiData, manual_execution: bool) { //// Allowed extensions data_to_save.push("--allowed_extensions:".to_string()); - let entry_allowed_extensions = gui_data.entry_allowed_extensions.clone(); + let entry_allowed_extensions = gui_data.upper_notebook.entry_allowed_extensions.clone(); for extension in entry_allowed_extensions.get_text().split(',') { if extension.trim().is_empty() { continue; @@ -89,27 +89,27 @@ pub fn save_configuration(gui_data: &GuiData, manual_execution: bool) { //// Save at exit data_to_save.push("--save_at_exit:".to_string()); - let check_button_settings_save_at_exit = gui_data.check_button_settings_save_at_exit.clone(); + let check_button_settings_save_at_exit = gui_data.upper_notebook.check_button_settings_save_at_exit.clone(); data_to_save.push(check_button_settings_save_at_exit.get_active().to_string()); //// Load at start data_to_save.push("--load_at_start:".to_string()); - let check_button_settings_load_at_start = gui_data.check_button_settings_load_at_start.clone(); + let check_button_settings_load_at_start = gui_data.upper_notebook.check_button_settings_load_at_start.clone(); data_to_save.push(check_button_settings_load_at_start.get_active().to_string()); //// Confirm deletion of files data_to_save.push("--confirm_deletion:".to_string()); - let check_button_settings_confirm_deletion = gui_data.check_button_settings_confirm_deletion.clone(); + let check_button_settings_confirm_deletion = gui_data.upper_notebook.check_button_settings_confirm_deletion.clone(); data_to_save.push(check_button_settings_confirm_deletion.get_active().to_string()); //// Show image previews in similar images data_to_save.push("--show_previews:".to_string()); - let check_button_settings_show_preview_similar_images = gui_data.check_button_settings_show_preview_similar_images.clone(); + let check_button_settings_show_preview_similar_images = gui_data.upper_notebook.check_button_settings_show_preview_similar_images.clone(); data_to_save.push(check_button_settings_show_preview_similar_images.get_active().to_string()); //// Show bottom text panel with errors data_to_save.push("--bottom_text_panel:".to_string()); - let check_button_settings_show_text_view = gui_data.check_button_settings_show_text_view.clone(); + let check_button_settings_show_text_view = gui_data.upper_notebook.check_button_settings_show_text_view.clone(); data_to_save.push(check_button_settings_show_text_view.get_active().to_string()); } @@ -323,7 +323,7 @@ pub fn load_configuration(gui_data: &GuiData, manual_execution: bool) { // Setting data if manual_execution || loading_at_start { //// Included Directories - let tree_view_included_directories = gui_data.tree_view_included_directories.clone(); + let tree_view_included_directories = gui_data.upper_notebook.tree_view_included_directories.clone(); let list_store = get_list_store(&tree_view_included_directories); list_store.clear(); @@ -335,7 +335,7 @@ pub fn load_configuration(gui_data: &GuiData, manual_execution: bool) { } //// Exclude Directories - let tree_view_excluded_directories = gui_data.tree_view_excluded_directories.clone(); + let tree_view_excluded_directories = gui_data.upper_notebook.tree_view_excluded_directories.clone(); let list_store = get_list_store(&tree_view_excluded_directories); list_store.clear(); @@ -347,27 +347,27 @@ pub fn load_configuration(gui_data: &GuiData, manual_execution: bool) { } //// Excluded Items - let entry_excluded_items = gui_data.entry_excluded_items.clone(); + let entry_excluded_items = gui_data.upper_notebook.entry_excluded_items.clone(); entry_excluded_items.set_text(excluded_items.iter().map(|e| e.to_string() + ",").collect::().as_str()); //// Allowed extensions - let entry_allowed_extensions = gui_data.entry_allowed_extensions.clone(); + let entry_allowed_extensions = gui_data.upper_notebook.entry_allowed_extensions.clone(); entry_allowed_extensions.set_text(allowed_extensions.iter().map(|e| e.to_string() + ",").collect::().as_str()); //// Buttons - gui_data.check_button_settings_load_at_start.set_active(loading_at_start); - gui_data.check_button_settings_save_at_exit.set_active(saving_at_exit); - gui_data.check_button_settings_confirm_deletion.set_active(confirm_deletion); - gui_data.check_button_settings_show_preview_similar_images.set_active(show_previews); + gui_data.upper_notebook.check_button_settings_load_at_start.set_active(loading_at_start); + gui_data.upper_notebook.check_button_settings_save_at_exit.set_active(saving_at_exit); + gui_data.upper_notebook.check_button_settings_confirm_deletion.set_active(confirm_deletion); + gui_data.upper_notebook.check_button_settings_show_preview_similar_images.set_active(show_previews); - gui_data.check_button_settings_show_text_view.set_active(bottom_text_panel); + gui_data.upper_notebook.check_button_settings_show_text_view.set_active(bottom_text_panel); if !bottom_text_panel { gui_data.text_view_errors.hide(); } else { gui_data.text_view_errors.show(); } } else { - gui_data.check_button_settings_load_at_start.set_active(false); + gui_data.upper_notebook.check_button_settings_load_at_start.set_active(false); } if manual_execution { @@ -387,7 +387,7 @@ pub fn reset_configuration(gui_data: &GuiData, manual_clearing: bool) { // Resetting included directories { let col_indices = [0]; - let tree_view_included_directories = gui_data.tree_view_included_directories.clone(); + let tree_view_included_directories = gui_data.upper_notebook.tree_view_included_directories.clone(); let list_store = get_list_store(&tree_view_included_directories); list_store.clear(); @@ -412,7 +412,7 @@ pub fn reset_configuration(gui_data: &GuiData, manual_clearing: bool) { // Resetting excluded directories { let col_indices = [0]; - let tree_view_excluded_directories = gui_data.tree_view_excluded_directories.clone(); + let tree_view_excluded_directories = gui_data.upper_notebook.tree_view_excluded_directories.clone(); let list_store = get_list_store(&tree_view_excluded_directories); list_store.clear(); if cfg!(target_family = "unix") { @@ -424,7 +424,7 @@ pub fn reset_configuration(gui_data: &GuiData, manual_clearing: bool) { } // Resetting excluded items { - let entry_excluded_items = gui_data.entry_excluded_items.clone(); + let entry_excluded_items = gui_data.upper_notebook.entry_excluded_items.clone(); if cfg!(target_family = "unix") { entry_excluded_items.set_text("*/.git/*,*/node_modules/*,*/lost+found/*,*/Trash/*,*/.Trash-*/*,*/snap/*,/home/*/.cache/*"); } @@ -434,17 +434,17 @@ pub fn reset_configuration(gui_data: &GuiData, manual_clearing: bool) { } // Resetting allowed extensions { - let entry_allowed_extensions = gui_data.entry_allowed_extensions.clone(); + let entry_allowed_extensions = gui_data.upper_notebook.entry_allowed_extensions.clone(); entry_allowed_extensions.set_text(""); } // Set settings { - gui_data.check_button_settings_save_at_exit.set_active(true); - gui_data.check_button_settings_load_at_start.set_active(true); - gui_data.check_button_settings_confirm_deletion.set_active(true); - gui_data.check_button_settings_show_preview_similar_images.set_active(true); - gui_data.check_button_settings_show_text_view.set_active(true); + gui_data.upper_notebook.check_button_settings_save_at_exit.set_active(true); + gui_data.upper_notebook.check_button_settings_load_at_start.set_active(true); + gui_data.upper_notebook.check_button_settings_confirm_deletion.set_active(true); + gui_data.upper_notebook.check_button_settings_show_preview_similar_images.set_active(true); + gui_data.upper_notebook.check_button_settings_show_text_view.set_active(true); } if manual_clearing { add_text_to_text_view(&text_view_errors, "Current configuration was cleared.");