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 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(¤t_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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
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::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: >k::ScrolledWindow) -> String {
|
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 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: >k::TreeSelection, tree_mod
|
||||||
|
|
||||||
true
|
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]) {
|
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() {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue