diff --git a/czkawka_gui/src/connect_button_delete.rs b/czkawka_gui/src/connect_button_delete.rs index af50e2e..e6ed908 100644 --- a/czkawka_gui/src/connect_button_delete.rs +++ b/czkawka_gui/src/connect_button_delete.rs @@ -36,6 +36,8 @@ pub async fn delete_things(gui_data: GuiData) { let check_button_settings_use_trash = gui_data.settings.check_button_settings_use_trash.clone(); + let preview_path = gui_data.preview_path.clone(); + let text_view_errors = gui_data.text_view_errors.clone(); if !check_if_can_delete_files(&check_button_settings_confirm_deletion, &window_main).await { return; @@ -66,11 +68,13 @@ pub async fn delete_things(gui_data: GuiData) { } match &nb_object.notebook_type { - NotebookMainEnum::SimilarImages => { - image_preview_similar_images.hide(); - } - NotebookMainEnum::Duplicate => { - image_preview_duplicates.hide(); + NotebookMainEnum::SimilarImages | NotebookMainEnum::Duplicate => { + if nb_object.notebook_type == NotebookMainEnum::SimilarImages { + image_preview_similar_images.hide(); + } else { + image_preview_duplicates.hide(); + } + *preview_path.borrow_mut() = "".to_string(); } _ => {} } diff --git a/czkawka_gui/src/connect_button_hardlink.rs b/czkawka_gui/src/connect_button_hardlink.rs index 7db2695..9344b40 100644 --- a/czkawka_gui/src/connect_button_hardlink.rs +++ b/czkawka_gui/src/connect_button_hardlink.rs @@ -20,6 +20,7 @@ pub fn connect_button_hardlink_symlink(gui_data: &GuiData) { let image_preview_duplicates = gui_data.main_notebook.image_preview_duplicates.clone(); let text_view_errors = gui_data.text_view_errors.clone(); + let preview_path = gui_data.preview_path.clone(); buttons_hardlink.connect_clicked(move |_| { let nb_number = notebook_main.current_page().unwrap(); @@ -30,11 +31,13 @@ pub fn connect_button_hardlink_symlink(gui_data: &GuiData) { hardlink_symlink(tree_view, nb_object.column_name, nb_object.column_path, column_color, nb_object.column_selection, true, &text_view_errors); match &nb_object.notebook_type { - NotebookMainEnum::SimilarImages => { - image_preview_similar_images.hide(); - } - NotebookMainEnum::Duplicate => { - image_preview_duplicates.hide(); + NotebookMainEnum::SimilarImages | NotebookMainEnum::Duplicate => { + if nb_object.notebook_type == NotebookMainEnum::SimilarImages { + image_preview_similar_images.hide(); + } else { + image_preview_duplicates.hide(); + } + *preview_path.borrow_mut() = "".to_string(); } _ => {} } @@ -50,6 +53,8 @@ pub fn connect_button_hardlink_symlink(gui_data: &GuiData) { let text_view_errors = gui_data.text_view_errors.clone(); + let preview_path = gui_data.preview_path.clone(); + buttons_symlink.connect_clicked(move |_| { let nb_number = notebook_main.current_page().unwrap(); let tree_view = &main_tree_views[nb_number as usize]; @@ -59,11 +64,13 @@ pub fn connect_button_hardlink_symlink(gui_data: &GuiData) { hardlink_symlink(tree_view, nb_object.column_name, nb_object.column_path, column_color, nb_object.column_selection, false, &text_view_errors); match &nb_object.notebook_type { - NotebookMainEnum::SimilarImages => { - image_preview_similar_images.hide(); - } - NotebookMainEnum::Duplicate => { - image_preview_duplicates.hide(); + NotebookMainEnum::SimilarImages | NotebookMainEnum::Duplicate => { + if nb_object.notebook_type == NotebookMainEnum::SimilarImages { + image_preview_similar_images.hide(); + } else { + image_preview_duplicates.hide(); + } + *preview_path.borrow_mut() = "".to_string(); } _ => {} } diff --git a/czkawka_gui/src/connect_button_move.rs b/czkawka_gui/src/connect_button_move.rs index 63fbb6f..34a91d2 100644 --- a/czkawka_gui/src/connect_button_move.rs +++ b/czkawka_gui/src/connect_button_move.rs @@ -21,6 +21,8 @@ pub fn connect_button_move(gui_data: &GuiData) { let window_main = gui_data.window_main.clone(); + let preview_path = gui_data.preview_path.clone(); + buttons_move.connect_clicked(move |_| { let nb_number = notebook_main.current_page().unwrap(); let tree_view = &main_tree_views[nb_number as usize]; @@ -38,11 +40,13 @@ pub fn connect_button_move(gui_data: &GuiData) { ); match &nb_object.notebook_type { - NotebookMainEnum::SimilarImages => { - image_preview_similar_images.hide(); - } - NotebookMainEnum::Duplicate => { - image_preview_duplicates.hide(); + NotebookMainEnum::SimilarImages | NotebookMainEnum::Duplicate => { + if nb_object.notebook_type == NotebookMainEnum::SimilarImages { + image_preview_similar_images.hide(); + } else { + image_preview_duplicates.hide(); + } + *preview_path.borrow_mut() = "".to_string(); } _ => {} } diff --git a/czkawka_gui/src/gui_data.rs b/czkawka_gui/src/gui_data.rs index 14af608..240bf86 100644 --- a/czkawka_gui/src/gui_data.rs +++ b/czkawka_gui/src/gui_data.rs @@ -67,6 +67,8 @@ pub struct GuiData { pub shared_same_invalid_symlinks: Rc>, pub shared_broken_files_state: Rc>, + pub preview_path: Rc>, + //// Entry pub entry_info: gtk::Entry, @@ -147,6 +149,8 @@ impl GuiData { let shared_same_invalid_symlinks: Rc> = Rc::new(RefCell::new(InvalidSymlinks::new())); let shared_broken_files_state: Rc> = Rc::new(RefCell::new(BrokenFiles::new())); + let preview_path: Rc> = Rc::new(RefCell::new("".to_string())); + //// Entry let entry_info: gtk::Entry = builder.object("entry_info").unwrap(); @@ -183,6 +187,7 @@ impl GuiData { shared_same_music_state, shared_same_invalid_symlinks, shared_broken_files_state, + preview_path, entry_info, text_view_errors, scrolled_window_errors, diff --git a/czkawka_gui/src/help_functions.rs b/czkawka_gui/src/help_functions.rs index e6bec45..ec40038 100644 --- a/czkawka_gui/src/help_functions.rs +++ b/czkawka_gui/src/help_functions.rs @@ -23,12 +23,12 @@ pub const KEY_DELETE: u32 = 119; pub const KEY_ENTER: u32 = 36; pub const KEY_SPACE: u32 = 65; -pub const KEY_DOWN: u32 = 116; -pub const KEY_UP: u32 = 111; -pub const KEY_PG_DOWN: u32 = 117; -pub const KEY_PG_UP: u32 = 112; -pub const KEY_HOME: u32 = 115; -pub const KEY_END: u32 = 110; +// pub const KEY_DOWN: u32 = 116; +// pub const KEY_UP: u32 = 111; +// pub const KEY_PG_DOWN: u32 = 117; +// pub const KEY_PG_UP: u32 = 112; +// pub const KEY_HOME: u32 = 115; +// pub const KEY_END: u32 = 110; #[derive(Eq, PartialEq)] pub enum PopoverTypes { diff --git a/czkawka_gui/src/initialize_gui.rs b/czkawka_gui/src/initialize_gui.rs index baa3899..a1beca4 100644 --- a/czkawka_gui/src/initialize_gui.rs +++ b/czkawka_gui/src/initialize_gui.rs @@ -1,6 +1,9 @@ +use std::cell::RefCell; use std::cmp::Ordering; use std::fs; +use std::ops::Deref; use std::path::Path; +use std::rc::Rc; use directories_next::ProjectDirs; use gtk::prelude::*; @@ -108,11 +111,21 @@ pub fn initialize_gui(gui_data: &mut GuiData) { let check_button_settings_show_preview_duplicates = gui_data.settings.check_button_settings_show_preview_duplicates.clone(); 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); tree_view.connect_button_release_event(move |tree_view, _event| { let nb_object = &NOTEBOOKS_INFOS[NotebookMainEnum::Duplicate as usize]; - show_preview(tree_view, &text_view_errors, &check_button_settings_show_preview_duplicates, &image_preview_duplicates, nb_object.column_path, nb_object.column_name); + 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, + ); gtk::Inhibit(false) }); @@ -248,16 +261,19 @@ pub fn initialize_gui(gui_data: &mut GuiData) { { // Other connects let check_button_settings_show_preview_similar_images = gui_data.settings.check_button_settings_show_preview_similar_images.clone(); + let preview_path = gui_data.preview_path.clone(); tree_view.connect_button_press_event(opening_double_click_function); let text_view_errors = gui_data.text_view_errors.clone(); tree_view.connect_button_release_event(move |tree_view, _event| { let nb_object = &NOTEBOOKS_INFOS[NotebookMainEnum::SimilarImages as usize]; + let preview_path = preview_path.clone(); show_preview( tree_view, &text_view_errors, &check_button_settings_show_preview_similar_images, &image_preview_similar_images, + preview_path, nb_object.column_path, nb_object.column_name, ); @@ -387,6 +403,8 @@ pub fn initialize_gui(gui_data: &mut GuiData) { evk.connect_key_pressed(opening_enter_function_ported); gui_data.main_notebook.evk_tree_view_broken_files = evk; + tree_view.connect_button_press_event(opening_double_click_function); + tree_view.set_widget_name("tree_view_broken_files"); gui_data.main_notebook.tree_view_broken_files = tree_view.clone(); scrolled_window_broken_files.add(&tree_view); @@ -484,24 +502,23 @@ fn connect_event_buttons(gui_data: &GuiData) { let text_view_errors = gui_data.text_view_errors.clone(); let check_button_settings_show_preview_duplicates = gui_data.settings.check_button_settings_show_preview_duplicates.clone(); let image_preview_duplicates = gui_data.main_notebook.image_preview_duplicates.clone(); + let preview_path = gui_data.preview_path.clone(); + gui_data.main_notebook.evk_tree_view_duplicate_finder.connect_key_released(move |event_controller_key, _key_value, key_code, _modifier_type| { if key_code == KEY_DELETE { glib::MainContext::default().spawn_local(delete_things(gui_data_clone.clone())); } - - // Allowed keys for generating preview, - // LEFT, UP, RIGHT, DOWN, Pageup, pagedown, home, end - if [KEY_DOWN, KEY_UP, KEY_PG_DOWN, KEY_PG_UP, KEY_HOME, KEY_END].iter().any(|any_key| *any_key == key_code) { - let nb_object = &NOTEBOOKS_INFOS[NotebookMainEnum::Duplicate as usize]; - show_preview( - &event_controller_key.widget().unwrap().downcast::().unwrap(), - &text_view_errors, - &check_button_settings_show_preview_duplicates, - &image_preview_duplicates, - nb_object.column_path, - nb_object.column_name, - ); - } + let preview_path = preview_path.clone(); + let nb_object = &NOTEBOOKS_INFOS[NotebookMainEnum::Duplicate as usize]; + show_preview( + &event_controller_key.widget().unwrap().downcast::().unwrap(), + &text_view_errors, + &check_button_settings_show_preview_duplicates, + &image_preview_duplicates, + preview_path, + nb_object.column_path, + nb_object.column_name, + ); }); } // Empty Folder @@ -546,25 +563,23 @@ fn connect_event_buttons(gui_data: &GuiData) { let text_view_errors = gui_data.text_view_errors.clone(); let image_preview_similar_images = gui_data.main_notebook.image_preview_similar_images.clone(); let gui_data_clone = gui_data.clone(); + let preview_path = gui_data.preview_path.clone(); gui_data.main_notebook.evk_tree_view_similar_images_finder.connect_key_released(move |event_controller_key, _key_value, key_code, _modifier_type| { if key_code == KEY_DELETE { glib::MainContext::default().spawn_local(delete_things(gui_data_clone.clone())); } - - // Allowed keys for generating preview, - // LEFT, UP, RIGHT, DOWN, Pageup, pagedown, home, end - if [KEY_DOWN, KEY_UP, KEY_PG_DOWN, KEY_PG_UP, KEY_HOME, KEY_END].iter().any(|any_key| *any_key == key_code) { - let nb_object = &NOTEBOOKS_INFOS[NotebookMainEnum::SimilarImages as usize]; - show_preview( - &event_controller_key.widget().unwrap().downcast::().unwrap(), - &text_view_errors, - &check_button_settings_show_preview_similar_images, - &image_preview_similar_images, - nb_object.column_path, - nb_object.column_name, - ); - } + let preview_path = preview_path.clone(); + let nb_object = &NOTEBOOKS_INFOS[NotebookMainEnum::SimilarImages as usize]; + show_preview( + &event_controller_key.widget().unwrap().downcast::().unwrap(), + &text_view_errors, + &check_button_settings_show_preview_similar_images, + &image_preview_similar_images, + preview_path, + nb_object.column_path, + nb_object.column_name, + ); }); } // Empty Folder @@ -606,7 +621,7 @@ fn connect_event_buttons(gui_data: &GuiData) { } } -fn show_preview(tree_view: &TreeView, text_view_errors: &TextView, check_button_settings_show_preview: &CheckButton, image_preview_similar_images: &Image, column_path: i32, column_name: i32) { +fn show_preview(tree_view: &TreeView, text_view_errors: &TextView, check_button_settings_show_preview: &CheckButton, image_preview_similar_images: &Image, preview_path: Rc>, column_path: i32, column_name: i32) { let (selected_rows, tree_model) = tree_view.selection().selected_rows(); let mut created_image = false; @@ -639,6 +654,14 @@ fn show_preview(tree_view: &TreeView, text_view_errors: &TextView, check_button_ break 'dir; } + { + let preview_path = preview_path.borrow(); + let preview_path = preview_path.deref(); + if file_name == preview_path { + return; // Preview is already created, no need to recreate it + } + } + let img = match image::open(&file_name) { Ok(t) => t, Err(e) => { @@ -676,6 +699,12 @@ fn show_preview(tree_view: &TreeView, text_view_errors: &TextView, check_button_ } let string_dir = file_dir.to_string_lossy().to_string(); image_preview_similar_images.set_from_file(string_dir); + + { + let mut preview_path = preview_path.borrow_mut(); + *preview_path = file_name.to_string(); + } + if let Err(e) = fs::remove_file(&file_dir) { add_text_to_text_view(text_view_errors, format!("Failed to delete temporary image file to {}, reason {}", file_dir.display(), e).as_str()); break 'dir;