2021-12-20 02:45:10 +13:00
|
|
|
use std::path::PathBuf;
|
|
|
|
|
2020-11-01 02:23:31 +13:00
|
|
|
use gtk::prelude::*;
|
2021-12-01 01:53:04 +13:00
|
|
|
use gtk::{ResponseType, TreeView, Window};
|
2020-11-01 02:23:31 +13:00
|
|
|
|
2022-01-20 10:35:07 +13:00
|
|
|
use crate::flg;
|
2020-12-31 01:41:18 +13:00
|
|
|
#[cfg(target_family = "windows")]
|
|
|
|
use czkawka_core::common::Common;
|
|
|
|
|
2022-01-14 03:58:33 +13:00
|
|
|
use crate::gui_structs::gui_data::GuiData;
|
2021-12-29 02:08:55 +13:00
|
|
|
use crate::help_functions::{get_dialog_box_child, get_list_store, ColumnsExcludedDirectory, ColumnsIncludedDirectory};
|
2021-11-28 08:49:20 +13:00
|
|
|
|
2020-12-08 03:25:44 +13:00
|
|
|
pub fn connect_selection_of_directories(gui_data: &GuiData) {
|
2020-12-31 01:41:18 +13:00
|
|
|
// Add manually directory
|
|
|
|
{
|
2021-01-11 08:12:08 +13:00
|
|
|
let tree_view_included_directories = gui_data.upper_notebook.tree_view_included_directories.clone();
|
2020-12-31 01:41:18 +13:00
|
|
|
let window_main = gui_data.window_main.clone();
|
2021-12-12 04:16:14 +13:00
|
|
|
let buttons_manual_add_included_directory = gui_data.upper_notebook.buttons_manual_add_included_directory.clone();
|
|
|
|
buttons_manual_add_included_directory.connect_clicked(move |_| {
|
2021-12-29 02:08:55 +13:00
|
|
|
add_manually_directories(&window_main, &tree_view_included_directories, false);
|
2020-12-31 22:26:07 +13:00
|
|
|
});
|
|
|
|
}
|
|
|
|
// Add manually excluded directory
|
|
|
|
{
|
2021-01-11 08:12:08 +13:00
|
|
|
let tree_view_excluded_directories = gui_data.upper_notebook.tree_view_excluded_directories.clone();
|
2020-12-31 22:26:07 +13:00
|
|
|
let window_main = gui_data.window_main.clone();
|
2021-01-11 08:12:08 +13:00
|
|
|
let buttons_manual_add_excluded_directory = gui_data.upper_notebook.buttons_manual_add_excluded_directory.clone();
|
2020-12-31 22:26:07 +13:00
|
|
|
buttons_manual_add_excluded_directory.connect_clicked(move |_| {
|
2021-12-29 02:08:55 +13:00
|
|
|
add_manually_directories(&window_main, &tree_view_excluded_directories, true);
|
2020-12-31 01:41:18 +13:00
|
|
|
});
|
|
|
|
}
|
2020-11-01 02:23:31 +13:00
|
|
|
// Add included directory
|
|
|
|
{
|
2021-01-11 08:12:08 +13:00
|
|
|
let tree_view_included_directories = gui_data.upper_notebook.tree_view_included_directories.clone();
|
2020-11-01 02:23:31 +13:00
|
|
|
let window_main = gui_data.window_main.clone();
|
2021-01-11 08:12:08 +13:00
|
|
|
let buttons_add_included_directory = gui_data.upper_notebook.buttons_add_included_directory.clone();
|
2020-11-01 02:23:31 +13:00
|
|
|
buttons_add_included_directory.connect_clicked(move |_| {
|
2021-11-25 20:36:49 +13:00
|
|
|
add_chosen_directories(&window_main, &tree_view_included_directories, false);
|
2020-11-01 02:23:31 +13:00
|
|
|
});
|
|
|
|
}
|
|
|
|
// Add excluded directory
|
|
|
|
{
|
2021-01-11 08:12:08 +13:00
|
|
|
let tree_view_excluded_directories = gui_data.upper_notebook.tree_view_excluded_directories.clone();
|
2020-11-01 02:23:31 +13:00
|
|
|
let window_main = gui_data.window_main.clone();
|
2021-01-11 08:12:08 +13:00
|
|
|
let buttons_add_excluded_directory = gui_data.upper_notebook.buttons_add_excluded_directory.clone();
|
2020-11-01 02:23:31 +13:00
|
|
|
buttons_add_excluded_directory.connect_clicked(move |_| {
|
2021-11-25 20:36:49 +13:00
|
|
|
add_chosen_directories(&window_main, &tree_view_excluded_directories, true);
|
2020-11-01 02:23:31 +13:00
|
|
|
});
|
|
|
|
}
|
|
|
|
// Remove Excluded Folder
|
|
|
|
{
|
2021-01-11 08:12:08 +13:00
|
|
|
let buttons_remove_excluded_directory = gui_data.upper_notebook.buttons_remove_excluded_directory.clone();
|
|
|
|
let tree_view_excluded_directories = gui_data.upper_notebook.tree_view_excluded_directories.clone();
|
2020-11-01 02:23:31 +13:00
|
|
|
buttons_remove_excluded_directory.connect_clicked(move |_| {
|
2021-01-11 01:45:05 +13:00
|
|
|
let list_store = get_list_store(&tree_view_excluded_directories);
|
2021-06-26 04:07:13 +12:00
|
|
|
let selection = tree_view_excluded_directories.selection();
|
2020-11-01 02:23:31 +13:00
|
|
|
|
2021-06-26 04:07:13 +12:00
|
|
|
let (vec_tree_path, _tree_model) = selection.selected_rows();
|
2020-12-30 07:31:09 +13:00
|
|
|
|
|
|
|
for tree_path in vec_tree_path.iter().rev() {
|
2021-06-26 04:07:13 +12:00
|
|
|
list_store.remove(&list_store.iter(tree_path).unwrap());
|
2020-12-30 07:31:09 +13:00
|
|
|
}
|
2020-11-01 02:23:31 +13:00
|
|
|
});
|
|
|
|
}
|
|
|
|
// Remove Included Folder
|
|
|
|
{
|
2021-01-11 08:12:08 +13:00
|
|
|
let buttons_remove_included_directory = gui_data.upper_notebook.buttons_remove_included_directory.clone();
|
|
|
|
let tree_view_included_directories = gui_data.upper_notebook.tree_view_included_directories.clone();
|
2020-11-01 02:23:31 +13:00
|
|
|
buttons_remove_included_directory.connect_clicked(move |_| {
|
2021-01-11 01:45:05 +13:00
|
|
|
let list_store = get_list_store(&tree_view_included_directories);
|
2021-06-26 04:07:13 +12:00
|
|
|
let selection = tree_view_included_directories.selection();
|
2020-11-01 02:23:31 +13:00
|
|
|
|
2021-06-26 04:07:13 +12:00
|
|
|
let (vec_tree_path, _tree_model) = selection.selected_rows();
|
2020-12-30 07:31:09 +13:00
|
|
|
|
|
|
|
for tree_path in vec_tree_path.iter().rev() {
|
2021-06-26 04:07:13 +12:00
|
|
|
list_store.remove(&list_store.iter(tree_path).unwrap());
|
2020-12-30 07:31:09 +13:00
|
|
|
}
|
2020-11-01 02:23:31 +13:00
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2021-11-25 20:36:49 +13:00
|
|
|
|
|
|
|
fn add_chosen_directories(window_main: &Window, tree_view: &TreeView, excluded_items: bool) {
|
2021-12-22 06:44:20 +13:00
|
|
|
let folders_to = if excluded_items {
|
2022-01-20 10:35:07 +13:00
|
|
|
flg!("exclude_folders_dialog_title")
|
2021-12-22 06:44:20 +13:00
|
|
|
} else {
|
2022-01-20 10:35:07 +13:00
|
|
|
flg!("include_folders_dialog_title")
|
2021-12-22 06:44:20 +13:00
|
|
|
};
|
|
|
|
|
|
|
|
let file_chooser = gtk::FileChooserDialog::builder()
|
|
|
|
.title(&folders_to)
|
|
|
|
.action(gtk::FileChooserAction::SelectFolder)
|
|
|
|
.transient_for(window_main)
|
|
|
|
.modal(true)
|
|
|
|
.build();
|
2022-01-20 10:35:07 +13:00
|
|
|
file_chooser.add_button(&flg!("general_ok_button"), ResponseType::Ok);
|
|
|
|
file_chooser.add_button(&flg!("general_close_button"), ResponseType::Cancel);
|
2021-12-01 01:53:04 +13:00
|
|
|
|
2021-12-18 07:44:29 +13:00
|
|
|
file_chooser.set_select_multiple(true);
|
|
|
|
file_chooser.show_all();
|
2021-11-25 20:36:49 +13:00
|
|
|
|
2021-11-28 04:44:30 +13:00
|
|
|
let tree_view = tree_view.clone();
|
2021-12-18 07:44:29 +13:00
|
|
|
file_chooser.connect_response(move |file_chooser, response_type| {
|
2021-11-28 04:44:30 +13:00
|
|
|
if response_type == gtk::ResponseType::Ok {
|
2021-12-19 11:45:37 +13:00
|
|
|
let folders: Vec<PathBuf> = file_chooser.filenames();
|
2021-12-19 04:48:30 +13:00
|
|
|
// GTK 4
|
|
|
|
// folders = Vec::new();
|
|
|
|
// if let Some(g_files) = file_chooser.files() {
|
|
|
|
// for index in 0..g_files.n_items() {
|
|
|
|
// let file = &g_files.item(index);
|
|
|
|
// if let Some(file) = file {
|
|
|
|
// println!("{:?}", file);
|
|
|
|
// let ss = file.clone().downcast::<gtk4::gio::File>().unwrap();
|
|
|
|
// if let Some(path_buf) = ss.path() {
|
|
|
|
// folders.push(path_buf);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
2021-11-28 04:44:30 +13:00
|
|
|
let list_store = get_list_store(&tree_view);
|
|
|
|
|
2021-12-29 02:08:55 +13:00
|
|
|
if excluded_items {
|
|
|
|
for file_entry in &folders {
|
|
|
|
let values: [(u32, &dyn ToValue); 1] = [(ColumnsExcludedDirectory::Path as u32, &file_entry.to_string_lossy().to_string())];
|
|
|
|
list_store.set(&list_store.append(), &values);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
for file_entry in &folders {
|
|
|
|
let values: [(u32, &dyn ToValue); 2] = [
|
|
|
|
(ColumnsIncludedDirectory::Path as u32, &file_entry.to_string_lossy().to_string()),
|
|
|
|
(ColumnsIncludedDirectory::ReferenceButton as u32, &false),
|
|
|
|
];
|
|
|
|
list_store.set(&list_store.append(), &values);
|
|
|
|
}
|
2021-11-28 04:44:30 +13:00
|
|
|
}
|
2021-11-25 20:36:49 +13:00
|
|
|
}
|
2021-12-18 07:44:29 +13:00
|
|
|
file_chooser.close();
|
2021-11-28 04:44:30 +13:00
|
|
|
});
|
2021-11-25 20:36:49 +13:00
|
|
|
}
|
|
|
|
|
2021-12-29 02:08:55 +13:00
|
|
|
fn add_manually_directories(window_main: &Window, tree_view: &TreeView, excluded_items: bool) {
|
2021-12-22 06:44:20 +13:00
|
|
|
let dialog = gtk::Dialog::builder()
|
2022-01-20 10:35:07 +13:00
|
|
|
.title(&flg!("include_manually_directories_dialog_title"))
|
2021-12-22 06:44:20 +13:00
|
|
|
.transient_for(window_main)
|
|
|
|
.modal(true)
|
|
|
|
.build();
|
2022-01-20 10:35:07 +13:00
|
|
|
dialog.add_button(&flg!("general_ok_button"), ResponseType::Ok);
|
|
|
|
dialog.add_button(&flg!("general_close_button"), ResponseType::Cancel);
|
2021-12-01 01:53:04 +13:00
|
|
|
|
2021-11-25 20:36:49 +13:00
|
|
|
let entry: gtk::Entry = gtk::Entry::new();
|
|
|
|
|
2021-12-01 23:09:47 +13:00
|
|
|
get_dialog_box_child(&dialog).add(&entry);
|
2021-11-25 20:36:49 +13:00
|
|
|
|
2021-12-01 23:09:47 +13:00
|
|
|
dialog.show_all();
|
2021-11-25 20:36:49 +13:00
|
|
|
|
2021-11-28 04:44:30 +13:00
|
|
|
let tree_view = tree_view.clone();
|
2021-12-01 23:09:47 +13:00
|
|
|
dialog.connect_response(move |dialog, response_type| {
|
2021-11-28 04:44:30 +13:00
|
|
|
if response_type == gtk::ResponseType::Ok {
|
|
|
|
let text = entry.text().to_string().trim().to_string();
|
2021-11-25 20:36:49 +13:00
|
|
|
|
2021-11-28 04:44:30 +13:00
|
|
|
#[cfg(target_family = "windows")]
|
|
|
|
let text = Common::normalize_windows_path(text).to_string_lossy().to_string();
|
2021-11-25 20:36:49 +13:00
|
|
|
|
2021-11-28 04:44:30 +13:00
|
|
|
if !text.is_empty() {
|
|
|
|
let list_store = get_list_store(&tree_view);
|
2021-11-25 20:36:49 +13:00
|
|
|
|
2021-12-29 02:08:55 +13:00
|
|
|
if excluded_items {
|
|
|
|
let values: [(u32, &dyn ToValue); 1] = [(ColumnsExcludedDirectory::Path as u32, &text)];
|
|
|
|
list_store.set(&list_store.append(), &values);
|
|
|
|
} else {
|
|
|
|
let values: [(u32, &dyn ToValue); 2] = [(ColumnsIncludedDirectory::Path as u32, &text), (ColumnsIncludedDirectory::ReferenceButton as u32, &false)];
|
|
|
|
list_store.set(&list_store.append(), &values);
|
|
|
|
}
|
2021-11-28 04:44:30 +13:00
|
|
|
}
|
2021-11-25 20:36:49 +13:00
|
|
|
}
|
2021-12-01 23:09:47 +13:00
|
|
|
dialog.close();
|
2021-11-28 04:44:30 +13:00
|
|
|
});
|
2021-11-25 20:36:49 +13:00
|
|
|
}
|