From 8c4c67e26fb7bd10a223502d9a2f1302b1fc454c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= <41945903+qarmin@users.noreply.github.com> Date: Wed, 1 Dec 2021 11:09:47 +0100 Subject: [PATCH] More GTK 4 related changes (#474) * More GTK 4 related changes * More changes * Change button to MenuButton --- czkawka_gui/src/connect_button_delete.rs | 28 +++++++-------- czkawka_gui/src/connect_button_hardlink.rs | 36 +++++++------------ czkawka_gui/src/connect_button_move.rs | 5 +-- czkawka_gui/src/connect_button_search.rs | 4 --- czkawka_gui/src/connect_button_select.rs | 4 +-- czkawka_gui/src/connect_button_stop.rs | 8 ++--- czkawka_gui/src/connect_header_buttons.rs | 6 ++-- czkawka_gui/src/connect_popovers.rs | 16 ++++----- .../src/connect_selection_of_directories.rs | 24 +++++-------- czkawka_gui/src/connect_settings.rs | 24 ++++--------- .../src/connect_similar_image_size_change.rs | 6 ++-- czkawka_gui/src/gui_about.rs | 6 ++-- czkawka_gui/src/gui_bottom_buttons.rs | 29 ++++++++------- czkawka_gui/src/gui_data.rs | 7 ++-- czkawka_gui/src/gui_main_notebook.rs | 24 ++++++++++++- czkawka_gui/src/gui_progress_dialog.rs | 6 ++-- czkawka_gui/src/help_functions.rs | 9 +++-- czkawka_gui/src/initialize_gui.rs | 2 +- czkawka_gui/ui/main_window.glade | 13 +++---- 19 files changed, 121 insertions(+), 136 deletions(-) diff --git a/czkawka_gui/src/connect_button_delete.rs b/czkawka_gui/src/connect_button_delete.rs index 9eb4be3..af50e2e 100644 --- a/czkawka_gui/src/connect_button_delete.rs +++ b/czkawka_gui/src/connect_button_delete.rs @@ -96,10 +96,10 @@ pub async fn check_if_can_delete_files(check_button_settings_confirm_deletion: & true } -fn create_dialog_ask_for_deletion(_window_main: >k::Window) -> (Dialog, CheckButton) { - let confirmation_dialog_delete = gtk::Dialog::builder().title("Delete confirmation").build(); - let button_ok = confirmation_dialog_delete.add_button("Ok", ResponseType::Ok); - confirmation_dialog_delete.add_button("Close", ResponseType::Cancel); +fn create_dialog_ask_for_deletion(window_main: >k::Window) -> (Dialog, CheckButton) { + let dialog = gtk::Dialog::builder().title("Delete confirmation").transient_for(window_main).build(); + let button_ok = dialog.add_button("Ok", ResponseType::Ok); + dialog.add_button("Close", ResponseType::Cancel); let label: gtk::Label = gtk::Label::new(Some("Are you sure that you want to delete files?")); let check_button: gtk::CheckButton = gtk::CheckButton::with_label("Ask next time"); @@ -108,18 +108,18 @@ fn create_dialog_ask_for_deletion(_window_main: >k::Window) -> (Dialog, CheckB button_ok.grab_focus(); - let internal_box = get_dialog_box_child(&confirmation_dialog_delete); + let internal_box = get_dialog_box_child(&dialog); internal_box.add(&label); internal_box.add(&check_button); - confirmation_dialog_delete.show_all(); - (confirmation_dialog_delete, check_button) + dialog.show_all(); + (dialog, check_button) } -fn create_dialog_group_deletion(_window_main: >k::Window) -> (Dialog, CheckButton) { - let confirmation_dialog_group_delete = gtk::Dialog::builder().title("Confirmation of deleting all files in group").build(); - let button_ok = confirmation_dialog_group_delete.add_button("Ok", ResponseType::Ok); - confirmation_dialog_group_delete.add_button("Close", ResponseType::Cancel); +fn create_dialog_group_deletion(window_main: >k::Window) -> (Dialog, CheckButton) { + let dialog = gtk::Dialog::builder().title("Confirmation of deleting all files in group").transient_for(window_main).build(); + let button_ok = dialog.add_button("Ok", ResponseType::Ok); + dialog.add_button("Close", ResponseType::Cancel); let label: gtk::Label = gtk::Label::new(Some("In some groups there are selected all records.")); let label2: gtk::Label = gtk::Label::new(Some("Are you sure that you want to delete them?")); @@ -129,13 +129,13 @@ fn create_dialog_group_deletion(_window_main: >k::Window) -> (Dialog, CheckBut button_ok.grab_focus(); - let internal_box = get_dialog_box_child(&confirmation_dialog_group_delete); + let internal_box = get_dialog_box_child(&dialog); internal_box.add(&label); internal_box.add(&label2); internal_box.add(&check_button); - confirmation_dialog_group_delete.show_all(); - (confirmation_dialog_group_delete, check_button) + dialog.show_all(); + (dialog, check_button) } pub async fn check_if_deleting_all_files_in_group(tree_view: >k::TreeView, column_color: i32, column_selection: i32, window_main: >k::Window, check_button_settings_confirm_group_deletion: >k::CheckButton) -> bool { diff --git a/czkawka_gui/src/connect_button_hardlink.rs b/czkawka_gui/src/connect_button_hardlink.rs index d15fc98..7db2695 100644 --- a/czkawka_gui/src/connect_button_hardlink.rs +++ b/czkawka_gui/src/connect_button_hardlink.rs @@ -169,44 +169,32 @@ pub fn hardlink_symlink(tree_view: >k::TreeView, column_file_name: i32, column for symhardlink_data in vec_symhardlink_data { dbg!(&symhardlink_data); for file_to_hardlink in symhardlink_data.files_to_symhardlink { - match make_hard_link(&PathBuf::from(&symhardlink_data.original_data), &PathBuf::from(&file_to_hardlink)) { - Ok(_) => (), - Err(e) => { - add_text_to_text_view(text_view_errors, format!("Failed to hardlink {}, reason {}", file_to_hardlink, e).as_str()); - continue; - } + if let Err(e) = make_hard_link(&PathBuf::from(&symhardlink_data.original_data), &PathBuf::from(&file_to_hardlink)) { + add_text_to_text_view(text_view_errors, format!("Failed to hardlink {}, reason {}", file_to_hardlink, e).as_str()); + continue; } } } } else { for symhardlink_data in vec_symhardlink_data { for file_to_symlink in symhardlink_data.files_to_symhardlink { - match fs::remove_file(&file_to_symlink) { - Ok(_) => (), - Err(e) => { - add_text_to_text_view(text_view_errors, format!("Failed to remove file {} when creating symlink, reason {}", file_to_symlink, e).as_str()); - continue; - } + if let Err(e) = fs::remove_file(&file_to_symlink) { + add_text_to_text_view(text_view_errors, format!("Failed to remove file {} when creating symlink, reason {}", file_to_symlink, e).as_str()); + continue; }; #[cfg(target_family = "unix")] { - match std::os::unix::fs::symlink(&symhardlink_data.original_data, &file_to_symlink) { - Ok(_) => (), - Err(e) => { - add_text_to_text_view(text_view_errors, format!("Failed to remove file {} when creating symlink, reason {}", file_to_symlink, e).as_str()); - continue; - } + if let Err(e) = std::os::unix::fs::symlink(&symhardlink_data.original_data, &file_to_symlink) { + add_text_to_text_view(text_view_errors, format!("Failed to remove file {} when creating symlink, reason {}", file_to_symlink, e).as_str()); + continue; }; } #[cfg(target_family = "windows")] { - match std::os::windows::fs::symlink_file(&symhardlink_data.original_data, &file_to_symlink) { - Ok(_) => (), - Err(e) => { - add_text_to_text_view(&text_view_errors, format!("Failed to remove file {} when creating symlink, reason {}", file_to_symlink, e).as_str()); - continue; - } + if let Err(e) = std::os::windows::fs::symlink_file(&symhardlink_data.original_data, &file_to_symlink) { + add_text_to_text_view(&text_view_errors, format!("Failed to remove file {} when creating symlink, reason {}", file_to_symlink, e).as_str()); + continue; }; } } diff --git a/czkawka_gui/src/connect_button_move.rs b/czkawka_gui/src/connect_button_move.rs index bfcea3b..63fbb6f 100644 --- a/czkawka_gui/src/connect_button_move.rs +++ b/czkawka_gui/src/connect_button_move.rs @@ -56,6 +56,7 @@ fn move_things(tree_view: >k::TreeView, column_file_name: i32, column_path: i3 let chooser = gtk::FileChooserDialog::builder() .title("Choose folder to which you want to move duplicated files") .action(gtk::FileChooserAction::SelectFolder) + .transient_for(window_main) .build(); chooser.add_button("Ok", ResponseType::Ok); chooser.add_button("Close", ResponseType::Cancel); @@ -63,12 +64,9 @@ fn move_things(tree_view: >k::TreeView, column_file_name: i32, column_path: i3 chooser.set_select_multiple(false); chooser.show_all(); - window_main.set_sensitive(false); - let entry_info = entry_info.clone(); let text_view_errors = text_view_errors.clone(); let tree_view = tree_view.clone(); - let window_main = window_main.clone(); chooser.connect_response(move |file_chooser, response_type| { if response_type == gtk::ResponseType::Ok { let folders = file_chooser.filenames(); @@ -84,7 +82,6 @@ fn move_things(tree_view: >k::TreeView, column_file_name: i32, column_path: i3 } } file_chooser.close(); - window_main.set_sensitive(true); }); } diff --git a/czkawka_gui/src/connect_button_search.rs b/czkawka_gui/src/connect_button_search.rs index b313575..e4e2627 100644 --- a/czkawka_gui/src/connect_button_search.rs +++ b/czkawka_gui/src/connect_button_search.rs @@ -4,7 +4,6 @@ use std::thread; use glib::Sender; use gtk::prelude::*; -use gtk::WindowPosition; use img_hash::{FilterType, HashAlg}; use czkawka_core::big_file::BigFile; @@ -131,9 +130,6 @@ pub fn connect_button_search( entry_info.set_text("Searching data, it may take a while, please wait..."); - // Set dialog to center to current screen(it is impossible to center it to main window) - window_progress.set_position(WindowPosition::Center); - // Resets progress bars progress_bar_all_stages.set_fraction(0 as f64); progress_bar_current_stage.set_fraction(0 as f64); diff --git a/czkawka_gui/src/connect_button_select.rs b/czkawka_gui/src/connect_button_select.rs index db0bd96..ab2c4c0 100644 --- a/czkawka_gui/src/connect_button_select.rs +++ b/czkawka_gui/src/connect_button_select.rs @@ -26,13 +26,11 @@ pub fn connect_button_select(gui_data: &GuiData) { let popovers = gui_data.popovers.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 |_| { + buttons_select.connect_clicked(move |_| { show_required_popovers(&popovers, &to_notebook_main_enum(notebook_main.current_page().unwrap()), &hashmap); - popover_select.set_relative_to(Some(&buttons_select)); popover_select.popup(); }); } diff --git a/czkawka_gui/src/connect_button_stop.rs b/czkawka_gui/src/connect_button_stop.rs index 24cf5f1..411e4c7 100644 --- a/czkawka_gui/src/connect_button_stop.rs +++ b/czkawka_gui/src/connect_button_stop.rs @@ -1,16 +1,16 @@ use gtk::prelude::*; use crate::gui_data::GuiData; +use crate::help_functions::KEY_ENTER; pub fn connect_button_stop(gui_data: &GuiData) { - let button_stop_in_dialog = gui_data.progress_window.button_stop_in_dialog.clone(); + let evk_button_stop_in_dialog = gui_data.progress_window.evk_button_stop_in_dialog.clone(); let stop_sender = gui_data.stop_sender.clone(); - button_stop_in_dialog.connect_key_release_event(move |_, e| { - if e.keycode() == Some(36) { + evk_button_stop_in_dialog.connect_key_released(move |_, _, key_code, _| { + if key_code == KEY_ENTER { // Only accept enter key to stop search stop_sender.send(()).unwrap(); } - gtk::Inhibit(false) }); let button_stop_in_dialog = gui_data.progress_window.button_stop_in_dialog.clone(); diff --git a/czkawka_gui/src/connect_header_buttons.rs b/czkawka_gui/src/connect_header_buttons.rs index 961cc53..341f284 100644 --- a/czkawka_gui/src/connect_header_buttons.rs +++ b/czkawka_gui/src/connect_header_buttons.rs @@ -1,5 +1,4 @@ use gtk::prelude::*; -use gtk::WindowPosition; use crate::gui_data::GuiData; @@ -7,12 +6,11 @@ pub fn connect_button_about(gui_data: &GuiData) { let about_dialog = gui_data.about.about_dialog.clone(); let button_app_info = gui_data.header.button_app_info.clone(); button_app_info.connect_clicked(move |_| { - about_dialog.set_position(WindowPosition::Center); about_dialog.show(); // Prevent from deleting dialog after close - about_dialog.connect_delete_event(|e, _f| { - e.hide(); + about_dialog.connect_delete_event(|dialog, _| { + dialog.hide(); Inhibit(true) }); }); diff --git a/czkawka_gui/src/connect_popovers.rs b/czkawka_gui/src/connect_popovers.rs index 124bac8..1d07122 100644 --- a/czkawka_gui/src/connect_popovers.rs +++ b/czkawka_gui/src/connect_popovers.rs @@ -213,7 +213,7 @@ fn popover_one_oldest_newest(popover: >k::Popover, tree_view: >k::TreeView, popover.popdown(); } -fn popover_custom_select_unselect(popover: >k::Popover, _window_main: &Window, tree_view: >k::TreeView, column_color: Option, column_file_name: i32, column_path: i32, column_button_selection: u32, select_things: bool) { +fn popover_custom_select_unselect(popover: >k::Popover, window_main: &Window, tree_view: >k::TreeView, column_color: Option, column_file_name: i32, column_path: i32, column_button_selection: u32, select_things: bool) { popover.popdown(); enum WildcardType { @@ -227,11 +227,11 @@ fn popover_custom_select_unselect(popover: >k::Popover, _window_main: &Window, true => "Select Custom", }; - // Accept Dialog + // Dialog for select/unselect items { - let confirmation_dialog_select_unselect = gtk::Dialog::builder().title(window_title).build(); - confirmation_dialog_select_unselect.add_button("Ok", ResponseType::Ok); - confirmation_dialog_select_unselect.add_button("Close", ResponseType::Cancel); + let dialog = gtk::Dialog::builder().title(window_title).transient_for(window_main).build(); + dialog.add_button("Ok", ResponseType::Ok); + dialog.add_button("Close", ResponseType::Cancel); let label: gtk::Label = gtk::Label::new(Some("Usage: */folder-nr*/* or name-version-*.txt")); @@ -264,13 +264,13 @@ fn popover_custom_select_unselect(popover: >k::Popover, _window_main: &Window, grid.attach(&entry_name, 1, 2, 1, 1); grid.attach(&entry_name_path, 1, 3, 1, 1); - let box_widget = get_dialog_box_child(&confirmation_dialog_select_unselect); + let box_widget = get_dialog_box_child(&dialog); box_widget.add(&grid); - confirmation_dialog_select_unselect.show_all(); + dialog.show_all(); let tree_view = tree_view.clone(); - confirmation_dialog_select_unselect.connect_response(move |confirmation_dialog_select_unselect, response_type| { + dialog.connect_response(move |confirmation_dialog_select_unselect, response_type| { let wildcard_type: WildcardType; let wildcard: String; diff --git a/czkawka_gui/src/connect_selection_of_directories.rs b/czkawka_gui/src/connect_selection_of_directories.rs index 98feb19..360f661 100644 --- a/czkawka_gui/src/connect_selection_of_directories.rs +++ b/czkawka_gui/src/connect_selection_of_directories.rs @@ -79,17 +79,14 @@ pub fn connect_selection_of_directories(gui_data: &GuiData) { fn add_chosen_directories(window_main: &Window, tree_view: &TreeView, excluded_items: bool) { let folders_to = if excluded_items { "Folders to exclude" } else { "Folders to include" }; - let chooser = gtk::FileChooserDialog::builder().title(folders_to).action(gtk::FileChooserAction::SelectFolder).build(); + let chooser = gtk::FileChooserDialog::builder().title(folders_to).action(gtk::FileChooserAction::SelectFolder).transient_for(window_main).build(); chooser.add_button("Ok", ResponseType::Ok); chooser.add_button("Close", ResponseType::Cancel); chooser.set_select_multiple(true); chooser.show_all(); - window_main.set_sensitive(false); - let tree_view = tree_view.clone(); - let window_main = window_main.clone(); chooser.connect_response(move |chooser, response_type| { if response_type == gtk::ResponseType::Ok { let folder = chooser.filenames(); @@ -102,26 +99,22 @@ fn add_chosen_directories(window_main: &Window, tree_view: &TreeView, excluded_i } } chooser.close(); - window_main.set_sensitive(true); }); } fn add_manually_directories(window_main: &Window, tree_view: &TreeView) { - let dialog_manual_add_directory = gtk::Dialog::builder().title("Add directory manually").build(); - dialog_manual_add_directory.add_button("Ok", ResponseType::Ok); - dialog_manual_add_directory.add_button("Close", ResponseType::Cancel); - - window_main.set_sensitive(false); + let dialog = gtk::Dialog::builder().title("Add directory manually").transient_for(window_main).build(); + dialog.add_button("Ok", ResponseType::Ok); + dialog.add_button("Close", ResponseType::Cancel); let entry: gtk::Entry = gtk::Entry::new(); - get_dialog_box_child(&dialog_manual_add_directory).add(&entry); + get_dialog_box_child(&dialog).add(&entry); - dialog_manual_add_directory.show_all(); + dialog.show_all(); let tree_view = tree_view.clone(); - let window_main = window_main.clone(); - dialog_manual_add_directory.connect_response(move |dialog_manual_add_directory, response_type| { + dialog.connect_response(move |dialog, response_type| { if response_type == gtk::ResponseType::Ok { let text = entry.text().to_string().trim().to_string(); @@ -135,7 +128,6 @@ fn add_manually_directories(window_main: &Window, tree_view: &TreeView) { list_store.set(&list_store.append(), &values); } } - dialog_manual_add_directory.close(); - window_main.set_sensitive(true); + dialog.close(); }); } diff --git a/czkawka_gui/src/connect_settings.rs b/czkawka_gui/src/connect_settings.rs index b525f84..3100fa2 100644 --- a/czkawka_gui/src/connect_settings.rs +++ b/czkawka_gui/src/connect_settings.rs @@ -2,7 +2,7 @@ use czkawka_core::common_messages::Messages; use czkawka_core::duplicate::HashType; use directories_next::ProjectDirs; use gtk::prelude::*; -use gtk::{LabelBuilder, ResponseType, WindowPosition}; +use gtk::{LabelBuilder, ResponseType, Window}; use image::imageops::FilterType; use img_hash::HashAlg; use std::collections::BTreeMap; @@ -19,7 +19,6 @@ pub fn connect_settings(gui_data: &GuiData) { let window_main = gui_data.window_main.clone(); let window_settings = gui_data.settings.window_settings.clone(); button_settings.connect_clicked(move |_| { - window_main.set_position(WindowPosition::Center); window_main.set_sensitive(false); window_settings.show(); }); @@ -27,7 +26,7 @@ pub fn connect_settings(gui_data: &GuiData) { let window_main = gui_data.window_main.clone(); let window_settings = gui_data.settings.window_settings.clone(); - window_settings.connect_delete_event(move |window, _y| { + window_settings.connect_delete_event(move |window, _| { window.hide(); window_main.set_sensitive(true); gtk::Inhibit(true) @@ -94,11 +93,9 @@ pub fn connect_settings(gui_data: &GuiData) { let entry_settings_cache_file_minimal_size = gui_data.settings.entry_settings_cache_file_minimal_size.clone(); button_settings_duplicates_clear_cache.connect_clicked(move |_| { - let dialog = create_clear_cache_dialog("duplicates"); + let dialog = create_clear_cache_dialog("duplicates", &settings_window); dialog.show_all(); - settings_window.set_sensitive(false); - let settings_window = settings_window.clone(); let text_view_errors = text_view_errors.clone(); let entry_settings_cache_file_minimal_size = entry_settings_cache_file_minimal_size.clone(); @@ -121,7 +118,6 @@ pub fn connect_settings(gui_data: &GuiData) { text_view_errors.buffer().unwrap().set_text(messages.create_messages_text().as_str()); } dialog.close(); - settings_window.set_sensitive(true); }); }); } @@ -131,11 +127,9 @@ pub fn connect_settings(gui_data: &GuiData) { let text_view_errors = gui_data.text_view_errors.clone(); button_settings_similar_images_clear_cache.connect_clicked(move |_| { - let dialog = create_clear_cache_dialog("similar images"); + let dialog = create_clear_cache_dialog("similar images", &settings_window); dialog.show_all(); - settings_window.set_sensitive(false); - let settings_window = settings_window.clone(); let text_view_errors = text_view_errors.clone(); dialog.connect_response(move |dialog, response_type| { @@ -155,7 +149,6 @@ pub fn connect_settings(gui_data: &GuiData) { text_view_errors.buffer().unwrap().set_text(messages.create_messages_text().as_str()); } dialog.close(); - settings_window.set_sensitive(true); }); }); } @@ -165,11 +158,9 @@ pub fn connect_settings(gui_data: &GuiData) { let text_view_errors = gui_data.text_view_errors.clone(); button_settings_similar_videos_clear_cache.connect_clicked(move |_| { - let dialog = create_clear_cache_dialog("similar videos"); + let dialog = create_clear_cache_dialog("similar videos", &settings_window); dialog.show_all(); - settings_window.set_sensitive(false); - let settings_window = settings_window.clone(); let text_view_errors = text_view_errors.clone(); dialog.connect_response(move |dialog, response_type| { @@ -183,15 +174,14 @@ pub fn connect_settings(gui_data: &GuiData) { text_view_errors.buffer().unwrap().set_text(messages.create_messages_text().as_str()); } dialog.close(); - settings_window.set_sensitive(true); }); }); } } } -fn create_clear_cache_dialog(title_str: &str) -> gtk::Dialog { - let dialog = gtk::Dialog::builder().title(format!("Clearing {} cache", title_str).as_str()).build(); +fn create_clear_cache_dialog(title_str: &str, window_settings: &Window) -> gtk::Dialog { + let dialog = gtk::Dialog::builder().title(format!("Clearing {} cache", title_str).as_str()).transient_for(window_settings).build(); dialog.add_button("OK", ResponseType::Ok); dialog.add_button("Cancel", ResponseType::Cancel); diff --git a/czkawka_gui/src/connect_similar_image_size_change.rs b/czkawka_gui/src/connect_similar_image_size_change.rs index e14d38d..c6d7473 100644 --- a/czkawka_gui/src/connect_similar_image_size_change.rs +++ b/czkawka_gui/src/connect_similar_image_size_change.rs @@ -9,7 +9,7 @@ pub fn connect_similar_image_size_change(gui_data: &GuiData) { { let radio_button_similar_hash_size_4 = gui_data.main_notebook.radio_button_similar_hash_size_4.clone(); let scale_similarity_similar_images = gui_data.main_notebook.scale_similarity_similar_images.clone(); - radio_button_similar_hash_size_4.connect_clicked(move |_| { + radio_button_similar_hash_size_4.connect_toggled(move |_| { scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[0][5] as f64); scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[0][5] as f64); }); @@ -17,7 +17,7 @@ pub fn connect_similar_image_size_change(gui_data: &GuiData) { { let radio_button_similar_hash_size_8 = gui_data.main_notebook.radio_button_similar_hash_size_8.clone(); let scale_similarity_similar_images = gui_data.main_notebook.scale_similarity_similar_images.clone(); - radio_button_similar_hash_size_8.connect_clicked(move |_| { + radio_button_similar_hash_size_8.connect_toggled(move |_| { scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[1][5] as f64); scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[1][5] as f64); }); @@ -25,7 +25,7 @@ pub fn connect_similar_image_size_change(gui_data: &GuiData) { { let radio_button_similar_hash_size_16 = gui_data.main_notebook.radio_button_similar_hash_size_16.clone(); let scale_similarity_similar_images = gui_data.main_notebook.scale_similarity_similar_images.clone(); - radio_button_similar_hash_size_16.connect_clicked(move |_| { + radio_button_similar_hash_size_16.connect_toggled(move |_| { scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[2][5] as f64); scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[2][5] as f64); }); diff --git a/czkawka_gui/src/gui_about.rs b/czkawka_gui/src/gui_about.rs index e6a9f0f..6e49953 100644 --- a/czkawka_gui/src/gui_about.rs +++ b/czkawka_gui/src/gui_about.rs @@ -1,5 +1,5 @@ use gtk::prelude::*; -use gtk::{Builder, WindowPosition}; +use gtk::{Builder, Window}; #[derive(Clone)] pub struct GuiAbout { @@ -11,12 +11,12 @@ pub struct GuiAbout { } impl GuiAbout { - pub fn create_from_builder() -> Self { + pub fn create_from_builder(window_main: &Window) -> Self { let glade_src = include_str!("../ui/about_dialog.glade").to_string(); let builder = Builder::from_string(glade_src.as_str()); let about_dialog: gtk::AboutDialog = builder.object("about_dialog").unwrap(); - about_dialog.set_position(WindowPosition::Center); + about_dialog.set_transient_for(Some(window_main)); let button_repository: gtk::Button = builder.object("button_repository").unwrap(); button_repository.set_tooltip_text(Some("Link to repository page with source code.")); diff --git a/czkawka_gui/src/gui_bottom_buttons.rs b/czkawka_gui/src/gui_bottom_buttons.rs index 19cf31f..acf541f 100644 --- a/czkawka_gui/src/gui_bottom_buttons.rs +++ b/czkawka_gui/src/gui_bottom_buttons.rs @@ -1,10 +1,10 @@ use gtk::prelude::*; -use gtk::Button; +use gtk::Widget; #[derive(Clone)] pub struct GuiBottomButtons { pub buttons_search: gtk::Button, - pub buttons_select: gtk::Button, + pub buttons_select: gtk::MenuButton, pub buttons_delete: gtk::Button, pub buttons_save: gtk::Button, pub buttons_symlink: gtk::Button, @@ -12,13 +12,13 @@ pub struct GuiBottomButtons { pub buttons_move: gtk::Button, pub buttons_show_errors: gtk::Button, pub buttons_names: [String; 7], - pub buttons_array: [Button; 7], + pub buttons_array: [Widget; 7], } impl GuiBottomButtons { - pub fn create_from_builder(builder: >k::Builder) -> Self { + pub fn create_from_builder(builder: >k::Builder, popover_select: >k::Popover) -> Self { let buttons_search: gtk::Button = builder.object("buttons_search").unwrap(); - let buttons_select: gtk::Button = builder.object("buttons_select").unwrap(); + let buttons_select: gtk::MenuButton = builder.object("buttons_select").unwrap(); let buttons_delete: gtk::Button = builder.object("buttons_delete").unwrap(); let buttons_save: gtk::Button = builder.object("buttons_save").unwrap(); let buttons_symlink: gtk::Button = builder.object("buttons_symlink").unwrap(); @@ -49,15 +49,18 @@ impl GuiBottomButtons { "hardlink".to_string(), "move".to_string(), ]; - let buttons_array = [ - buttons_search.clone(), - buttons_select.clone(), - buttons_delete.clone(), - buttons_save.clone(), - buttons_symlink.clone(), - buttons_hardlink.clone(), - buttons_move.clone(), + let buttons_array: [Widget; 7] = [ + buttons_search.clone().upcast::(), + buttons_select.clone().upcast::(), + buttons_delete.clone().upcast::(), + buttons_save.clone().upcast::(), + buttons_symlink.clone().upcast::(), + buttons_hardlink.clone().upcast::(), + buttons_move.clone().upcast::(), ]; + + buttons_select.set_popover(Some(popover_select)); + Self { buttons_search, buttons_select, diff --git a/czkawka_gui/src/gui_data.rs b/czkawka_gui/src/gui_data.rs index d18cf22..14af608 100644 --- a/czkawka_gui/src/gui_data.rs +++ b/czkawka_gui/src/gui_data.rs @@ -4,7 +4,7 @@ use std::rc::Rc; use crossbeam_channel::unbounded; use gtk::prelude::*; -use gtk::{Builder, WindowPosition}; +use gtk::Builder; use czkawka_core::big_file::BigFile; use czkawka_core::broken_files::BrokenFiles; @@ -89,15 +89,14 @@ impl GuiData { let window_main: gtk::Window = builder.object("window_main").unwrap(); window_main.show_all(); window_main.set_title("Czkawka"); - window_main.set_position(WindowPosition::Center); window_main.set_application(Some(application)); let main_notebook = GuiMainNotebook::create_from_builder(&builder); let upper_notebook = GuiUpperNotebook::create_from_builder(&builder); let popovers = GuiPopovers::create_from_builder(); - let bottom_buttons = GuiBottomButtons::create_from_builder(&builder); + let bottom_buttons = GuiBottomButtons::create_from_builder(&builder, &popovers.popover_select); let progress_window = GuiProgressDialog::create_from_builder(&window_main); - let about = GuiAbout::create_from_builder(); + let about = GuiAbout::create_from_builder(&window_main); let header = GuiHeader::create_from_builder(&builder); let settings = GuiSettings::create_from_builder(&window_main); diff --git a/czkawka_gui/src/gui_main_notebook.rs b/czkawka_gui/src/gui_main_notebook.rs index 809a64d..1ee8155 100644 --- a/czkawka_gui/src/gui_main_notebook.rs +++ b/czkawka_gui/src/gui_main_notebook.rs @@ -29,7 +29,7 @@ pub struct GuiMainNotebook { pub tree_view_invalid_symlinks: gtk::TreeView, pub tree_view_broken_files: gtk::TreeView, - pub evk_tree_view_duplicate_finder: gtk::EventControllerKey, // TODO, in GTK4 this can be changed to e.g. add_widget - https://discourse.gnome.org/t/how-to-convert-code-to-use-eventcontrollerkey/8198/2 + pub evk_tree_view_duplicate_finder: gtk::EventControllerKey, // TODO, in GTK4 this can be changed to e.g. add_controller which is not 100% compatible with this - https://discourse.gnome.org/t/how-to-convert-code-to-use-eventcontrollerkey/8198/2 pub evk_tree_view_empty_folder_finder: gtk::EventControllerKey, pub evk_tree_view_empty_files_finder: gtk::EventControllerKey, pub evk_tree_view_temporary_files_finder: gtk::EventControllerKey, @@ -130,6 +130,28 @@ impl GuiMainNotebook { let evk_tree_view_invalid_symlinks: gtk::EventControllerKey = EventControllerKey::new(&tree_view_invalid_symlinks); let evk_tree_view_broken_files: gtk::EventControllerKey = EventControllerKey::new(&tree_view_broken_files); + // 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 entry_similar_images_minimal_size: gtk::Entry = builder.object("entry_similar_images_minimal_size").unwrap(); let entry_similar_images_maximal_size: gtk::Entry = builder.object("entry_similar_images_maximal_size").unwrap(); let entry_similar_videos_minimal_size: gtk::Entry = builder.object("entry_similar_videos_minimal_size").unwrap(); diff --git a/czkawka_gui/src/gui_progress_dialog.rs b/czkawka_gui/src/gui_progress_dialog.rs index 92940fb..7f9d07f 100644 --- a/czkawka_gui/src/gui_progress_dialog.rs +++ b/czkawka_gui/src/gui_progress_dialog.rs @@ -1,5 +1,5 @@ use gtk::prelude::*; -use gtk::{Builder, Window}; +use gtk::{Builder, EventControllerKey, Window}; #[derive(Clone)] pub struct GuiProgressDialog { @@ -13,6 +13,7 @@ pub struct GuiProgressDialog { pub grid_progress_stages: gtk::Grid, pub button_stop_in_dialog: gtk::Button, + pub evk_button_stop_in_dialog: gtk::EventControllerKey, } impl GuiProgressDialog { @@ -22,7 +23,6 @@ impl GuiProgressDialog { let window_progress: gtk::Window = builder.object("window_progress").unwrap(); window_progress.set_transient_for(Some(window_main)); - window_progress.set_modal(true); let progress_bar_current_stage: gtk::ProgressBar = builder.object("progress_bar_current_stage").unwrap(); let progress_bar_all_stages: gtk::ProgressBar = builder.object("progress_bar_all_stages").unwrap(); @@ -32,6 +32,7 @@ impl GuiProgressDialog { let grid_progress_stages: gtk::Grid = builder.object("grid_progress_stages").unwrap(); let button_stop_in_dialog: gtk::Button = builder.object("button_stop_in_dialog").unwrap(); + let evk_button_stop_in_dialog = EventControllerKey::new(&button_stop_in_dialog); Self { window_progress, @@ -40,6 +41,7 @@ impl GuiProgressDialog { label_stage, grid_progress_stages, button_stop_in_dialog, + evk_button_stop_in_dialog, } } } diff --git a/czkawka_gui/src/help_functions.rs b/czkawka_gui/src/help_functions.rs index 505ebe3..b751671 100644 --- a/czkawka_gui/src/help_functions.rs +++ b/czkawka_gui/src/help_functions.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use std::path::{Path, PathBuf}; use gtk::prelude::*; -use gtk::{ListStore, TextView}; +use gtk::{ListStore, TextView, Widget}; use czkawka_core::big_file::BigFile; use czkawka_core::broken_files::BrokenFiles; @@ -396,7 +396,7 @@ pub fn add_text_to_text_view(text_view: &TextView, string_to_append: &str) { buffer.set_text(format!("{}\n{}", current_text, string_to_append).as_str()); } -pub fn set_buttons(hashmap: &mut HashMap, buttons_array: &[gtk::Button], button_names: &[String]) { +pub fn set_buttons(hashmap: &mut HashMap, buttons_array: &[gtk::Widget], button_names: &[String]) { for (index, button) in buttons_array.iter().enumerate() { if *hashmap.get_mut(button_names[index].as_str()).unwrap() { button.show(); @@ -406,7 +406,7 @@ pub fn set_buttons(hashmap: &mut HashMap, buttons_array: &[gtk::Bu } } -pub fn hide_all_buttons(buttons_array: &[gtk::Button]) { +pub fn hide_all_buttons(buttons_array: &[Widget]) { for button in buttons_array { button.hide(); } @@ -449,8 +449,7 @@ pub fn get_notebook_enum_from_tree_view(tree_view: >k::TreeView) -> NotebookMa "tree_view_invalid_symlinks" => NotebookMainEnum::Symlinks, "tree_view_broken_files" => NotebookMainEnum::BrokenFiles, e => { - eprintln!("{}", e); - panic!() + panic!("{}", e) } } } diff --git a/czkawka_gui/src/initialize_gui.rs b/czkawka_gui/src/initialize_gui.rs index 1bded52..baa3899 100644 --- a/czkawka_gui/src/initialize_gui.rs +++ b/czkawka_gui/src/initialize_gui.rs @@ -467,7 +467,7 @@ pub fn initialize_gui(gui_data: &mut GuiData) { let window_progress = gui_data.progress_window.window_progress.clone(); let stop_sender = gui_data.stop_sender.clone(); - window_progress.connect_delete_event(move |_e, _y| { + window_progress.connect_delete_event(move |_, _| { stop_sender.send(()).unwrap(); gtk::Inhibit(true) }); diff --git a/czkawka_gui/ui/main_window.glade b/czkawka_gui/ui/main_window.glade index 266da50..0ce34c8 100644 --- a/czkawka_gui/ui/main_window.glade +++ b/czkawka_gui/ui/main_window.glade @@ -2078,9 +2078,10 @@ Author: Rafał Mikrut False 2 - + True True + False True @@ -2162,7 +2163,7 @@ Author: Rafał Mikrut False True - 1 + 2 @@ -2206,7 +2207,7 @@ Author: Rafał Mikrut False True - 2 + 3 @@ -2250,7 +2251,7 @@ Author: Rafał Mikrut False True - 3 + 4 @@ -2294,7 +2295,7 @@ Author: Rafał Mikrut False True - 4 + 5 @@ -2338,7 +2339,7 @@ Author: Rafał Mikrut False True - 5 + 6