1
0
Fork 0
mirror of synced 2024-05-12 00:13:06 +12:00

Improve similar images GUI a little and add sorting to Similarity Enum (#73)

This commit is contained in:
Rafał Mikrut 2020-10-15 17:51:47 +02:00 committed by GitHub
parent a55fe3de9a
commit beb14f9f1d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 296 additions and 250 deletions

View file

@ -6,6 +6,7 @@ use crate::common_traits::{DebugPrint, PrintResults, SaveResults};
use bk_tree::BKTree; use bk_tree::BKTree;
use crossbeam_channel::Receiver; use crossbeam_channel::Receiver;
use humansize::{file_size_opts as options, FileSize}; use humansize::{file_size_opts as options, FileSize};
use image::GenericImageView;
use img_hash::HasherConfig; use img_hash::HasherConfig;
use std::collections::HashMap; use std::collections::HashMap;
use std::fs; use std::fs;
@ -14,7 +15,7 @@ use std::io::Write;
use std::path::PathBuf; use std::path::PathBuf;
use std::time::{SystemTime, UNIX_EPOCH}; use std::time::{SystemTime, UNIX_EPOCH};
#[derive(Clone, Eq, PartialEq)] #[derive(Clone, Eq, PartialEq, Ord, PartialOrd)]
pub enum Similarity { pub enum Similarity {
None, None,
Small, Small,
@ -27,6 +28,7 @@ pub enum Similarity {
pub struct FileEntry { pub struct FileEntry {
pub path: PathBuf, pub path: PathBuf,
pub size: u64, pub size: u64,
pub dimensions: String,
pub modified_date: u64, pub modified_date: u64,
pub similarity: Similarity, pub similarity: Similarity,
} }
@ -225,10 +227,16 @@ impl SimilarImages {
continue 'dir; continue 'dir;
} }
let image = match image::open(&current_file_name) {
Ok(t) => t,
Err(_) => continue 'dir, // Something is wrong with image
};
let dimensions = image.dimensions();
// Creating new file entry // Creating new file entry
let fe: FileEntry = FileEntry { let fe: FileEntry = FileEntry {
path: current_file_name.clone(), path: current_file_name.clone(),
size: metadata.len(), size: metadata.len(),
dimensions: format!("{}x{}", dimensions.0, dimensions.1),
modified_date: match metadata.modified() { modified_date: match metadata.modified() {
Ok(t) => match t.duration_since(UNIX_EPOCH) { Ok(t) => match t.duration_since(UNIX_EPOCH) {
Ok(d) => d.as_secs(), Ok(d) => d.as_secs(),
@ -246,10 +254,6 @@ impl SimilarImages {
similarity: Similarity::None, similarity: Similarity::None,
}; };
let hasher = HasherConfig::with_bytes_type::<[u8; 8]>().to_hasher(); 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 hash = hasher.hash_image(&image);
let mut buf = [0u8; 8]; 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); new_vector.append(&mut vec_similarity_struct);
} }

View file

@ -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);
}

View file

@ -1,7 +1,6 @@
use czkawka_core::common_messages::Messages; use czkawka_core::common_messages::Messages;
use czkawka_core::similar_files::Similarity; use czkawka_core::similar_files::Similarity;
use gtk::prelude::*; use gtk::prelude::*;
use gtk::TreeViewColumn;
use std::collections::HashMap; use std::collections::HashMap;
pub enum ColumnsDuplicates { pub enum ColumnsDuplicates {
@ -42,9 +41,13 @@ pub enum ColumnsTemporaryFiles {
} }
pub enum ColumnsSimilarImages { pub enum ColumnsSimilarImages {
Similarity = 0, Similarity = 0,
Size,
Dimensions,
Name, Name,
Path, Path,
Modification, Modification,
Color,
TextColor,
} }
pub const TEXT_COLOR: &str = "#ffffff"; 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 MAIN_ROW_COLOR: &str = "#f4f434"; // TEST
//pub const HEADER_ROW_COLOR: &str = "#010101"; // 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: &gtk::ScrolledWindow) -> String { pub fn get_string_from_list_store(scrolled_window: &gtk::ScrolledWindow) -> String {
let tree_view: gtk::TreeView = scrolled_window.get_children().get(0).unwrap().clone().downcast::<gtk::TreeView>().unwrap(); let tree_view: gtk::TreeView = scrolled_window.get_children().get(0).unwrap().clone().downcast::<gtk::TreeView>().unwrap();
let list_store: gtk::ListStore = tree_view.get_model().unwrap().downcast::<gtk::ListStore>().unwrap(); let list_store: gtk::ListStore = tree_view.get_model().unwrap().downcast::<gtk::ListStore>().unwrap();
@ -344,15 +127,6 @@ pub fn select_function_duplicates(_tree_selection: &gtk::TreeSelection, tree_mod
true true
} }
pub fn select_function_similar_images(_tree_selection: &gtk::TreeSelection, tree_model: &gtk::TreeModel, tree_path: &gtk::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::<String>().unwrap().unwrap();
if path.trim() == "" {
return false;
}
true
}
pub fn set_buttons(hashmap: &mut HashMap<String, bool>, buttons_array: &[gtk::Button], button_names: &[&str]) { pub fn set_buttons(hashmap: &mut HashMap<String, bool>, buttons_array: &[gtk::Button], button_names: &[&str]) {
for (index, button) in buttons_array.iter().enumerate() { for (index, button) in buttons_array.iter().enumerate() {

View file

@ -1,12 +1,14 @@
mod create_tree_view;
mod double_click_opening; mod double_click_opening;
mod help_functions; mod help_functions;
use czkawka_core::*; use czkawka_core::*;
use humansize::{file_size_opts as options, FileSize}; use humansize::{file_size_opts as options, FileSize};
// TODO split it across mutliple files // TODO split it across multiple files
extern crate gtk; extern crate gtk;
use crate::create_tree_view::*;
use crate::double_click_opening::*; use crate::double_click_opening::*;
use crate::help_functions::*; use crate::help_functions::*;
use chrono::NaiveDateTime; use chrono::NaiveDateTime;
@ -324,13 +326,21 @@ fn main() {
// Similar Images // Similar Images
{ {
// TODO create maybe open button to support opening multiple files at once // 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 list_store: gtk::ListStore = gtk::ListStore::new(&col_types);
let mut tree_view: gtk::TreeView = TreeView::with_model(&list_store); let mut tree_view: gtk::TreeView = TreeView::with_model(&list_store);
tree_view.get_selection().set_mode(SelectionMode::Multiple); 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); create_tree_view_similar_images(&mut tree_view);
@ -491,7 +501,7 @@ fn main() {
// Disable main notebook from any iteraction until search will end // Disable main notebook from any iteraction until search will end
notebook_main.set_sensitive(false); 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() { match notebook_main_children_names.get(notebook_main.get_current_page().unwrap() as usize).unwrap().as_str() {
"notebook_main_duplicate_finder_label" => { "notebook_main_duplicate_finder_label" => {
@ -1856,7 +1866,7 @@ fn main() {
.unwrap() .unwrap()
.clear(); .clear();
} else { } else {
// let information = sf.get_information(); //let information = sf.get_information();
let text_messages = sf.get_text_messages(); let text_messages = sf.get_text_messages();
let base_images_size = sf.get_similar_images().len(); let base_images_size = sf.get_similar_images().len();
@ -1878,34 +1888,37 @@ fn main() {
.unwrap(); .unwrap();
list_store.clear(); 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(); let vec_struct_similar = sf.get_similar_images();
for (index, struct_similar) in vec_struct_similar.iter().enumerate() { for struct_similar in vec_struct_similar.iter() {
// 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);
}
// Header // Header
let (directory, file) = split_path(&struct_similar.base_image.path); 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()), &(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, &file,
&directory, &directory,
&(NaiveDateTime::from_timestamp(struct_similar.base_image.modified_date as i64, 0).to_string()), &(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); list_store.set(&list_store.append(), &col_indices, &values);
// Meat // Meat
for similar_images in &struct_similar.similar_images { for similar_images in &struct_similar.similar_images {
let (directory, file) = split_path(&similar_images.path); 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()), &(get_text_from_similarity(&similar_images.similarity).to_string()),
&similar_images.size.file_size(options::BINARY).unwrap(),
&similar_images.dimensions,
&file, &file,
&directory, &directory,
&(NaiveDateTime::from_timestamp(similar_images.modified_date as i64, 0).to_string()), &(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); list_store.set(&list_store.append(), &col_indices, &values);
} }