From 7c3b9681b18b6c7696e27d5d6ec0753a7353f92e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= <41945903+qarmin@users.noreply.github.com> Date: Mon, 21 Dec 2020 21:19:59 +0100 Subject: [PATCH] Split symlink path to two path and file name (#127) --- czkawka_gui/src/connect_button_delete.rs | 34 +--------------------- czkawka_gui/src/connect_compute_results.rs | 8 +++-- czkawka_gui/src/create_tree_view.rs | 13 +++++++-- czkawka_gui/src/double_click_opening.rs | 7 +++++ czkawka_gui/src/help_functions.rs | 3 +- czkawka_gui/src/initialize_gui.rs | 4 ++- 6 files changed, 29 insertions(+), 40 deletions(-) diff --git a/czkawka_gui/src/connect_button_delete.rs b/czkawka_gui/src/connect_button_delete.rs index 88aaa0b..54f136a 100644 --- a/czkawka_gui/src/connect_button_delete.rs +++ b/czkawka_gui/src/connect_button_delete.rs @@ -84,7 +84,7 @@ pub fn connect_button_delete(gui_data: &GuiData) { tree_remove(scrolled_window_same_music_finder.clone(), ColumnsSameMusic::Name as i32, ColumnsSameMusic::Path as i32, ColumnsSameMusic::Color as i32, &gui_data); } "scrolled_window_invalid_symlinks" => { - basic_remove_invalid_symlinks(scrolled_window_invalid_symlinks.clone(), ColumnsInvalidSymlinks::SymlinkPath as i32, &gui_data); + basic_remove(scrolled_window_invalid_symlinks.clone(), ColumnsInvalidSymlinks::Name as i32, ColumnsInvalidSymlinks::Path as i32, &gui_data); } e => panic!("Not existent {}", e), } @@ -177,38 +177,6 @@ fn empty_folder_remover(scrolled_window: gtk::ScrolledWindow, column_file_name: selection.unselect_all(); } -fn basic_remove_invalid_symlinks(scrolled_window: gtk::ScrolledWindow, column_symlink_path: i32, gui_data: &GuiData) { - let text_view_errors = gui_data.text_view_errors.clone(); - - let tree_view = scrolled_window.get_children().get(0).unwrap().clone().downcast::().unwrap(); - let selection = tree_view.get_selection(); - - let (selection_rows, tree_model) = selection.get_selected_rows(); - if selection_rows.is_empty() { - return; - } - let list_store = tree_model.clone().downcast::().unwrap(); - - // let new_tree_model = TreeModel::new(); // TODO - maybe create new model when inserting a new data, because this seems to be not optimal when using thousands of rows - - 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 selection_rows.iter().rev() { - let symlink_path = tree_model.get_value(&tree_model.get_iter(tree_path).unwrap(), column_symlink_path).get::().unwrap().unwrap(); - - match fs::remove_file(&symlink_path) { - Ok(_) => { - list_store.remove(&list_store.get_iter(tree_path).unwrap()); - } - Err(_) => messages += format!("Failed to remove file {} because file doesn't exists or you don't have permissions.\n", symlink_path).as_str(), - } - } - - text_view_errors.get_buffer().unwrap().set_text(messages.as_str()); - selection.unselect_all(); -} - fn basic_remove(scrolled_window: gtk::ScrolledWindow, column_file_name: i32, column_path: i32, gui_data: &GuiData) { let text_view_errors = gui_data.text_view_errors.clone(); diff --git a/czkawka_gui/src/connect_compute_results.rs b/czkawka_gui/src/connect_compute_results.rs index 2c6b345..33502b0 100644 --- a/czkawka_gui/src/connect_compute_results.rs +++ b/czkawka_gui/src/connect_compute_results.rs @@ -622,13 +622,15 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver< { let list_store = get_list_store(&scrolled_window_invalid_symlinks); - let col_indices = [0, 1, 2, 3]; + let col_indices = [0, 1, 2, 3, 4]; let vector = ifs.get_invalid_symlinks(); for file_entry in vector { - let values: [&dyn ToValue; 4] = [ - &file_entry.symlink_path.to_string_lossy().to_string(), + let (directory, file) = split_path(&file_entry.symlink_path); + let values: [&dyn ToValue; 5] = [ + &file, + &directory, &file_entry.destination_path.to_string_lossy().to_string(), &get_text_from_invalid_symlink_cause(&file_entry.type_of_error), &(NaiveDateTime::from_timestamp(file_entry.modified_date as i64, 0).to_string()), diff --git a/czkawka_gui/src/create_tree_view.rs b/czkawka_gui/src/create_tree_view.rs index d857153..89dd64e 100644 --- a/czkawka_gui/src/create_tree_view.rs +++ b/czkawka_gui/src/create_tree_view.rs @@ -399,10 +399,19 @@ pub fn create_tree_view_invalid_symlinks(tree_view: &mut gtk::TreeView) { let renderer = gtk::CellRendererText::new(); let column: gtk::TreeViewColumn = TreeViewColumn::new(); column.pack_start(&renderer, true); - column.set_title("Symlink Path"); + column.set_title("Symlink File Name"); column.set_resizable(true); column.set_min_width(50); - column.add_attribute(&renderer, "text", ColumnsInvalidSymlinks::SymlinkPath as i32); + column.add_attribute(&renderer, "text", ColumnsInvalidSymlinks::Name as i32); + tree_view.append_column(&column); + + let renderer = gtk::CellRendererText::new(); + let column: gtk::TreeViewColumn = TreeViewColumn::new(); + column.pack_start(&renderer, true); + column.set_title("Symlink Folder"); + column.set_resizable(true); + column.set_min_width(50); + column.add_attribute(&renderer, "text", ColumnsInvalidSymlinks::Path as i32); tree_view.append_column(&column); let renderer = gtk::CellRendererText::new(); diff --git a/czkawka_gui/src/double_click_opening.rs b/czkawka_gui/src/double_click_opening.rs index 585928f..5b250b5 100644 --- a/czkawka_gui/src/double_click_opening.rs +++ b/czkawka_gui/src/double_click_opening.rs @@ -55,6 +55,13 @@ pub fn opening_double_click_function_similar_images(tree_view: >k::TreeView, e gtk::Inhibit(false) } +pub fn opening_double_click_function_invalid_symlinks(tree_view: >k::TreeView, event: &gdk::EventButton) -> gtk::Inhibit { + if event.get_event_type() == gdk::EventType::DoubleButtonPress { + common_open_function(tree_view, ColumnsInvalidSymlinks::Name as i32, ColumnsInvalidSymlinks::Path as i32); + } + gtk::Inhibit(false) +} + pub fn common_open_function(tree_view: >k::TreeView, column_name: i32, column_path: i32) { let selection = tree_view.get_selection(); let (selection_rows, tree_model) = selection.get_selected_rows(); diff --git a/czkawka_gui/src/help_functions.rs b/czkawka_gui/src/help_functions.rs index 8e8d46e..93cda23 100644 --- a/czkawka_gui/src/help_functions.rs +++ b/czkawka_gui/src/help_functions.rs @@ -94,7 +94,8 @@ pub enum ColumnsSameMusic { TextColor, } pub enum ColumnsInvalidSymlinks { - SymlinkPath = 0, + Name = 0, + Path, DestinationPath, TypeOfError, Modification, diff --git a/czkawka_gui/src/initialize_gui.rs b/czkawka_gui/src/initialize_gui.rs index 4921cab..2fb1ee9 100644 --- a/czkawka_gui/src/initialize_gui.rs +++ b/czkawka_gui/src/initialize_gui.rs @@ -280,7 +280,7 @@ pub fn initialize_gui(gui_data: &GuiData) { } // Invalid Symlinks { - let col_types: [glib::types::Type; 4] = [glib::types::Type::String, glib::types::Type::String, glib::types::Type::String, glib::types::Type::String]; + let col_types: [glib::types::Type; 5] = [glib::types::Type::String, glib::types::Type::String, glib::types::Type::String, glib::types::Type::String, glib::types::Type::String]; let list_store: gtk::ListStore = gtk::ListStore::new(&col_types); let mut tree_view: gtk::TreeView = TreeView::with_model(&list_store); @@ -289,6 +289,8 @@ pub fn initialize_gui(gui_data: &GuiData) { create_tree_view_invalid_symlinks(&mut tree_view); + tree_view.connect_button_press_event(opening_double_click_function_invalid_symlinks); + scrolled_window_invalid_symlinks.add(&tree_view); scrolled_window_invalid_symlinks.show_all(); }