diff --git a/czkawka_gui/gtk3togtk4migration.md b/czkawka_gui/gtk3togtk4migration.md index 5b78a7bb0..f741fe6e0 100644 --- a/czkawka_gui/gtk3togtk4migration.md +++ b/czkawka_gui/gtk3togtk4migration.md @@ -140,6 +140,7 @@ self.notebook_upper.children() - children are not visible tree_view.connect_button_release_event(move |tree_view, _event| - is missing missing move in closures above - save_configuration(false, &gui_data.upper_notebook and below et stop_sender = gui_data.stop_sender.clone(); missing resize, what should I do? - - +- change upper window from paned to normal box, because paned behave strange +- Convert FileDialog to FileDialogNative +- Convert FileDialog to be async diff --git a/czkawka_gui/src/gui_main_notebook.rs b/czkawka_gui/src/gui_main_notebook.rs index 874cbbc31..ba047194e 100644 --- a/czkawka_gui/src/gui_main_notebook.rs +++ b/czkawka_gui/src/gui_main_notebook.rs @@ -1,9 +1,10 @@ use crate::fl; use crate::help_combo_box::IMAGES_HASH_SIZE_COMBO_BOX; +use crate::help_functions::get_all_children; use czkawka_core::similar_images::{get_string_from_similarity, Similarity, SIMILAR_VALUES}; use gtk4::prelude::*; -use gtk4::Inhibit; use gtk4::{EventControllerKey, TreeView}; +use gtk4::{Inhibit, Widget}; use crate::notebook_enums::{NotebookMainEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS}; @@ -45,6 +46,8 @@ pub struct GuiMainNotebook { pub evk_tree_view_invalid_symlinks: gtk4::EventControllerKey, pub evk_tree_view_broken_files: gtk4::EventControllerKey, + pub gc_tree_view_duplicate_finder: gtk4::GestureClick, + // General // Duplicate @@ -122,38 +125,40 @@ impl GuiMainNotebook { let tree_view_invalid_symlinks: gtk4::TreeView = TreeView::new(); let tree_view_broken_files: gtk4::TreeView = TreeView::new(); - let evk_tree_view_duplicate_finder: gtk4::EventControllerKey = EventControllerKey::new(); - let evk_tree_view_empty_folder_finder: gtk4::EventControllerKey = EventControllerKey::new(); - let evk_tree_view_empty_files_finder: gtk4::EventControllerKey = EventControllerKey::new(); - let evk_tree_view_temporary_files_finder: gtk4::EventControllerKey = EventControllerKey::new(); - let evk_tree_view_big_files_finder: gtk4::EventControllerKey = EventControllerKey::new(); - let evk_tree_view_similar_images_finder: gtk4::EventControllerKey = EventControllerKey::new(); - let evk_tree_view_similar_videos_finder: gtk4::EventControllerKey = EventControllerKey::new(); - let evk_tree_view_same_music_finder: gtk4::EventControllerKey = EventControllerKey::new(); - let evk_tree_view_invalid_symlinks: gtk4::EventControllerKey = EventControllerKey::new(); - let evk_tree_view_broken_files: gtk4::EventControllerKey = EventControllerKey::new(); - - // TODO GTK 4 // let evk_tree_view_duplicate_finder: gtk4::EventControllerKey = EventControllerKey::new(); - // tree_view_duplicate_finder.add_controller(&evk_tree_view_duplicate_finder); // let evk_tree_view_empty_folder_finder: gtk4::EventControllerKey = EventControllerKey::new(); - // tree_view_empty_folder_finder.add_controller(&evk_tree_view_empty_folder_finder); // let evk_tree_view_empty_files_finder: gtk4::EventControllerKey = EventControllerKey::new(); - // tree_view_empty_files_finder.add_controller(&evk_tree_view_empty_files_finder); // let evk_tree_view_temporary_files_finder: gtk4::EventControllerKey = EventControllerKey::new(); - // tree_view_temporary_files_finder.add_controller(&evk_tree_view_temporary_files_finder); // let evk_tree_view_big_files_finder: gtk4::EventControllerKey = EventControllerKey::new(); - // tree_view_big_files_finder.add_controller(&evk_tree_view_big_files_finder); // let evk_tree_view_similar_images_finder: gtk4::EventControllerKey = EventControllerKey::new(); - // tree_view_similar_images_finder.add_controller(&evk_tree_view_similar_images_finder); // let evk_tree_view_similar_videos_finder: gtk4::EventControllerKey = EventControllerKey::new(); - // tree_view_similar_videos_finder.add_controller(&evk_tree_view_similar_videos_finder); // let evk_tree_view_same_music_finder: gtk4::EventControllerKey = EventControllerKey::new(); - // tree_view_same_music_finder.add_controller(&evk_tree_view_same_music_finder); // let evk_tree_view_invalid_symlinks: gtk4::EventControllerKey = EventControllerKey::new(); - // tree_view_invalid_symlinks.add_controller(&evk_tree_view_invalid_symlinks); // let evk_tree_view_broken_files: gtk4::EventControllerKey = EventControllerKey::new(); - // tree_view_broken_files.add_controller(&evk_tree_view_broken_files); + + let gc_tree_view_duplicate_finder: gtk4::GestureClick = gtk4::GestureClick::new(); + + // TODO GTK 4 + let evk_tree_view_duplicate_finder: gtk4::EventControllerKey = EventControllerKey::new(); + // tree_view_duplicate_finder.add_controller(&evk_tree_view_duplicate_finder); + let evk_tree_view_empty_folder_finder: gtk4::EventControllerKey = EventControllerKey::new(); + tree_view_empty_folder_finder.add_controller(&evk_tree_view_empty_folder_finder); + let evk_tree_view_empty_files_finder: gtk4::EventControllerKey = EventControllerKey::new(); + tree_view_empty_files_finder.add_controller(&evk_tree_view_empty_files_finder); + let evk_tree_view_temporary_files_finder: gtk4::EventControllerKey = EventControllerKey::new(); + tree_view_temporary_files_finder.add_controller(&evk_tree_view_temporary_files_finder); + let evk_tree_view_big_files_finder: gtk4::EventControllerKey = EventControllerKey::new(); + tree_view_big_files_finder.add_controller(&evk_tree_view_big_files_finder); + let evk_tree_view_similar_images_finder: gtk4::EventControllerKey = EventControllerKey::new(); + tree_view_similar_images_finder.add_controller(&evk_tree_view_similar_images_finder); + let evk_tree_view_similar_videos_finder: gtk4::EventControllerKey = EventControllerKey::new(); + tree_view_similar_videos_finder.add_controller(&evk_tree_view_similar_videos_finder); + let evk_tree_view_same_music_finder: gtk4::EventControllerKey = EventControllerKey::new(); + tree_view_same_music_finder.add_controller(&evk_tree_view_same_music_finder); + let evk_tree_view_invalid_symlinks: gtk4::EventControllerKey = EventControllerKey::new(); + tree_view_invalid_symlinks.add_controller(&evk_tree_view_invalid_symlinks); + let evk_tree_view_broken_files: gtk4::EventControllerKey = EventControllerKey::new(); + tree_view_broken_files.add_controller(&evk_tree_view_broken_files); let combo_box_duplicate_check_method: gtk4::ComboBoxText = builder.object("combo_box_duplicate_check_method").unwrap(); let combo_box_duplicate_hash_type: gtk4::ComboBoxText = builder.object("combo_box_duplicate_hash_type").unwrap(); @@ -259,6 +264,7 @@ impl GuiMainNotebook { combo_box_duplicate_hash_type, combo_box_image_hash_size, check_button_video_ignore_same_size, + gc_tree_view_duplicate_finder, } } @@ -340,21 +346,28 @@ impl GuiMainNotebook { // Change name of main notebook tabs // let vec_children: Vec = self.notebook_main.children(); - // - // for (main_enum, fl_thing) in [ - // (NotebookMainEnum::Duplicate as usize, fl!("main_notebook_duplicates")), - // (NotebookMainEnum::EmptyDirectories as usize, fl!("main_notebook_empty_directories")), - // (NotebookMainEnum::BigFiles as usize, fl!("main_notebook_big_files")), - // (NotebookMainEnum::EmptyFiles as usize, fl!("main_notebook_empty_files")), - // (NotebookMainEnum::Temporary as usize, fl!("main_notebook_temporary")), - // (NotebookMainEnum::SimilarImages as usize, fl!("main_notebook_similar_images")), - // (NotebookMainEnum::SimilarVideos as usize, fl!("main_notebook_similar_videos")), - // (NotebookMainEnum::SameMusic as usize, fl!("main_notebook_same_music")), - // (NotebookMainEnum::Symlinks as usize, fl!("main_notebook_symlinks")), - // (NotebookMainEnum::BrokenFiles as usize, fl!("main_notebook_broken_files")), - // ] { - // self.notebook_main.tab_label(&vec_children[main_enum]).unwrap().downcast::().unwrap().set_text(&fl_thing); - // } + // AAAAAAAAAAAAAAAAAAAAAAA + let mut vec_children: Vec = get_all_children(&self.notebook_main.clone().upcast::()); + let mut vec_children2: Vec = get_all_children(&vec_children[1]); + println!("{:?}", vec_children); + println!("{:?}", get_all_children(&vec_children[1])); + println!("{:?}", self.notebook_main.pages()); + println!("{:?}", self.notebook_main.n_pages()); + + for (main_enum, fl_thing) in [ + (NotebookMainEnum::Duplicate as usize, fl!("main_notebook_duplicates")), + (NotebookMainEnum::EmptyDirectories as usize, fl!("main_notebook_empty_directories")), + (NotebookMainEnum::BigFiles as usize, fl!("main_notebook_big_files")), + (NotebookMainEnum::EmptyFiles as usize, fl!("main_notebook_empty_files")), + (NotebookMainEnum::Temporary as usize, fl!("main_notebook_temporary")), + (NotebookMainEnum::SimilarImages as usize, fl!("main_notebook_similar_images")), + (NotebookMainEnum::SimilarVideos as usize, fl!("main_notebook_similar_videos")), + (NotebookMainEnum::SameMusic as usize, fl!("main_notebook_same_music")), + (NotebookMainEnum::Symlinks as usize, fl!("main_notebook_symlinks")), + (NotebookMainEnum::BrokenFiles as usize, fl!("main_notebook_broken_files")), + ] { + self.notebook_main.tab_label(&vec_children2[main_enum]).unwrap().downcast::().unwrap().set_text(&fl_thing); + } // Change names of columns let names_of_columns = [ diff --git a/czkawka_gui/src/help_functions.rs b/czkawka_gui/src/help_functions.rs index 4b8ba3815..d2b17edf8 100644 --- a/czkawka_gui/src/help_functions.rs +++ b/czkawka_gui/src/help_functions.rs @@ -555,3 +555,19 @@ pub fn get_custom_label_from_label_with_image(button: >k4::Button) -> gtk4::La pub fn get_custom_label_from_label_with_image_menu_button(button: >k4::MenuButton) -> gtk4::Label { gtk4::Label::new(None) } + +pub fn get_all_children(wid : >k4::Widget) -> Vec{ + let mut vector = vec![]; + if let Some(mut child) = wid.first_child(){ + vector.push(child.clone()); + loop{ + child = match child.next_sibling(){ + Some(t) => t, + None => break + }; + vector.push(child.clone()); + } + } + + return vector; +} \ No newline at end of file diff --git a/czkawka_gui/src/initialize_gui.rs b/czkawka_gui/src/initialize_gui.rs index 8cf1e6522..91613147f 100644 --- a/czkawka_gui/src/initialize_gui.rs +++ b/czkawka_gui/src/initialize_gui.rs @@ -153,9 +153,9 @@ pub fn initialize_gui(gui_data: &mut GuiData) { { // EVK - let evk = EventControllerKey::new(); + let evk = gui_data.main_notebook.evk_tree_view_duplicate_finder.clone(); + tree_view.add_controller(&evk); evk.connect_key_pressed(opening_enter_function_ported); - gui_data.main_notebook.evk_tree_view_duplicate_finder = evk; } { // Other connects @@ -164,7 +164,28 @@ pub fn initialize_gui(gui_data: &mut GuiData) { let image_preview_duplicates = gui_data.main_notebook.image_preview_duplicates.clone(); let preview_path = gui_data.preview_path.clone(); - //tree_view.connect_button_press_event(opening_double_click_function); + /////////////A AAAAAAAAAAAAAAAAAAAAA + + let gc_tree_view_duplicate_finder = gui_data.main_notebook.gc_tree_view_duplicate_finder.clone(); + tree_view.add_controller(&gc_tree_view_duplicate_finder); + gc_tree_view_duplicate_finder.set_button(0); + gc_tree_view_duplicate_finder.connect_pressed(opening_double_click_function); + + gc_tree_view_duplicate_finder.connect_pressed(move |gtk_gesture_left_click, _, _, _| { + let tree_view = gtk_gesture_left_click.widget().unwrap().downcast::().unwrap(); + let nb_object = &NOTEBOOKS_INFOS[NotebookMainEnum::Duplicate as usize]; + let preview_path = preview_path.clone(); + show_preview( + &tree_view, + &text_view_errors, + &check_button_settings_show_preview_duplicates, + &image_preview_duplicates, + preview_path, + nb_object.column_path, + nb_object.column_name, + ); + }); + // tree_view.connect_button_press_event(opening_double_click_function); // tree_view.connect_button_release_event(move |tree_view, _event| { // let nb_object = &NOTEBOOKS_INFOS[NotebookMainEnum::Duplicate as usize]; // let preview_path = preview_path.clone(); diff --git a/czkawka_gui/src/opening_selecting_records.rs b/czkawka_gui/src/opening_selecting_records.rs index 4e7ac9174..4c964648a 100644 --- a/czkawka_gui/src/opening_selecting_records.rs +++ b/czkawka_gui/src/opening_selecting_records.rs @@ -1,7 +1,7 @@ use crate::help_functions::*; use gdk4::ModifierType; use gtk4::prelude::*; -use gtk4::Inhibit; +use gtk4::{GestureClick, Inhibit}; // TODO add option to open files and folders from context menu activated by pressing ONCE with right mouse button @@ -28,6 +28,19 @@ pub fn opening_enter_function_ported(event_controller: >k4::EventControllerKey Inhibit(false) // True catches signal, and don't send it to function, e.g. up button is catched and don't move selection } +pub fn opening_double_click_function(gesture_click: &GestureClick, number_of_clicks: i32, b: f64, c: f64) { + let tree_view = gesture_click.widget().unwrap().downcast::().unwrap(); + + let nt_object = get_notebook_object_from_tree_view(&tree_view); + if number_of_clicks == 2 { + if gesture_click.current_button() == 1 { + common_open_function(&tree_view, nt_object.column_name, nt_object.column_path, OpenMode::PathAndName); + } else if gesture_click.current_button() == 3 { + common_open_function(&tree_view, nt_object.column_name, nt_object.column_path, OpenMode::OnlyPath); + } + } +} + // pub fn opening_double_click_function(tree_view: >k4::TreeView, event: &gdk4::EventButton) -> gtk4::Inhibit { // // let nt_object = get_notebook_object_from_tree_view(tree_view); // // if event.event_type() == gdk4::EventType::DoubleButtonPress && event.button() == 1 { diff --git a/i18n/en/czkawka_gui.ftl b/i18n/en/czkawka_gui.ftl index 4cca85c1a..26bfe42ed 100644 --- a/i18n/en/czkawka_gui.ftl +++ b/i18n/en/czkawka_gui.ftl @@ -62,7 +62,7 @@ image_hash_alg_tooltip = main_notebook_duplicates = Duplicate Files main_notebook_empty_directories = Empty Directories -main_notebook_big_files = Big Files +main_notebook_big_files = BigTranslated Files main_notebook_empty_files = Empty Files main_notebook_temporary = Temporary Files main_notebook_similar_images = Similar Images