use gtk4::prelude::*; use gtk4::{Builder, CheckButton, ComboBoxText, Entry, EventControllerKey, GestureClick, Image, Label, Notebook, Scale, ScrolledWindow, TreeView, Widget}; use czkawka_core::common_dir_traversal::CheckingMethod; use czkawka_core::localizer_core::{fnc_get_similarity_minimal, fnc_get_similarity_very_high}; use czkawka_core::similar_images::{get_string_from_similarity, Similarity, SIMILAR_VALUES}; use crate::flg; use crate::help_combo_box::{DUPLICATES_CHECK_METHOD_COMBO_BOX, IMAGES_HASH_SIZE_COMBO_BOX}; use crate::help_functions::get_all_children; use crate::notebook_enums::{NotebookMainEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS}; #[derive(Clone)] pub struct GuiMainNotebook { pub notebook_main: Notebook, pub scrolled_window_duplicate_finder: ScrolledWindow, pub scrolled_window_empty_folder_finder: ScrolledWindow, pub scrolled_window_empty_files_finder: ScrolledWindow, pub scrolled_window_temporary_files_finder: ScrolledWindow, pub scrolled_window_big_files_finder: ScrolledWindow, pub scrolled_window_similar_images_finder: ScrolledWindow, pub scrolled_window_similar_videos_finder: ScrolledWindow, pub scrolled_window_same_music_finder: ScrolledWindow, pub scrolled_window_invalid_symlinks: ScrolledWindow, pub scrolled_window_broken_files: ScrolledWindow, pub scrolled_window_bad_extensions: ScrolledWindow, pub tree_view_duplicate_finder: TreeView, pub tree_view_empty_folder_finder: TreeView, pub tree_view_empty_files_finder: TreeView, pub tree_view_temporary_files_finder: TreeView, pub tree_view_big_files_finder: TreeView, pub tree_view_similar_images_finder: TreeView, pub tree_view_similar_videos_finder: TreeView, pub tree_view_same_music_finder: TreeView, pub tree_view_invalid_symlinks: TreeView, pub tree_view_broken_files: TreeView, pub tree_view_bad_extensions: TreeView, pub evk_tree_view_duplicate_finder: EventControllerKey, pub evk_tree_view_empty_folder_finder: EventControllerKey, pub evk_tree_view_empty_files_finder: EventControllerKey, pub evk_tree_view_temporary_files_finder: EventControllerKey, pub evk_tree_view_big_files_finder: EventControllerKey, pub evk_tree_view_similar_images_finder: EventControllerKey, pub evk_tree_view_similar_videos_finder: EventControllerKey, pub evk_tree_view_same_music_finder: EventControllerKey, pub evk_tree_view_invalid_symlinks: EventControllerKey, pub evk_tree_view_broken_files: EventControllerKey, pub evk_tree_view_bad_extensions: EventControllerKey, pub gc_tree_view_duplicate_finder: GestureClick, pub gc_tree_view_empty_folder_finder: GestureClick, pub gc_tree_view_empty_files_finder: GestureClick, pub gc_tree_view_temporary_files_finder: GestureClick, pub gc_tree_view_big_files_finder: GestureClick, pub gc_tree_view_similar_images_finder: GestureClick, pub gc_tree_view_similar_videos_finder: GestureClick, pub gc_tree_view_same_music_finder: GestureClick, pub gc_tree_view_invalid_symlinks: GestureClick, pub gc_tree_view_broken_files: GestureClick, pub gc_tree_view_bad_extensions: GestureClick, // General // Duplicate pub combo_box_duplicate_check_method: ComboBoxText, pub combo_box_duplicate_hash_type: ComboBoxText, pub label_duplicate_check_method: Label, pub label_duplicate_hash_type: Label, pub check_button_duplicate_case_sensitive_name: CheckButton, pub image_preview_duplicates: Image, // Big file pub label_big_shown_files: Label, pub entry_big_files_number: Entry, // Similar Images pub scale_similarity_similar_images: Scale, pub label_image_resize_algorithm: Label, pub label_image_hash_type: Label, pub label_image_hash_size: Label, pub combo_box_image_resize_algorithm: ComboBoxText, pub combo_box_image_hash_algorithm: ComboBoxText, pub combo_box_image_hash_size: ComboBoxText, pub check_button_image_ignore_same_size: CheckButton, pub check_button_video_ignore_same_size: CheckButton, pub check_button_image_fast_compare: CheckButton, pub label_image_similarity: Label, pub label_image_similarity_max: Label, pub image_preview_similar_images: Image, pub label_similar_images_minimal_similarity: Label, // Video pub label_video_similarity: Label, pub label_video_similarity_min: Label, pub label_video_similarity_max: Label, pub scale_similarity_similar_videos: Scale, // Music pub check_button_music_title: CheckButton, pub check_button_music_artist: CheckButton, pub check_button_music_year: CheckButton, pub check_button_music_bitrate: CheckButton, pub check_button_music_genre: CheckButton, pub check_button_music_length: CheckButton, pub check_button_music_approximate_comparison: CheckButton, } impl GuiMainNotebook { pub fn create_from_builder(builder: &Builder) -> Self { let notebook_main: Notebook = builder.object("notebook_main").unwrap(); let scrolled_window_duplicate_finder: ScrolledWindow = builder.object("scrolled_window_duplicate_finder").unwrap(); let scrolled_window_empty_folder_finder: ScrolledWindow = builder.object("scrolled_window_empty_folder_finder").unwrap(); let scrolled_window_empty_files_finder: ScrolledWindow = builder.object("scrolled_window_empty_files_finder").unwrap(); let scrolled_window_temporary_files_finder: ScrolledWindow = builder.object("scrolled_window_temporary_files_finder").unwrap(); let scrolled_window_big_files_finder: ScrolledWindow = builder.object("scrolled_window_big_files_finder").unwrap(); let scrolled_window_similar_images_finder: ScrolledWindow = builder.object("scrolled_window_similar_images_finder").unwrap(); let scrolled_window_similar_videos_finder: ScrolledWindow = builder.object("scrolled_window_similar_videos_finder").unwrap(); let scrolled_window_same_music_finder: ScrolledWindow = builder.object("scrolled_window_same_music_finder").unwrap(); let scrolled_window_invalid_symlinks: ScrolledWindow = builder.object("scrolled_window_invalid_symlinks").unwrap(); let scrolled_window_broken_files: ScrolledWindow = builder.object("scrolled_window_broken_files").unwrap(); let scrolled_window_bad_extensions: ScrolledWindow = builder.object("scrolled_window_bad_extensions").unwrap(); let tree_view_duplicate_finder: TreeView = TreeView::new(); tree_view_duplicate_finder.set_widget_name("PIERD"); let tree_view_empty_folder_finder: TreeView = TreeView::new(); let tree_view_empty_files_finder: TreeView = TreeView::new(); let tree_view_temporary_files_finder: TreeView = TreeView::new(); let tree_view_big_files_finder: TreeView = TreeView::new(); let tree_view_similar_images_finder: TreeView = TreeView::new(); let tree_view_similar_videos_finder: TreeView = TreeView::new(); let tree_view_same_music_finder: TreeView = TreeView::new(); let tree_view_invalid_symlinks: TreeView = TreeView::new(); let tree_view_broken_files: TreeView = TreeView::new(); let tree_view_bad_extensions: TreeView = TreeView::new(); let evk_tree_view_duplicate_finder: EventControllerKey = EventControllerKey::new(); tree_view_duplicate_finder.add_controller(&evk_tree_view_duplicate_finder); let evk_tree_view_empty_folder_finder: EventControllerKey = EventControllerKey::new(); tree_view_empty_folder_finder.add_controller(&evk_tree_view_empty_folder_finder); let evk_tree_view_empty_files_finder: EventControllerKey = EventControllerKey::new(); tree_view_empty_files_finder.add_controller(&evk_tree_view_empty_files_finder); let evk_tree_view_temporary_files_finder: EventControllerKey = EventControllerKey::new(); tree_view_temporary_files_finder.add_controller(&evk_tree_view_temporary_files_finder); let evk_tree_view_big_files_finder: EventControllerKey = EventControllerKey::new(); tree_view_big_files_finder.add_controller(&evk_tree_view_big_files_finder); let evk_tree_view_similar_images_finder: EventControllerKey = EventControllerKey::new(); tree_view_similar_images_finder.add_controller(&evk_tree_view_similar_images_finder); let evk_tree_view_similar_videos_finder: EventControllerKey = EventControllerKey::new(); tree_view_similar_videos_finder.add_controller(&evk_tree_view_similar_videos_finder); let evk_tree_view_same_music_finder: EventControllerKey = EventControllerKey::new(); tree_view_same_music_finder.add_controller(&evk_tree_view_same_music_finder); let evk_tree_view_invalid_symlinks: EventControllerKey = EventControllerKey::new(); tree_view_invalid_symlinks.add_controller(&evk_tree_view_invalid_symlinks); let evk_tree_view_broken_files: EventControllerKey = EventControllerKey::new(); tree_view_broken_files.add_controller(&evk_tree_view_broken_files); let evk_tree_view_bad_extensions: EventControllerKey = EventControllerKey::new(); tree_view_bad_extensions.add_controller(&evk_tree_view_bad_extensions); let gc_tree_view_duplicate_finder: GestureClick = GestureClick::new(); tree_view_duplicate_finder.add_controller(&gc_tree_view_duplicate_finder); let gc_tree_view_empty_folder_finder: GestureClick = GestureClick::new(); tree_view_empty_folder_finder.add_controller(&gc_tree_view_empty_folder_finder); let gc_tree_view_empty_files_finder: GestureClick = GestureClick::new(); tree_view_empty_files_finder.add_controller(&gc_tree_view_empty_files_finder); let gc_tree_view_temporary_files_finder: GestureClick = GestureClick::new(); tree_view_temporary_files_finder.add_controller(&gc_tree_view_temporary_files_finder); let gc_tree_view_big_files_finder: GestureClick = GestureClick::new(); tree_view_big_files_finder.add_controller(&gc_tree_view_big_files_finder); let gc_tree_view_similar_images_finder: GestureClick = GestureClick::new(); tree_view_similar_images_finder.add_controller(&gc_tree_view_similar_images_finder); let gc_tree_view_similar_videos_finder: GestureClick = GestureClick::new(); tree_view_similar_videos_finder.add_controller(&gc_tree_view_similar_videos_finder); let gc_tree_view_same_music_finder: GestureClick = GestureClick::new(); tree_view_same_music_finder.add_controller(&gc_tree_view_same_music_finder); let gc_tree_view_invalid_symlinks: GestureClick = GestureClick::new(); tree_view_invalid_symlinks.add_controller(&gc_tree_view_invalid_symlinks); let gc_tree_view_broken_files: GestureClick = GestureClick::new(); tree_view_broken_files.add_controller(&gc_tree_view_broken_files); let gc_tree_view_bad_extensions: GestureClick = GestureClick::new(); tree_view_bad_extensions.add_controller(&gc_tree_view_bad_extensions); let combo_box_duplicate_check_method: ComboBoxText = builder.object("combo_box_duplicate_check_method").unwrap(); let combo_box_duplicate_hash_type: ComboBoxText = builder.object("combo_box_duplicate_hash_type").unwrap(); let entry_big_files_number: Entry = builder.object("entry_big_files_number").unwrap(); //// Check Buttons let check_button_duplicate_case_sensitive_name: CheckButton = builder.object("check_button_duplicate_case_sensitive_name").unwrap(); let check_button_music_title: CheckButton = builder.object("check_button_music_title").unwrap(); let check_button_music_artist: CheckButton = builder.object("check_button_music_artist").unwrap(); let check_button_music_year: CheckButton = builder.object("check_button_music_year").unwrap(); let check_button_music_bitrate: CheckButton = builder.object("check_button_music_bitrate").unwrap(); let check_button_music_genre: CheckButton = builder.object("check_button_music_genre").unwrap(); let check_button_music_length: CheckButton = builder.object("check_button_music_length").unwrap(); let check_button_music_approximate_comparison: CheckButton = builder.object("check_button_music_approximate_comparison").unwrap(); //// Radio Buttons let scale_similarity_similar_images: Scale = builder.object("scale_similarity_similar_images").unwrap(); let scale_similarity_similar_videos: Scale = builder.object("scale_similarity_similar_videos").unwrap(); let check_button_image_fast_compare: CheckButton = builder.object("check_button_image_fast_compare").unwrap(); let combo_box_image_resize_algorithm: ComboBoxText = builder.object("combo_box_image_resize_algorithm").unwrap(); let combo_box_image_hash_algorithm: ComboBoxText = builder.object("combo_box_image_hash_algorithm").unwrap(); let combo_box_image_hash_size: ComboBoxText = builder.object("combo_box_image_hash_size").unwrap(); let check_button_image_ignore_same_size: CheckButton = builder.object("check_button_image_ignore_same_size").unwrap(); let check_button_video_ignore_same_size: CheckButton = builder.object("check_button_video_ignore_same_size").unwrap(); let label_similar_images_minimal_similarity: Label = builder.object("label_similar_images_minimal_similarity").unwrap(); let label_duplicate_check_method: Label = builder.object("label_duplicate_check_method").unwrap(); let label_duplicate_hash_type: Label = builder.object("label_duplicate_hash_type").unwrap(); let label_big_shown_files: Label = builder.object("label_big_shown_files").unwrap(); let label_image_resize_algorithm: Label = builder.object("label_image_resize_algorithm").unwrap(); let label_image_hash_type: Label = builder.object("label_image_hash_type").unwrap(); let label_image_hash_size: Label = builder.object("label_image_hash_size").unwrap(); let label_image_similarity: Label = builder.object("label_image_similarity").unwrap(); let label_image_similarity_max: Label = builder.object("label_image_similarity_max").unwrap(); let label_video_similarity: Label = builder.object("label_video_similarity").unwrap(); let label_video_similarity_min: Label = builder.object("label_video_similarity_min").unwrap(); let label_video_similarity_max: Label = builder.object("label_video_similarity_max").unwrap(); let image_preview_similar_images: Image = builder.object("image_preview_similar_images").unwrap(); let image_preview_duplicates: Image = builder.object("image_preview_duplicates").unwrap(); Self { notebook_main, scrolled_window_duplicate_finder, scrolled_window_empty_folder_finder, scrolled_window_empty_files_finder, scrolled_window_temporary_files_finder, scrolled_window_big_files_finder, scrolled_window_similar_images_finder, scrolled_window_similar_videos_finder, scrolled_window_same_music_finder, scrolled_window_invalid_symlinks, scrolled_window_broken_files, scrolled_window_bad_extensions, tree_view_duplicate_finder, tree_view_empty_folder_finder, tree_view_empty_files_finder, tree_view_temporary_files_finder, tree_view_big_files_finder, tree_view_similar_images_finder, tree_view_similar_videos_finder, tree_view_same_music_finder, tree_view_invalid_symlinks, tree_view_broken_files, tree_view_bad_extensions, evk_tree_view_duplicate_finder, evk_tree_view_empty_folder_finder, evk_tree_view_empty_files_finder, evk_tree_view_temporary_files_finder, evk_tree_view_big_files_finder, evk_tree_view_similar_images_finder, evk_tree_view_similar_videos_finder, evk_tree_view_same_music_finder, evk_tree_view_invalid_symlinks, evk_tree_view_broken_files, entry_big_files_number, check_button_music_title, check_button_music_artist, check_button_music_year, check_button_music_bitrate, check_button_music_genre, check_button_music_length, check_button_music_approximate_comparison, scale_similarity_similar_images, scale_similarity_similar_videos, check_button_image_ignore_same_size, label_similar_images_minimal_similarity, label_duplicate_check_method, label_duplicate_hash_type, combo_box_duplicate_check_method, label_big_shown_files, label_image_resize_algorithm, label_image_hash_type, label_image_hash_size, combo_box_image_resize_algorithm, combo_box_image_hash_algorithm, label_image_similarity, label_image_similarity_max, label_video_similarity, label_video_similarity_min, label_video_similarity_max, image_preview_similar_images, image_preview_duplicates, combo_box_duplicate_hash_type, combo_box_image_hash_size, check_button_video_ignore_same_size, check_button_image_fast_compare, check_button_duplicate_case_sensitive_name, evk_tree_view_bad_extensions, gc_tree_view_duplicate_finder, gc_tree_view_empty_folder_finder, gc_tree_view_empty_files_finder, gc_tree_view_temporary_files_finder, gc_tree_view_big_files_finder, gc_tree_view_similar_images_finder, gc_tree_view_similar_videos_finder, gc_tree_view_same_music_finder, gc_tree_view_invalid_symlinks, gc_tree_view_broken_files, gc_tree_view_bad_extensions, } } pub fn get_main_tree_views(&self) -> [TreeView; NUMBER_OF_NOTEBOOK_MAIN_TABS] { [ self.tree_view_duplicate_finder.clone(), self.tree_view_empty_folder_finder.clone(), self.tree_view_big_files_finder.clone(), self.tree_view_empty_files_finder.clone(), self.tree_view_temporary_files_finder.clone(), self.tree_view_similar_images_finder.clone(), self.tree_view_similar_videos_finder.clone(), self.tree_view_same_music_finder.clone(), self.tree_view_invalid_symlinks.clone(), self.tree_view_broken_files.clone(), self.tree_view_bad_extensions.clone(), ] } pub fn update_language(&self) { self.check_button_duplicate_case_sensitive_name.set_label(Some(&flg!("duplicate_case_sensitive_name"))); self.check_button_music_title.set_label(Some(&flg!("music_title_checkbox"))); self.check_button_music_artist.set_label(Some(&flg!("music_artist_checkbox"))); self.check_button_music_year.set_label(Some(&flg!("music_year_checkbox"))); self.check_button_music_bitrate.set_label(Some(&flg!("music_bitrate_checkbox"))); self.check_button_music_genre.set_label(Some(&flg!("music_genre_checkbox"))); self.check_button_music_length.set_label(Some(&flg!("music_length_checkbox"))); self.check_button_music_approximate_comparison.set_label(Some(&flg!("music_comparison_checkbox"))); self.check_button_music_approximate_comparison .set_tooltip_text(Some(&flg!("music_comparison_checkbox_tooltip"))); self.label_duplicate_check_method.set_label(&flg!("main_label_check_method")); self.label_duplicate_hash_type.set_label(&flg!("main_label_hash_type")); self.label_big_shown_files.set_label(&flg!("main_label_shown_files")); self.label_image_resize_algorithm.set_label(&flg!("main_label_resize_algorithm")); self.label_image_hash_type.set_label(&flg!("main_label_hash_type")); self.label_image_hash_size.set_label(&flg!("main_label_hash_size")); self.label_image_similarity.set_label(&flg!("main_label_similarity")); self.label_image_similarity_max.set_label(&fnc_get_similarity_very_high()); self.label_video_similarity.set_label(&flg!("main_label_similarity")); self.label_video_similarity_min.set_label(&fnc_get_similarity_minimal()); self.label_video_similarity_max.set_label(&fnc_get_similarity_very_high()); self.label_duplicate_check_method.set_tooltip_text(Some(&flg!("duplicate_check_method_tooltip"))); self.combo_box_duplicate_check_method.set_tooltip_text(Some(&flg!("duplicate_check_method_tooltip"))); self.label_duplicate_hash_type.set_tooltip_text(Some(&flg!("duplicate_hash_type_tooltip"))); self.combo_box_duplicate_hash_type.set_tooltip_text(Some(&flg!("duplicate_hash_type_tooltip"))); self.check_button_duplicate_case_sensitive_name .set_tooltip_text(Some(&flg!("duplicate_case_sensitive_name_tooltip"))); self.combo_box_image_hash_size.set_tooltip_text(Some(&flg!("image_hash_size_tooltip"))); self.label_image_hash_size.set_tooltip_text(Some(&flg!("image_hash_size_tooltip"))); self.combo_box_image_resize_algorithm.set_tooltip_text(Some(&flg!("image_resize_filter_tooltip"))); self.label_image_resize_algorithm.set_tooltip_text(Some(&flg!("image_resize_filter_tooltip"))); self.combo_box_image_hash_algorithm.set_tooltip_text(Some(&flg!("image_hash_alg_tooltip"))); self.label_image_hash_type.set_tooltip_text(Some(&flg!("image_hash_alg_tooltip"))); self.check_button_image_ignore_same_size .set_tooltip_text(Some(&flg!("check_button_general_same_size_tooltip"))); self.check_button_video_ignore_same_size .set_tooltip_text(Some(&flg!("check_button_general_same_size_tooltip"))); self.check_button_image_ignore_same_size.set_label(Some(&flg!("check_button_general_same_size"))); self.check_button_video_ignore_same_size.set_label(Some(&flg!("check_button_general_same_size"))); self.check_button_image_fast_compare.set_label(Some(&flg!("main_notebook_image_fast_compare"))); self.check_button_image_fast_compare .set_tooltip_text(Some(&flg!("main_notebook_image_fast_compare_tooltip"))); { let hash_size_index = self.combo_box_image_hash_size.active().unwrap() as usize; let hash_size = IMAGES_HASH_SIZE_COMBO_BOX[hash_size_index]; match hash_size { 8 => { self.label_similar_images_minimal_similarity .set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[0][5]), 8)); } 16 => { self.label_similar_images_minimal_similarity .set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[1][5]), 16)); } 32 => { self.label_similar_images_minimal_similarity .set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[2][5]), 32)); } 64 => { self.label_similar_images_minimal_similarity .set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[3][5]), 64)); } _ => panic!(), } } let vec_children: Vec = get_all_children(&self.notebook_main); let vec_children: Vec = get_all_children(&vec_children[1]); // Change name of main notebook tabs for (main_enum, fl_thing) in [ (NotebookMainEnum::Duplicate as usize, flg!("main_notebook_duplicates")), (NotebookMainEnum::EmptyDirectories as usize, flg!("main_notebook_empty_directories")), (NotebookMainEnum::BigFiles as usize, flg!("main_notebook_big_files")), (NotebookMainEnum::EmptyFiles as usize, flg!("main_notebook_empty_files")), (NotebookMainEnum::Temporary as usize, flg!("main_notebook_temporary")), (NotebookMainEnum::SimilarImages as usize, flg!("main_notebook_similar_images")), (NotebookMainEnum::SimilarVideos as usize, flg!("main_notebook_similar_videos")), (NotebookMainEnum::SameMusic as usize, flg!("main_notebook_same_music")), (NotebookMainEnum::Symlinks as usize, flg!("main_notebook_symlinks")), (NotebookMainEnum::BrokenFiles as usize, flg!("main_notebook_broken_files")), (NotebookMainEnum::BadExtensions as usize, flg!("main_notebook_bad_extensions")), ] { self.notebook_main .tab_label(&vec_children[main_enum]) .unwrap() .downcast::