From 865543c7d72ca07cfd161bdca49835d31a4974db Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rafa=C5=82=20Mikrut?=
<41945903+qarmin@users.noreply.github.com>
Date: Tue, 22 Dec 2020 20:04:16 +0100
Subject: [PATCH] Add option to open folders by double right click (#128)
---
czkawka_gui/czkawka.glade | 37 +++++++++++
czkawka_gui/src/connect_button_search.rs | 4 +-
czkawka_gui/src/double_click_opening.rs | 78 +++++++++++++++++-------
czkawka_gui/src/gui_data.rs | 11 ++++
czkawka_gui/src/initialize_gui.rs | 6 +-
5 files changed, 108 insertions(+), 28 deletions(-)
diff --git a/czkawka_gui/czkawka.glade b/czkawka_gui/czkawka.glade
index a3c4c79..c978bb7 100644
--- a/czkawka_gui/czkawka.glade
+++ b/czkawka_gui/czkawka.glade
@@ -181,6 +181,43 @@ Author: RafaĆ Mikrut
+
False
diff --git a/czkawka_gui/src/connect_button_search.rs b/czkawka_gui/src/connect_button_search.rs
index d5f6d87..1cf608c 100644
--- a/czkawka_gui/src/connect_button_search.rs
+++ b/czkawka_gui/src/connect_button_search.rs
@@ -81,8 +81,6 @@ pub fn connect_button_search(
let progress_bar_all_stages = gui_data.progress_bar_all_stages.clone();
let image_preview_similar_images = gui_data.image_preview_similar_images.clone();
- let show_dialog = Arc::new(AtomicBool::new(true));
-
buttons_search_clone.connect_clicked(move |_| {
let included_directories = get_string_from_list_store(&scrolled_window_included_directories);
let excluded_directories = get_string_from_list_store(&scrolled_window_excluded_directories);
@@ -90,6 +88,8 @@ pub fn connect_button_search(
let excluded_items = entry_excluded_items.get_text().as_str().to_string();
let allowed_extensions = entry_allowed_extensions.get_text().as_str().to_string();
+ let show_dialog = Arc::new(AtomicBool::new(true));
+
hide_all_buttons(&buttons_array);
// Disable main notebook from any iteration until search will end
diff --git a/czkawka_gui/src/double_click_opening.rs b/czkawka_gui/src/double_click_opening.rs
index 5b250b5..77d51e9 100644
--- a/czkawka_gui/src/double_click_opening.rs
+++ b/czkawka_gui/src/double_click_opening.rs
@@ -1,77 +1,113 @@
use crate::help_functions::*;
use gtk::prelude::*;
+// TODO add option to open files and folders from context menu activated by pressing ONCE with right mouse button
+
pub fn opening_double_click_function_duplicates(tree_view: >k::TreeView, event: &gdk::EventButton) -> gtk::Inhibit {
- if event.get_event_type() == gdk::EventType::DoubleButtonPress {
- common_open_function(tree_view, ColumnsDuplicates::Name as i32, ColumnsDuplicates::Path as i32);
+ if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 1 {
+ common_open_function(tree_view, ColumnsDuplicates::Name as i32, ColumnsDuplicates::Path as i32, OpenMode::PathAndName);
+ } else if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 3 {
+ common_open_function(tree_view, ColumnsDuplicates::Name as i32, ColumnsDuplicates::Path as i32, OpenMode::OnlyPath);
}
gtk::Inhibit(false)
}
+
pub fn opening_double_click_function_empty_folders(tree_view: >k::TreeView, event: &gdk::EventButton) -> gtk::Inhibit {
- if event.get_event_type() == gdk::EventType::DoubleButtonPress {
- common_open_function(tree_view, ColumnsEmptyFolders::Name as i32, ColumnsEmptyFolders::Path as i32);
+ if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 1 {
+ common_open_function(tree_view, ColumnsEmptyFolders::Name as i32, ColumnsEmptyFolders::Path as i32, OpenMode::PathAndName);
+ } else if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 3 {
+ common_open_function(tree_view, ColumnsEmptyFolders::Name as i32, ColumnsEmptyFolders::Path as i32, OpenMode::OnlyPath);
}
gtk::Inhibit(false)
}
pub fn opening_double_click_function_empty_files(tree_view: >k::TreeView, event: &gdk::EventButton) -> gtk::Inhibit {
- if event.get_event_type() == gdk::EventType::DoubleButtonPress {
- common_open_function(tree_view, ColumnsEmptyFiles::Name as i32, ColumnsEmptyFiles::Path as i32);
+ if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 1 {
+ common_open_function(tree_view, ColumnsEmptyFiles::Name as i32, ColumnsEmptyFiles::Path as i32, OpenMode::PathAndName);
+ } else if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 3 {
+ common_open_function(tree_view, ColumnsEmptyFiles::Name as i32, ColumnsEmptyFiles::Path as i32, OpenMode::OnlyPath);
}
gtk::Inhibit(false)
}
pub fn opening_double_click_function_temporary_files(tree_view: >k::TreeView, event: &gdk::EventButton) -> gtk::Inhibit {
- if event.get_event_type() == gdk::EventType::DoubleButtonPress {
- common_open_function(tree_view, ColumnsTemporaryFiles::Name as i32, ColumnsTemporaryFiles::Path as i32);
+ if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 1 {
+ common_open_function(tree_view, ColumnsTemporaryFiles::Name as i32, ColumnsTemporaryFiles::Path as i32, OpenMode::PathAndName);
+ } else if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 3 {
+ common_open_function(tree_view, ColumnsTemporaryFiles::Name as i32, ColumnsTemporaryFiles::Path as i32, OpenMode::OnlyPath);
}
gtk::Inhibit(false)
}
pub fn opening_double_click_function_big_files(tree_view: >k::TreeView, event: &gdk::EventButton) -> gtk::Inhibit {
- if event.get_event_type() == gdk::EventType::DoubleButtonPress {
- common_open_function(tree_view, ColumnsBigFiles::Name as i32, ColumnsBigFiles::Path as i32);
+ if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 1 {
+ common_open_function(tree_view, ColumnsBigFiles::Name as i32, ColumnsBigFiles::Path as i32, OpenMode::PathAndName);
+ } else if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 3 {
+ common_open_function(tree_view, ColumnsBigFiles::Name as i32, ColumnsBigFiles::Path as i32, OpenMode::OnlyPath);
}
gtk::Inhibit(false)
}
pub fn opening_double_click_function_zeroed_files(tree_view: >k::TreeView, event: &gdk::EventButton) -> gtk::Inhibit {
- if event.get_event_type() == gdk::EventType::DoubleButtonPress {
- common_open_function(tree_view, ColumnsZeroedFiles::Name as i32, ColumnsZeroedFiles::Path as i32);
+ if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 1 {
+ common_open_function(tree_view, ColumnsZeroedFiles::Name as i32, ColumnsZeroedFiles::Path as i32, OpenMode::PathAndName);
+ } else if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 3 {
+ common_open_function(tree_view, ColumnsZeroedFiles::Name as i32, ColumnsZeroedFiles::Path as i32, OpenMode::OnlyPath);
}
gtk::Inhibit(false)
}
pub fn opening_double_click_function_same_music(tree_view: >k::TreeView, event: &gdk::EventButton) -> gtk::Inhibit {
- if event.get_event_type() == gdk::EventType::DoubleButtonPress {
- common_open_function(tree_view, ColumnsSameMusic::Name as i32, ColumnsSameMusic::Path as i32);
+ if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 1 {
+ common_open_function(tree_view, ColumnsSameMusic::Name as i32, ColumnsSameMusic::Path as i32, OpenMode::PathAndName);
+ } else if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 3 {
+ common_open_function(tree_view, ColumnsSameMusic::Name as i32, ColumnsSameMusic::Path as i32, OpenMode::OnlyPath);
}
gtk::Inhibit(false)
}
pub fn opening_double_click_function_similar_images(tree_view: >k::TreeView, event: &gdk::EventButton) -> gtk::Inhibit {
- if event.get_event_type() == gdk::EventType::DoubleButtonPress {
- common_open_function(tree_view, ColumnsSimilarImages::Name as i32, ColumnsSimilarImages::Path as i32);
+ if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 1 {
+ common_open_function(tree_view, ColumnsSimilarImages::Name as i32, ColumnsSimilarImages::Path as i32, OpenMode::PathAndName);
+ } else if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 3 {
+ common_open_function(tree_view, ColumnsSimilarImages::Name as i32, ColumnsSimilarImages::Path as i32, OpenMode::OnlyPath);
}
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);
+ if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 1 {
+ common_open_function(tree_view, ColumnsInvalidSymlinks::Name as i32, ColumnsInvalidSymlinks::Path as i32, OpenMode::PathAndName);
+ } else if event.get_event_type() == gdk::EventType::DoubleButtonPress && event.get_button() == 3 {
+ common_open_function(tree_view, ColumnsInvalidSymlinks::Name as i32, ColumnsInvalidSymlinks::Path as i32, OpenMode::OnlyPath);
}
gtk::Inhibit(false)
}
-pub fn common_open_function(tree_view: >k::TreeView, column_name: i32, column_path: i32) {
+pub enum OpenMode {
+ OnlyPath,
+ PathAndName,
+}
+
+pub fn common_open_function(tree_view: >k::TreeView, column_name: i32, column_path: i32, opening_mode: OpenMode) {
let selection = tree_view.get_selection();
let (selection_rows, tree_model) = selection.get_selected_rows();
for tree_path in selection_rows.iter().rev() {
+ let end_path;
let name = tree_model.get_value(&tree_model.get_iter(tree_path).unwrap(), column_name).get::().unwrap().unwrap();
let path = tree_model.get_value(&tree_model.get_iter(tree_path).unwrap(), column_path).get::().unwrap().unwrap();
- if open::that(format!("{}/{}", path, name)).is_err() {
- println!("Failed to open {}/{}", path, name);
+ match opening_mode {
+ OpenMode::OnlyPath => {
+ end_path = path;
+ }
+ OpenMode::PathAndName => {
+ end_path = format!("{}/{}", path, name);
+ }
+ }
+
+ if open::that(&end_path).is_err() {
+ println!("Failed to open {}", end_path);
}
}
}
diff --git a/czkawka_gui/src/gui_data.rs b/czkawka_gui/src/gui_data.rs
index bdb05cd..8595e7f 100644
--- a/czkawka_gui/src/gui_data.rs
+++ b/czkawka_gui/src/gui_data.rs
@@ -89,10 +89,14 @@ pub struct GuiData {
pub buttons_popover_very_simple_list_unselect_all: gtk::Button,
pub buttons_popover_very_simple_list_reverse: gtk::Button,
+ pub buttons_popover_right_click_open_file: gtk::Button,
+ pub buttons_popover_right_click_open_folder: gtk::Button,
+
//// Popovers
pub popover_select_duplicate: gtk::Popover,
pub popover_select_simple_list: gtk::Popover,
pub popover_select_very_simple_list: gtk::Popover,
+ pub popover_right_click: gtk::Popover,
//// Check Buttons
pub check_button_recursive: gtk::CheckButton,
@@ -302,10 +306,14 @@ impl GuiData {
let buttons_popover_very_simple_list_unselect_all: gtk::Button = builder.get_object("buttons_popover_very_simple_list_unselect_all").unwrap();
let buttons_popover_very_simple_list_reverse: gtk::Button = builder.get_object("buttons_popover_very_simple_list_reverse").unwrap();
+ let buttons_popover_right_click_open_file: gtk::Button = builder.get_object("buttons_popover_right_click_open_file").unwrap();
+ let buttons_popover_right_click_open_folder: gtk::Button = builder.get_object("buttons_popover_right_click_open_folder").unwrap();
+
//// Popovers
let popover_select_duplicate: gtk::Popover = builder.get_object("popover_select_duplicate").unwrap();
let popover_select_simple_list: gtk::Popover = builder.get_object("popover_select_simple_list").unwrap();
let popover_select_very_simple_list: gtk::Popover = builder.get_object("popover_select_very_simple_list").unwrap();
+ let popover_right_click: gtk::Popover = builder.get_object("popover_right_click").unwrap();
//// Check Buttons
let check_button_recursive: gtk::CheckButton = builder.get_object("check_button_recursive").unwrap();
@@ -449,9 +457,12 @@ impl GuiData {
buttons_popover_very_simple_list_select_all,
buttons_popover_very_simple_list_unselect_all,
buttons_popover_very_simple_list_reverse,
+ buttons_popover_right_click_open_file,
+ buttons_popover_right_click_open_folder,
popover_select_duplicate,
popover_select_simple_list,
popover_select_very_simple_list,
+ popover_right_click,
check_button_recursive,
check_button_music_title,
check_button_music_artist,
diff --git a/czkawka_gui/src/initialize_gui.rs b/czkawka_gui/src/initialize_gui.rs
index 2fb1ee9..c25e7fe 100644
--- a/czkawka_gui/src/initialize_gui.rs
+++ b/czkawka_gui/src/initialize_gui.rs
@@ -155,11 +155,7 @@ pub fn initialize_gui(gui_data: &GuiData) {
create_tree_view_similar_images(&mut tree_view);
tree_view.connect_button_press_event(opening_double_click_function_similar_images);
- tree_view.connect_button_release_event(move |tree_view, event| {
- if event.get_event_type() == gdk::EventType::DoubleButtonPress {
- common_open_function(tree_view, ColumnsSimilarImages::Name as i32, ColumnsSimilarImages::Path as i32);
- }
-
+ tree_view.connect_button_release_event(move |tree_view, _event| {
let (selected_rows, tree_model) = tree_view.get_selection().get_selected_rows();
let mut created_image = false;