Improve similar images GUI a little and add sorting to Similarity Enum (#73)
This commit is contained in:
parent
a55fe3de9a
commit
beb14f9f1d
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
253
czkawka_gui/src/create_tree_view.rs
Normal file
253
czkawka_gui/src/create_tree_view.rs
Normal 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);
|
||||
}
|
|
@ -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::<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: >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::<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() {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue