diff --git a/czkawka_gui/src/connect_things/connect_button_delete.rs b/czkawka_gui/src/connect_things/connect_button_delete.rs index b52afbd..5646369 100644 --- a/czkawka_gui/src/connect_things/connect_button_delete.rs +++ b/czkawka_gui/src/connect_things/connect_button_delete.rs @@ -292,7 +292,8 @@ pub fn empty_folder_remover( let mut messages: String = "".to_string(); // Must be deleted from end to start, because when deleting entries, TreePath(and also TreeIter) will points to invalid data - for tree_path in selected_rows.iter().rev() { + for (counter, tree_path) in selected_rows.iter().rev().enumerate() { + handle_gtk_pending_event_counter(counter); let iter = model.iter(tree_path).unwrap(); let name = model.value(&iter, column_file_name).get::().unwrap(); @@ -408,7 +409,8 @@ pub fn basic_remove( } // Must be deleted from end to start, because when deleting entries, TreePath(and also TreeIter) will points to invalid data - for tree_path in selected_rows.iter().rev() { + for (counter, tree_path) in selected_rows.iter().rev().enumerate() { + handle_gtk_pending_event_counter(counter); let iter = model.iter(tree_path).unwrap(); let name = model.value(&iter, column_file_name).get::().unwrap(); @@ -504,10 +506,13 @@ pub fn tree_remove( } // Delete duplicated entries, and remove real files + let mut counter = 0_usize; for (path, mut vec_file_name) in map_with_path_to_delete { vec_file_name.sort(); vec_file_name.dedup(); for file_name in vec_file_name { + handle_gtk_pending_event_counter(counter); + counter += 1; if !use_trash { if let Err(e) = fs::remove_file(get_full_name_from_path_name(&path, &file_name)) { messages += flg!( diff --git a/czkawka_gui/src/connect_things/connect_button_hardlink.rs b/czkawka_gui/src/connect_things/connect_button_hardlink.rs index 6f13037..8a81ef7 100644 --- a/czkawka_gui/src/connect_things/connect_button_hardlink.rs +++ b/czkawka_gui/src/connect_things/connect_button_hardlink.rs @@ -200,7 +200,8 @@ fn hardlink_symlink( } if hardlinking == TypeOfTool::Hardlinking { for symhardlink_data in vec_symhardlink_data { - for file_to_hardlink in symhardlink_data.files_to_symhardlink { + for (counter, file_to_hardlink) in symhardlink_data.files_to_symhardlink.into_iter().enumerate() { + handle_gtk_pending_event_counter(counter); 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!("{} {}, reason {}", flg!("hardlink_failed"), file_to_hardlink, e).as_str()); continue; @@ -209,7 +210,8 @@ fn hardlink_symlink( } } else { for symhardlink_data in vec_symhardlink_data { - for file_to_symlink in symhardlink_data.files_to_symhardlink { + for (counter, file_to_symlink) in symhardlink_data.files_to_symhardlink.into_iter().enumerate() { + handle_gtk_pending_event_counter(counter); if let Err(e) = fs::remove_file(&file_to_symlink) { add_text_to_text_view( text_view_errors, diff --git a/czkawka_gui/src/connect_things/connect_button_move.rs b/czkawka_gui/src/connect_things/connect_button_move.rs index dc0c9ca..9ff2cc2 100644 --- a/czkawka_gui/src/connect_things/connect_button_move.rs +++ b/czkawka_gui/src/connect_things/connect_button_move.rs @@ -224,7 +224,8 @@ fn move_files_common( let mut moved_files: u32 = 0; // Save to variable paths of files, and remove it when not removing all occurrences. - 'next_result: for tree_path in selected_rows.iter().rev() { + 'next_result: for (counter, tree_path) in selected_rows.iter().rev().enumerate() { + handle_gtk_pending_event_counter(counter); let iter = model.iter(tree_path).unwrap(); let file_name = model.value(&iter, column_file_name).get::().unwrap(); diff --git a/czkawka_gui/src/help_functions.rs b/czkawka_gui/src/help_functions.rs index f0b9b6a..5616688 100644 --- a/czkawka_gui/src/help_functions.rs +++ b/czkawka_gui/src/help_functions.rs @@ -39,6 +39,8 @@ pub const KEY_SPACE: u32 = 65; // pub const KEY_HOME: u32 = 115; // pub const KEY_END: u32 = 110; +pub const CHECK_GTK_EVENTS_INTERVAL: usize = 100; + #[derive(Eq, PartialEq)] pub enum PopoverTypes { All, @@ -805,6 +807,21 @@ pub fn get_custom_image_from_button_with_image(button: >k::Bin) -> gtk::Image panic!("Button doesn't have proper custom label child"); } +pub fn handle_gtk_pending_event() -> bool { + let have_pending = gtk::events_pending(); + if have_pending { + gtk::main_iteration(); + } + have_pending +} + +pub fn handle_gtk_pending_event_counter(counter: usize) -> bool { + if counter > 0 && (counter % CHECK_GTK_EVENTS_INTERVAL) == 0 { + return handle_gtk_pending_event(); + } + false +} + // GTK 4 // pub fn get_custom_label_from_button_with_image>(button: &P) -> gtk4::Label { // let internal_box = button.first_child().unwrap().downcast::().unwrap();