1
0
Fork 0
mirror of synced 2024-05-06 05:22:25 +12:00
czkawka/czkawka_gui/src/initialize_gui.rs
2020-12-16 10:13:56 +01:00

309 lines
15 KiB
Rust

use crate::create_tree_view::*;
use crate::double_click_opening::*;
use crate::gui_data::*;
use crate::help_functions::*;
use directories_next::ProjectDirs;
use gtk::prelude::*;
use gtk::{SelectionMode, TreeView};
use image::imageops::FilterType;
use image::GenericImageView;
use std::cmp::Ordering;
use std::fs;
use std::path::Path;
pub fn initialize_gui(gui_data: &GuiData) {
//// Setup default look(duplicate finder)
{
let buttons_search = gui_data.buttons_search.clone();
let buttons_save = gui_data.buttons_save.clone();
let buttons_delete = gui_data.buttons_delete.clone();
let buttons_select = gui_data.buttons_select.clone();
let scrolled_window_duplicate_finder = gui_data.scrolled_window_duplicate_finder.clone();
let scrolled_window_main_empty_folder_finder = gui_data.scrolled_window_main_empty_folder_finder.clone();
let scrolled_window_main_empty_files_finder = gui_data.scrolled_window_main_empty_files_finder.clone();
let scrolled_window_main_temporary_files_finder = gui_data.scrolled_window_main_temporary_files_finder.clone();
let scrolled_window_big_files_finder = gui_data.scrolled_window_big_files_finder.clone();
let scrolled_window_similar_images_finder = gui_data.scrolled_window_similar_images_finder.clone();
let scrolled_window_same_music_finder = gui_data.scrolled_window_same_music_finder.clone();
let scrolled_window_zeroed_files_finder = gui_data.scrolled_window_zeroed_files_finder.clone();
let scrolled_window_included_directories = gui_data.scrolled_window_included_directories.clone();
let scrolled_window_excluded_directories = gui_data.scrolled_window_excluded_directories.clone();
let image_preview_similar_images = gui_data.image_preview_similar_images.clone();
// Disable and show buttons
buttons_search.show();
buttons_save.hide();
buttons_delete.hide();
buttons_select.hide();
// Set Main Scrolled Window Treeviews
{
// Duplicate Files
{
let col_types: [glib::types::Type; 6] = [
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::U64,
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);
tree_view.get_selection().set_mode(SelectionMode::Multiple);
tree_view.get_selection().set_select_function(Some(Box::new(select_function_duplicates)));
create_tree_view_duplicates(&mut tree_view);
tree_view.connect_button_press_event(opening_double_click_function_duplicates);
scrolled_window_duplicate_finder.add(&tree_view);
scrolled_window_duplicate_finder.show_all();
}
// Empty Folders
{
let col_types: [glib::types::Type; 3] = [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);
tree_view.get_selection().set_mode(SelectionMode::Multiple);
create_tree_view_empty_folders(&mut tree_view);
tree_view.connect_button_press_event(opening_double_click_function_empty_folders);
scrolled_window_main_empty_folder_finder.add(&tree_view);
scrolled_window_main_empty_folder_finder.show_all();
}
// Empty Files
{
let col_types: [glib::types::Type; 3] = [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);
tree_view.get_selection().set_mode(SelectionMode::Multiple);
create_tree_view_empty_files(&mut tree_view);
tree_view.connect_button_press_event(opening_double_click_function_empty_files);
scrolled_window_main_empty_files_finder.add(&tree_view);
scrolled_window_main_empty_files_finder.show_all();
}
// Temporary Files
{
let col_types: [glib::types::Type; 3] = [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);
tree_view.get_selection().set_mode(SelectionMode::Multiple);
create_tree_view_temporary_files(&mut tree_view);
tree_view.connect_button_press_event(opening_double_click_function_temporary_files);
scrolled_window_main_temporary_files_finder.add(&tree_view);
scrolled_window_main_temporary_files_finder.show_all();
}
// Big Files
{
let col_types: [glib::types::Type; 4] = [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);
tree_view.get_selection().set_mode(SelectionMode::Multiple);
create_tree_view_big_files(&mut tree_view);
tree_view.connect_button_press_event(opening_double_click_function_big_files);
scrolled_window_big_files_finder.add(&tree_view);
scrolled_window_big_files_finder.show_all();
}
// Similar Images
{
image_preview_similar_images.hide();
let col_types: [glib::types::Type; 9] = [
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::U64,
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);
tree_view.get_selection().set_mode(SelectionMode::Multiple);
tree_view.get_selection().set_select_function(Some(Box::new(select_function_similar_images)));
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);
}
let (selected_rows, tree_model) = tree_view.get_selection().get_selected_rows();
let mut created_image = false;
if !selected_rows.is_empty() {
let tree_path = selected_rows[0].clone();
if let Some(proj_dirs) = ProjectDirs::from("pl", "Qarmin", "Czkawka") {
// TODO labels on {} are in testing stage, so we just ignore for now this warning until found better idea how to fix this
#[allow(clippy::never_loop)]
'dir: loop {
let cache_dir = proj_dirs.cache_dir();
if cache_dir.exists() {
if !cache_dir.is_dir() {
break 'dir;
}
} else if fs::create_dir(cache_dir).is_err() {
break 'dir;
}
let path = tree_model.get_value(&tree_model.get_iter(&tree_path).unwrap(), ColumnsSimilarImages::Path as i32).get::<String>().unwrap().unwrap();
let name = tree_model.get_value(&tree_model.get_iter(&tree_path).unwrap(), ColumnsSimilarImages::Name as i32).get::<String>().unwrap().unwrap();
let file_name = format!("{}/{}", path, name); //"/home/rafal/Pulpit/karl-fitzgerald-4.jpg";
let file_name = file_name.as_str();
if let Some(extension) = Path::new(file_name).extension() {
let img = match image::open(&file_name) {
Ok(t) => t,
Err(_) => {
break 'dir;
}
};
let ratio = img.width() / img.height();
let requested_dimensions = (400, 400);
let new_size;
match ratio.cmp(&(requested_dimensions.0 / requested_dimensions.1)) {
Ordering::Greater => {
new_size = (requested_dimensions.0, (img.height() * requested_dimensions.0) / img.width());
}
Ordering::Less => {
new_size = ((img.width() * requested_dimensions.1) / img.height(), requested_dimensions.1);
}
Ordering::Equal => {
new_size = requested_dimensions;
}
}
let img = img.resize(new_size.0, new_size.1, FilterType::Triangle);
let file_dir = cache_dir.join(format!("cached_file.{}", extension.to_string_lossy()));
if img.save(&file_dir).is_err() {
break 'dir;
}
let string_dir = file_dir.to_string_lossy().to_string();
image_preview_similar_images.set_from_file(string_dir);
created_image = true;
}
break 'dir;
}
}
}
if created_image {
image_preview_similar_images.show();
} else {
image_preview_similar_images.hide();
}
gtk::Inhibit(false)
});
// tree_view.connect_button_press_event(opening_double_click_function_similar_images);
scrolled_window_similar_images_finder.add(&tree_view);
scrolled_window_similar_images_finder.show_all();
}
// Zeroed Files
{
let col_types: [glib::types::Type; 4] = [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);
tree_view.get_selection().set_mode(SelectionMode::Multiple);
create_tree_view_zeroed_files(&mut tree_view);
tree_view.connect_button_press_event(opening_double_click_function_zeroed_files);
scrolled_window_zeroed_files_finder.add(&tree_view);
scrolled_window_zeroed_files_finder.show_all();
}
// Same Files
{
let col_types: [glib::types::Type; 12] = [
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::String,
glib::types::Type::U64,
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);
tree_view.get_selection().set_mode(SelectionMode::Multiple);
create_tree_view_same_music(&mut tree_view);
tree_view.get_selection().set_select_function(Some(Box::new(select_function_same_music)));
tree_view.connect_button_press_event(opening_double_click_function_same_music);
scrolled_window_same_music_finder.add(&tree_view);
scrolled_window_same_music_finder.show_all();
}
}
// Set Included Directory
{
let col_types: [glib::types::Type; 1] = [glib::types::Type::String];
let list_store: gtk::ListStore = gtk::ListStore::new(&col_types);
let mut tree_view_included_directory: gtk::TreeView = TreeView::with_model(&list_store);
tree_view_included_directory.get_selection().set_mode(SelectionMode::Single);
create_tree_view_directories(&mut tree_view_included_directory);
scrolled_window_included_directories.add(&tree_view_included_directory);
scrolled_window_included_directories.show_all();
}
// Set Excluded Directory
{
let col_types: [glib::types::Type; 1] = [glib::types::Type::String];
let list_store: gtk::ListStore = gtk::ListStore::new(&col_types);
let mut tree_view_excluded_directory: gtk::TreeView = TreeView::with_model(&list_store);
tree_view_excluded_directory.get_selection().set_mode(SelectionMode::Single);
create_tree_view_directories(&mut tree_view_excluded_directory);
scrolled_window_excluded_directories.add(&tree_view_excluded_directory);
scrolled_window_excluded_directories.show_all();
}
}
}