1
0
Fork 0
mirror of synced 2024-04-28 09:33:30 +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 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(&current_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);
}

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::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: &gtk::ScrolledWindow) -> String {
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();
@ -344,15 +127,6 @@ pub fn select_function_duplicates(_tree_selection: &gtk::TreeSelection, tree_mod
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]) {
for (index, button) in buttons_array.iter().enumerate() {

View file

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