diff --git a/czkawka_core/src/similar_files.rs b/czkawka_core/src/similar_files.rs index cdf46b5..570a9d4 100644 --- a/czkawka_core/src/similar_files.rs +++ b/czkawka_core/src/similar_files.rs @@ -6,6 +6,7 @@ use crate::common_traits::{DebugPrint, PrintResults, SaveResults}; use bk_tree::BKTree; use crossbeam_channel::Receiver; use humansize::{file_size_opts as options, FileSize}; +use image::GenericImageView; use img_hash::HasherConfig; use std::collections::HashMap; use std::fs; @@ -14,7 +15,7 @@ use std::io::Write; use std::path::PathBuf; use std::time::{SystemTime, UNIX_EPOCH}; -#[derive(Clone, Eq, PartialEq)] +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd)] pub enum Similarity { None, Small, @@ -27,6 +28,7 @@ pub enum Similarity { pub struct FileEntry { pub path: PathBuf, pub size: u64, + pub dimensions: String, pub modified_date: u64, pub similarity: Similarity, } @@ -225,10 +227,16 @@ impl SimilarImages { continue 'dir; } + let image = match image::open(¤t_file_name) { + Ok(t) => t, + Err(_) => continue 'dir, // Something is wrong with image + }; + let dimensions = image.dimensions(); // Creating new file entry let fe: FileEntry = FileEntry { path: current_file_name.clone(), size: metadata.len(), + dimensions: format!("{}x{}", dimensions.0, dimensions.1), modified_date: match metadata.modified() { Ok(t) => match t.duration_since(UNIX_EPOCH) { Ok(d) => d.as_secs(), @@ -246,10 +254,6 @@ impl SimilarImages { similarity: Similarity::None, }; let hasher = HasherConfig::with_bytes_type::<[u8; 8]>().to_hasher(); - let image = match image::open(current_file_name) { - Ok(t) => t, - Err(_) => continue 'dir, // Something is wrong with image - }; let hash = hasher.hash_image(&image); let mut buf = [0u8; 8]; @@ -325,7 +329,9 @@ impl SimilarImages { } } } - + for similarity_struct in vec_similarity_struct.iter_mut() { + similarity_struct.similar_images.sort_by(|x, y| y.similarity.cmp(&x.similarity)); + } new_vector.append(&mut vec_similarity_struct); } diff --git a/czkawka_gui/src/create_tree_view.rs b/czkawka_gui/src/create_tree_view.rs new file mode 100644 index 0000000..68027fe --- /dev/null +++ b/czkawka_gui/src/create_tree_view.rs @@ -0,0 +1,253 @@ +use crate::help_functions::*; +use gtk::prelude::*; +use gtk::TreeViewColumn; + +pub fn create_tree_view_duplicates(tree_view: &mut gtk::TreeView) { + let renderer = gtk::CellRendererText::new(); + let column: gtk::TreeViewColumn = TreeViewColumn::new(); + column.pack_start(&renderer, true); + column.set_title("File Name"); + column.set_resizable(true); + column.set_min_width(50); + column.add_attribute(&renderer, "text", ColumnsDuplicates::Name as i32); + column.add_attribute(&renderer, "background", ColumnsDuplicates::Color as i32); + column.add_attribute(&renderer, "foreground", ColumnsDuplicates::TextColor 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("Path"); + column.set_resizable(true); + column.set_min_width(100); + column.add_attribute(&renderer, "text", ColumnsDuplicates::Path as i32); + column.add_attribute(&renderer, "background", ColumnsDuplicates::Color as i32); + column.add_attribute(&renderer, "foreground", ColumnsDuplicates::TextColor 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("Modification Date"); + column.set_resizable(true); + column.set_min_width(100); + column.add_attribute(&renderer, "text", ColumnsDuplicates::Modification as i32); + column.add_attribute(&renderer, "background", ColumnsDuplicates::Color as i32); + column.add_attribute(&renderer, "foreground", ColumnsDuplicates::TextColor as i32); + tree_view.append_column(&column); + + tree_view.set_vexpand(true); +} + +pub fn create_tree_view_empty_folders(tree_view: &mut gtk::TreeView) { + let renderer = gtk::CellRendererText::new(); + let column: gtk::TreeViewColumn = TreeViewColumn::new(); + column.pack_start(&renderer, true); + column.set_title("Folder Name"); + column.set_resizable(true); + column.set_min_width(50); + column.add_attribute(&renderer, "text", ColumnsEmptyFolders::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("Path"); + column.set_resizable(true); + column.set_min_width(100); + column.add_attribute(&renderer, "text", ColumnsEmptyFolders::Path 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("Modification Date"); + column.set_resizable(true); + column.set_min_width(100); + column.add_attribute(&renderer, "text", ColumnsEmptyFolders::Modification as i32); + tree_view.append_column(&column); + + tree_view.set_vexpand(true); +} + +pub fn create_tree_view_big_files(tree_view: &mut gtk::TreeView) { + let renderer = gtk::CellRendererText::new(); + let column: gtk::TreeViewColumn = TreeViewColumn::new(); + column.pack_start(&renderer, true); + column.set_title("Size"); + column.set_resizable(true); + column.set_min_width(50); + column.add_attribute(&renderer, "text", ColumnsBigFiles::Size 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("File Name"); + column.set_resizable(true); + column.set_min_width(50); + column.add_attribute(&renderer, "text", ColumnsBigFiles::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("Path"); + column.set_resizable(true); + column.set_min_width(100); + column.add_attribute(&renderer, "text", ColumnsBigFiles::Path 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("Modification Date"); + column.set_resizable(true); + column.set_min_width(100); + column.add_attribute(&renderer, "text", ColumnsBigFiles::Modification as i32); + tree_view.append_column(&column); + + tree_view.set_vexpand(true); +} + +pub fn create_tree_view_temporary_files(tree_view: &mut gtk::TreeView) { + let renderer = gtk::CellRendererText::new(); + let column: gtk::TreeViewColumn = TreeViewColumn::new(); + column.pack_start(&renderer, true); + column.set_title("File Name"); + column.set_resizable(true); + column.set_min_width(50); + column.add_attribute(&renderer, "text", ColumnsTemporaryFiles::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("Path"); + column.set_resizable(true); + column.set_min_width(100); + column.add_attribute(&renderer, "text", ColumnsTemporaryFiles::Path 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("Modification Date"); + column.set_resizable(true); + column.set_min_width(100); + column.add_attribute(&renderer, "text", ColumnsTemporaryFiles::Modification as i32); + tree_view.append_column(&column); + + tree_view.set_vexpand(true); +} + +pub fn create_tree_view_empty_files(tree_view: &mut gtk::TreeView) { + let renderer = gtk::CellRendererText::new(); + let column: gtk::TreeViewColumn = TreeViewColumn::new(); + column.pack_start(&renderer, true); + column.set_title("File Name"); + column.set_resizable(true); + column.set_min_width(50); + column.add_attribute(&renderer, "text", ColumnsEmptyFiles::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("Path"); + column.set_resizable(true); + column.set_min_width(100); + column.add_attribute(&renderer, "text", ColumnsEmptyFiles::Path 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("Modification Date"); + column.set_resizable(true); + column.set_min_width(100); + column.add_attribute(&renderer, "text", ColumnsEmptyFiles::Modification as i32); + tree_view.append_column(&column); + + tree_view.set_vexpand(true); +} + +pub fn create_tree_view_similar_images(tree_view: &mut gtk::TreeView) { + let renderer = gtk::CellRendererText::new(); + let column: gtk::TreeViewColumn = TreeViewColumn::new(); + column.pack_start(&renderer, true); + column.set_title("Similarity"); + column.set_resizable(true); + column.set_min_width(50); + column.add_attribute(&renderer, "text", ColumnsSimilarImages::Similarity as i32); + column.add_attribute(&renderer, "background", ColumnsSimilarImages::Color as i32); + column.add_attribute(&renderer, "foreground", ColumnsSimilarImages::TextColor 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("Size"); + column.set_resizable(true); + column.set_min_width(50); + column.add_attribute(&renderer, "text", ColumnsSimilarImages::Size as i32); + column.add_attribute(&renderer, "background", ColumnsSimilarImages::Color as i32); + column.add_attribute(&renderer, "foreground", ColumnsSimilarImages::TextColor 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("Dimensions"); + column.set_resizable(true); + column.set_min_width(50); + column.add_attribute(&renderer, "text", ColumnsSimilarImages::Dimensions as i32); + column.add_attribute(&renderer, "background", ColumnsSimilarImages::Color as i32); + column.add_attribute(&renderer, "foreground", ColumnsSimilarImages::TextColor 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("File Name"); + column.set_resizable(true); + column.set_min_width(50); + column.add_attribute(&renderer, "text", ColumnsSimilarImages::Name as i32); + column.add_attribute(&renderer, "background", ColumnsSimilarImages::Color as i32); + column.add_attribute(&renderer, "foreground", ColumnsSimilarImages::TextColor 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("Path"); + column.set_resizable(true); + column.set_min_width(100); + column.add_attribute(&renderer, "text", ColumnsSimilarImages::Path as i32); + column.add_attribute(&renderer, "background", ColumnsSimilarImages::Color as i32); + column.add_attribute(&renderer, "foreground", ColumnsSimilarImages::TextColor 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("Modification Date"); + column.set_resizable(true); + column.set_min_width(100); + column.add_attribute(&renderer, "text", ColumnsSimilarImages::Modification as i32); + column.add_attribute(&renderer, "background", ColumnsSimilarImages::Color as i32); + column.add_attribute(&renderer, "foreground", ColumnsSimilarImages::TextColor as i32); + tree_view.append_column(&column); + + tree_view.set_vexpand(true); +} + +pub fn create_tree_view_directories(tree_view: &mut gtk::TreeView) { + let renderer = gtk::CellRendererText::new(); + let column: gtk::TreeViewColumn = TreeViewColumn::new(); + column.pack_start(&renderer, true); + column.add_attribute(&renderer, "text", ColumnsDirectory::Path as i32); + tree_view.append_column(&column); + + tree_view.set_headers_visible(false); +} diff --git a/czkawka_gui/src/help_functions.rs b/czkawka_gui/src/help_functions.rs index 90734cc..558695d 100644 --- a/czkawka_gui/src/help_functions.rs +++ b/czkawka_gui/src/help_functions.rs @@ -1,7 +1,6 @@ use czkawka_core::common_messages::Messages; use czkawka_core::similar_files::Similarity; use gtk::prelude::*; -use gtk::TreeViewColumn; use std::collections::HashMap; pub enum ColumnsDuplicates { @@ -42,9 +41,13 @@ pub enum ColumnsTemporaryFiles { } pub enum ColumnsSimilarImages { Similarity = 0, + Size, + Dimensions, Name, Path, Modification, + Color, + TextColor, } pub const TEXT_COLOR: &str = "#ffffff"; @@ -53,226 +56,6 @@ pub const HEADER_ROW_COLOR: &str = "#272727"; //pub const MAIN_ROW_COLOR: &str = "#f4f434"; // TEST //pub const HEADER_ROW_COLOR: &str = "#010101"; // TEST -pub fn create_tree_view_duplicates(tree_view: &mut gtk::TreeView) { - let renderer = gtk::CellRendererText::new(); - let name_column: gtk::TreeViewColumn = TreeViewColumn::new(); - name_column.pack_start(&renderer, true); - name_column.set_title("File Name"); - name_column.set_resizable(true); - name_column.set_min_width(50); - name_column.add_attribute(&renderer, "text", ColumnsDuplicates::Name as i32); - name_column.add_attribute(&renderer, "background", ColumnsDuplicates::Color as i32); - name_column.add_attribute(&renderer, "foreground", ColumnsDuplicates::TextColor as i32); - tree_view.append_column(&name_column); - - let renderer = gtk::CellRendererText::new(); - let path_column: gtk::TreeViewColumn = TreeViewColumn::new(); - path_column.pack_start(&renderer, true); - path_column.set_title("Path"); - path_column.set_resizable(true); - path_column.set_min_width(100); - path_column.add_attribute(&renderer, "text", ColumnsDuplicates::Path as i32); - path_column.add_attribute(&renderer, "background", ColumnsDuplicates::Color as i32); - path_column.add_attribute(&renderer, "foreground", ColumnsDuplicates::TextColor as i32); - tree_view.append_column(&path_column); - - let renderer = gtk::CellRendererText::new(); - let modification_date_column: gtk::TreeViewColumn = TreeViewColumn::new(); - modification_date_column.pack_start(&renderer, true); - modification_date_column.set_title("Modification Date"); - modification_date_column.set_resizable(true); - modification_date_column.set_min_width(100); - modification_date_column.add_attribute(&renderer, "text", ColumnsDuplicates::Modification as i32); - modification_date_column.add_attribute(&renderer, "background", ColumnsDuplicates::Color as i32); - modification_date_column.add_attribute(&renderer, "foreground", ColumnsDuplicates::TextColor as i32); - tree_view.append_column(&modification_date_column); - - tree_view.set_vexpand(true); -} - -pub fn create_tree_view_empty_folders(tree_view: &mut gtk::TreeView) { - let renderer = gtk::CellRendererText::new(); - let name_column: gtk::TreeViewColumn = TreeViewColumn::new(); - name_column.pack_start(&renderer, true); - name_column.set_title("Folder Name"); - name_column.set_resizable(true); - name_column.set_min_width(50); - name_column.add_attribute(&renderer, "text", ColumnsEmptyFolders::Name as i32); - tree_view.append_column(&name_column); - - let renderer = gtk::CellRendererText::new(); - let path_column: gtk::TreeViewColumn = TreeViewColumn::new(); - path_column.pack_start(&renderer, true); - path_column.set_title("Path"); - path_column.set_resizable(true); - path_column.set_min_width(100); - path_column.add_attribute(&renderer, "text", ColumnsEmptyFolders::Path as i32); - tree_view.append_column(&path_column); - - let renderer = gtk::CellRendererText::new(); - let modification_date_column: gtk::TreeViewColumn = TreeViewColumn::new(); - modification_date_column.pack_start(&renderer, true); - modification_date_column.set_title("Modification Date"); - modification_date_column.set_resizable(true); - modification_date_column.set_min_width(100); - modification_date_column.add_attribute(&renderer, "text", ColumnsEmptyFolders::Modification as i32); - tree_view.append_column(&modification_date_column); - - tree_view.set_vexpand(true); -} - -pub fn create_tree_view_big_files(tree_view: &mut gtk::TreeView) { - let renderer = gtk::CellRendererText::new(); - let name_column: gtk::TreeViewColumn = TreeViewColumn::new(); - name_column.pack_start(&renderer, true); - name_column.set_title("Size"); - name_column.set_resizable(true); - name_column.set_min_width(50); - name_column.add_attribute(&renderer, "text", ColumnsBigFiles::Size as i32); - - tree_view.append_column(&name_column); - let renderer = gtk::CellRendererText::new(); - let name_column: gtk::TreeViewColumn = TreeViewColumn::new(); - name_column.pack_start(&renderer, true); - name_column.set_title("File Name"); - name_column.set_resizable(true); - name_column.set_min_width(50); - name_column.add_attribute(&renderer, "text", ColumnsBigFiles::Name as i32); - tree_view.append_column(&name_column); - - let renderer = gtk::CellRendererText::new(); - let path_column: gtk::TreeViewColumn = TreeViewColumn::new(); - path_column.pack_start(&renderer, true); - path_column.set_title("Path"); - path_column.set_resizable(true); - path_column.set_min_width(100); - path_column.add_attribute(&renderer, "text", ColumnsBigFiles::Path as i32); - tree_view.append_column(&path_column); - - let renderer = gtk::CellRendererText::new(); - let modification_date_column: gtk::TreeViewColumn = TreeViewColumn::new(); - modification_date_column.pack_start(&renderer, true); - modification_date_column.set_title("Modification Date"); - modification_date_column.set_resizable(true); - modification_date_column.set_min_width(100); - modification_date_column.add_attribute(&renderer, "text", ColumnsBigFiles::Modification as i32); - tree_view.append_column(&modification_date_column); - - tree_view.set_vexpand(true); -} - -pub fn create_tree_view_temporary_files(tree_view: &mut gtk::TreeView) { - let renderer = gtk::CellRendererText::new(); - let name_column: gtk::TreeViewColumn = TreeViewColumn::new(); - name_column.pack_start(&renderer, true); - name_column.set_title("File Name"); - name_column.set_resizable(true); - name_column.set_min_width(50); - name_column.add_attribute(&renderer, "text", ColumnsTemporaryFiles::Name as i32); - tree_view.append_column(&name_column); - - let renderer = gtk::CellRendererText::new(); - let path_column: gtk::TreeViewColumn = TreeViewColumn::new(); - path_column.pack_start(&renderer, true); - path_column.set_title("Path"); - path_column.set_resizable(true); - path_column.set_min_width(100); - path_column.add_attribute(&renderer, "text", ColumnsTemporaryFiles::Path as i32); - tree_view.append_column(&path_column); - - let renderer = gtk::CellRendererText::new(); - let modification_date_column: gtk::TreeViewColumn = TreeViewColumn::new(); - modification_date_column.pack_start(&renderer, true); - modification_date_column.set_title("Modification Date"); - modification_date_column.set_resizable(true); - modification_date_column.set_min_width(100); - modification_date_column.add_attribute(&renderer, "text", ColumnsTemporaryFiles::Modification as i32); - tree_view.append_column(&modification_date_column); - - tree_view.set_vexpand(true); -} - -pub fn create_tree_view_empty_files(tree_view: &mut gtk::TreeView) { - let renderer = gtk::CellRendererText::new(); - let name_column: gtk::TreeViewColumn = TreeViewColumn::new(); - name_column.pack_start(&renderer, true); - name_column.set_title("File Name"); - name_column.set_resizable(true); - name_column.set_min_width(50); - name_column.add_attribute(&renderer, "text", ColumnsEmptyFiles::Name as i32); - tree_view.append_column(&name_column); - - let renderer = gtk::CellRendererText::new(); - let path_column: gtk::TreeViewColumn = TreeViewColumn::new(); - path_column.pack_start(&renderer, true); - path_column.set_title("Path"); - path_column.set_resizable(true); - path_column.set_min_width(100); - path_column.add_attribute(&renderer, "text", ColumnsEmptyFiles::Path as i32); - tree_view.append_column(&path_column); - - let renderer = gtk::CellRendererText::new(); - let modification_date_column: gtk::TreeViewColumn = TreeViewColumn::new(); - modification_date_column.pack_start(&renderer, true); - modification_date_column.set_title("Modification Date"); - modification_date_column.set_resizable(true); - modification_date_column.set_min_width(100); - modification_date_column.add_attribute(&renderer, "text", ColumnsEmptyFiles::Modification as i32); - tree_view.append_column(&modification_date_column); - - tree_view.set_vexpand(true); -} - -pub fn create_tree_view_similar_images(tree_view: &mut gtk::TreeView) { - let renderer = gtk::CellRendererText::new(); - let name_column: gtk::TreeViewColumn = TreeViewColumn::new(); - name_column.pack_start(&renderer, true); - name_column.set_title("Similarity"); - name_column.set_resizable(true); - name_column.set_min_width(50); - name_column.add_attribute(&renderer, "text", ColumnsSimilarImages::Similarity as i32); - - tree_view.append_column(&name_column); - let renderer = gtk::CellRendererText::new(); - let name_column: gtk::TreeViewColumn = TreeViewColumn::new(); - name_column.pack_start(&renderer, true); - name_column.set_title("File Name"); - name_column.set_resizable(true); - name_column.set_min_width(50); - name_column.add_attribute(&renderer, "text", ColumnsSimilarImages::Name as i32); - tree_view.append_column(&name_column); - - let renderer = gtk::CellRendererText::new(); - let path_column: gtk::TreeViewColumn = TreeViewColumn::new(); - path_column.pack_start(&renderer, true); - path_column.set_title("Path"); - path_column.set_resizable(true); - path_column.set_min_width(100); - path_column.add_attribute(&renderer, "text", ColumnsSimilarImages::Path as i32); - tree_view.append_column(&path_column); - - let renderer = gtk::CellRendererText::new(); - let modification_date_column: gtk::TreeViewColumn = TreeViewColumn::new(); - modification_date_column.pack_start(&renderer, true); - modification_date_column.set_title("Modification Date"); - modification_date_column.set_resizable(true); - modification_date_column.set_min_width(100); - modification_date_column.add_attribute(&renderer, "text", ColumnsSimilarImages::Modification as i32); - tree_view.append_column(&modification_date_column); - - tree_view.set_vexpand(true); -} - -pub fn create_tree_view_directories(tree_view: &mut gtk::TreeView) { - let renderer = gtk::CellRendererText::new(); - let name_column: gtk::TreeViewColumn = TreeViewColumn::new(); - name_column.pack_start(&renderer, true); - name_column.add_attribute(&renderer, "text", ColumnsDirectory::Path as i32); - tree_view.append_column(&name_column); - - tree_view.set_headers_visible(false); -} - pub fn get_string_from_list_store(scrolled_window: >k::ScrolledWindow) -> String { let tree_view: gtk::TreeView = scrolled_window.get_children().get(0).unwrap().clone().downcast::().unwrap(); let list_store: gtk::ListStore = tree_view.get_model().unwrap().downcast::().unwrap(); @@ -344,15 +127,6 @@ pub fn select_function_duplicates(_tree_selection: >k::TreeSelection, tree_mod true } -pub fn select_function_similar_images(_tree_selection: >k::TreeSelection, tree_model: >k::TreeModel, tree_path: >k::TreePath, _is_path_currently_selected: bool) -> bool { - let path = tree_model.get_value(&tree_model.get_iter(tree_path).unwrap(), ColumnsSimilarImages::Path as i32).get::().unwrap().unwrap(); - - if path.trim() == "" { - return false; - } - - true -} pub fn set_buttons(hashmap: &mut HashMap, buttons_array: &[gtk::Button], button_names: &[&str]) { for (index, button) in buttons_array.iter().enumerate() { diff --git a/czkawka_gui/src/main.rs b/czkawka_gui/src/main.rs index 5695028..e006ef5 100644 --- a/czkawka_gui/src/main.rs +++ b/czkawka_gui/src/main.rs @@ -1,12 +1,14 @@ +mod create_tree_view; mod double_click_opening; mod help_functions; use czkawka_core::*; use humansize::{file_size_opts as options, FileSize}; -// TODO split it across mutliple files +// TODO split it across multiple files extern crate gtk; +use crate::create_tree_view::*; use crate::double_click_opening::*; use crate::help_functions::*; use chrono::NaiveDateTime; @@ -324,13 +326,21 @@ fn main() { // Similar Images { // TODO create maybe open button to support opening multiple files at once - 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; 8] = [ + 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, + ]; 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); @@ -491,7 +501,7 @@ fn main() { // Disable main notebook from any iteraction until search will end notebook_main.set_sensitive(false); - entry_info.set_text("Searching data, it may take a while please wait..."); + entry_info.set_text("Searching data, it may take a while, please wait..."); match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() { "notebook_main_duplicate_finder_label" => { @@ -1856,7 +1866,7 @@ fn main() { .unwrap() .clear(); } else { - // let information = sf.get_information(); + //let information = sf.get_information(); let text_messages = sf.get_text_messages(); let base_images_size = sf.get_similar_images().len(); @@ -1878,34 +1888,37 @@ fn main() { .unwrap(); list_store.clear(); - let col_indices = [0, 1, 2, 3]; + let col_indices = [0, 1, 2, 3, 4, 5, 6, 7]; let vec_struct_similar = sf.get_similar_images(); - for (index, struct_similar) in vec_struct_similar.iter().enumerate() { - // Empty at the beginning - if index != 0 { - let values: [&dyn ToValue; 4] = [&"".to_string(), &"".to_string(), &"".to_string(), &"".to_string()]; - list_store.set(&list_store.append(), &col_indices, &values); - } + for struct_similar in vec_struct_similar.iter() { // Header let (directory, file) = split_path(&struct_similar.base_image.path); - let values: [&dyn ToValue; 4] = [ + let values: [&dyn ToValue; 8] = [ &(get_text_from_similarity(&struct_similar.base_image.similarity).to_string()), + &struct_similar.base_image.size.file_size(options::BINARY).unwrap(), + &struct_similar.base_image.dimensions, &file, &directory, &(NaiveDateTime::from_timestamp(struct_similar.base_image.modified_date as i64, 0).to_string()), + &(HEADER_ROW_COLOR.to_string()), + &(TEXT_COLOR.to_string()), ]; list_store.set(&list_store.append(), &col_indices, &values); // Meat for similar_images in &struct_similar.similar_images { let (directory, file) = split_path(&similar_images.path); - let values: [&dyn ToValue; 4] = [ + let values: [&dyn ToValue; 8] = [ &(get_text_from_similarity(&similar_images.similarity).to_string()), + &similar_images.size.file_size(options::BINARY).unwrap(), + &similar_images.dimensions, &file, &directory, &(NaiveDateTime::from_timestamp(similar_images.modified_date as i64, 0).to_string()), + &(MAIN_ROW_COLOR.to_string()), + &(TEXT_COLOR.to_string()), ]; list_store.set(&list_store.append(), &col_indices, &values); }