Update to Rust 1.5.1 (#302)
This commit is contained in:
parent
ce8161fd7e
commit
50ad3f9873
699
Cargo.lock
generated
699
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -256,8 +256,8 @@ impl FileToSave {
|
||||||
fn parse_hash_type(src: &str) -> Result<HashType, &'static str> {
|
fn parse_hash_type(src: &str) -> Result<HashType, &'static str> {
|
||||||
match src.to_ascii_lowercase().as_str() {
|
match src.to_ascii_lowercase().as_str() {
|
||||||
"blake3" => Ok(HashType::Blake3),
|
"blake3" => Ok(HashType::Blake3),
|
||||||
"crc32" => Ok(HashType::CRC32),
|
"crc32" => Ok(HashType::Crc32),
|
||||||
"xxh3" => Ok(HashType::XXH3),
|
"xxh3" => Ok(HashType::Xxh3),
|
||||||
_ => Err("Couldn't parse the hash type (allowed: BLAKE3, CRC32, XXH3)"),
|
_ => Err("Couldn't parse the hash type (allowed: BLAKE3, CRC32, XXH3)"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -267,7 +267,7 @@ fn parse_checking_method(src: &str) -> Result<CheckingMethod, &'static str> {
|
||||||
"name" => Ok(CheckingMethod::Name),
|
"name" => Ok(CheckingMethod::Name),
|
||||||
"size" => Ok(CheckingMethod::Size),
|
"size" => Ok(CheckingMethod::Size),
|
||||||
"hash" => Ok(CheckingMethod::Hash),
|
"hash" => Ok(CheckingMethod::Hash),
|
||||||
"hashmb" => Ok(CheckingMethod::HashMB),
|
"hashmb" => Ok(CheckingMethod::HashMb),
|
||||||
_ => Err("Couldn't parse the search method (allowed: NAME, SIZE, HASH, HASHMB)"),
|
_ => Err("Couldn't parse the search method (allowed: NAME, SIZE, HASH, HASHMB)"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ pub struct FileEntry {
|
||||||
pub enum TypeOfFile {
|
pub enum TypeOfFile {
|
||||||
Unknown = -1,
|
Unknown = -1,
|
||||||
Image = 0,
|
Image = 0,
|
||||||
ArchiveZIP,
|
ArchiveZip,
|
||||||
#[cfg(feature = "broken_audio")]
|
#[cfg(feature = "broken_audio")]
|
||||||
Audio,
|
Audio,
|
||||||
}
|
}
|
||||||
|
@ -315,18 +315,16 @@ impl BrokenFiles {
|
||||||
};
|
};
|
||||||
|
|
||||||
for (name, file_entry) in &self.files_to_check {
|
for (name, file_entry) in &self.files_to_check {
|
||||||
#[allow(clippy::collapsible_if)]
|
#[allow(clippy::if_same_then_else)]
|
||||||
if !loaded_hash_map.contains_key(name) {
|
if !loaded_hash_map.contains_key(name) {
|
||||||
// If loaded data doesn't contains current image info
|
// If loaded data doesn't contains current image info
|
||||||
non_cached_files_to_check.insert(name.clone(), file_entry.clone());
|
non_cached_files_to_check.insert(name.clone(), file_entry.clone());
|
||||||
|
} else if file_entry.size != loaded_hash_map.get(name).unwrap().size || file_entry.modified_date != loaded_hash_map.get(name).unwrap().modified_date {
|
||||||
|
// When size or modification date of image changed, then it is clear that is different image
|
||||||
|
non_cached_files_to_check.insert(name.clone(), file_entry.clone());
|
||||||
} else {
|
} else {
|
||||||
if file_entry.size != loaded_hash_map.get(name).unwrap().size || file_entry.modified_date != loaded_hash_map.get(name).unwrap().modified_date {
|
// Checking may be omitted when already there is entry with same size and modification date
|
||||||
// When size or modification date of image changed, then it is clear that is different image
|
records_already_cached.insert(name.clone(), loaded_hash_map.get(name).unwrap().clone());
|
||||||
non_cached_files_to_check.insert(name.clone(), file_entry.clone());
|
|
||||||
} else {
|
|
||||||
// Checking may be omitted when already there is entry with same size and modification date
|
|
||||||
records_already_cached.insert(name.clone(), loaded_hash_map.get(name).unwrap().clone());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -392,7 +390,7 @@ impl BrokenFiles {
|
||||||
} // Something is wrong with image
|
} // Something is wrong with image
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TypeOfFile::ArchiveZIP => match fs::File::open(&file_entry.path) {
|
TypeOfFile::ArchiveZip => match fs::File::open(&file_entry.path) {
|
||||||
Ok(file) => match zip::ZipArchive::new(file) {
|
Ok(file) => match zip::ZipArchive::new(file) {
|
||||||
Ok(_) => Some(None),
|
Ok(_) => Some(None),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
@ -687,7 +685,7 @@ fn check_extension_avaibility(file_name_lowercase: &str) -> TypeOfFile {
|
||||||
if allowed_image_extensions.iter().any(|e| file_name_lowercase.ends_with(e)) {
|
if allowed_image_extensions.iter().any(|e| file_name_lowercase.ends_with(e)) {
|
||||||
TypeOfFile::Image
|
TypeOfFile::Image
|
||||||
} else if allowed_archive_zip_extensions.iter().any(|e| file_name_lowercase.ends_with(e)) {
|
} else if allowed_archive_zip_extensions.iter().any(|e| file_name_lowercase.ends_with(e)) {
|
||||||
TypeOfFile::ArchiveZIP
|
TypeOfFile::ArchiveZip
|
||||||
} else if allowed_audio_extensions.iter().any(|e| file_name_lowercase.ends_with(e)) {
|
} else if allowed_audio_extensions.iter().any(|e| file_name_lowercase.ends_with(e)) {
|
||||||
#[cfg(feature = "broken_audio")]
|
#[cfg(feature = "broken_audio")]
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,7 +45,7 @@ pub enum CheckingMethod {
|
||||||
Name,
|
Name,
|
||||||
Size,
|
Size,
|
||||||
Hash,
|
Hash,
|
||||||
HashMB,
|
HashMb,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MyHasher for blake3::Hasher {
|
impl MyHasher for blake3::Hasher {
|
||||||
|
@ -78,16 +78,16 @@ impl MyHasher for xxhash_rust::xxh3::Xxh3 {
|
||||||
#[derive(PartialEq, Eq, Clone, Debug, Copy)]
|
#[derive(PartialEq, Eq, Clone, Debug, Copy)]
|
||||||
pub enum HashType {
|
pub enum HashType {
|
||||||
Blake3,
|
Blake3,
|
||||||
CRC32,
|
Crc32,
|
||||||
XXH3,
|
Xxh3,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HashType {
|
impl HashType {
|
||||||
fn hasher(self: &HashType) -> Box<dyn MyHasher> {
|
fn hasher(self: &HashType) -> Box<dyn MyHasher> {
|
||||||
match self {
|
match self {
|
||||||
HashType::Blake3 => Box::new(blake3::Hasher::new()),
|
HashType::Blake3 => Box::new(blake3::Hasher::new()),
|
||||||
HashType::CRC32 => Box::new(crc32fast::Hasher::new()),
|
HashType::Crc32 => Box::new(crc32fast::Hasher::new()),
|
||||||
HashType::XXH3 => Box::new(xxhash_rust::xxh3::Xxh3::new()),
|
HashType::Xxh3 => Box::new(xxhash_rust::xxh3::Xxh3::new()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -193,7 +193,7 @@ impl DuplicateFinder {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CheckingMethod::HashMB | CheckingMethod::Hash => {
|
CheckingMethod::HashMb | CheckingMethod::Hash => {
|
||||||
if !self.check_files_size(stop_receiver, progress_sender) {
|
if !self.check_files_size(stop_receiver, progress_sender) {
|
||||||
self.stopped_search = true;
|
self.stopped_search = true;
|
||||||
return;
|
return;
|
||||||
|
@ -477,7 +477,7 @@ impl DuplicateFinder {
|
||||||
let checking_method = self.check_method.clone();
|
let checking_method = self.check_method.clone();
|
||||||
let max_stage = match self.check_method {
|
let max_stage = match self.check_method {
|
||||||
CheckingMethod::Size => 0,
|
CheckingMethod::Size => 0,
|
||||||
CheckingMethod::HashMB | CheckingMethod::Hash => 2,
|
CheckingMethod::HashMb | CheckingMethod::Hash => 2,
|
||||||
_ => 255,
|
_ => 255,
|
||||||
};
|
};
|
||||||
progress_thread_handle = thread::spawn(move || loop {
|
progress_thread_handle = thread::spawn(move || loop {
|
||||||
|
@ -771,7 +771,7 @@ impl DuplicateFinder {
|
||||||
let mut full_hash_results: Vec<(u64, HashMap<String, Vec<FileEntry>>, Vec<String>, u64)>;
|
let mut full_hash_results: Vec<(u64, HashMap<String, Vec<FileEntry>>, Vec<String>, u64)>;
|
||||||
|
|
||||||
match self.check_method {
|
match self.check_method {
|
||||||
CheckingMethod::HashMB => {
|
CheckingMethod::HashMb => {
|
||||||
full_hash_results = pre_checked_map
|
full_hash_results = pre_checked_map
|
||||||
.par_iter()
|
.par_iter()
|
||||||
.map(|(size, vec_file_entry)| {
|
.map(|(size, vec_file_entry)| {
|
||||||
|
@ -970,7 +970,7 @@ impl DuplicateFinder {
|
||||||
self.information.number_of_failed_to_remove_files += tuple.2;
|
self.information.number_of_failed_to_remove_files += tuple.2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CheckingMethod::Hash | CheckingMethod::HashMB => {
|
CheckingMethod::Hash | CheckingMethod::HashMb => {
|
||||||
for vector_vectors in self.files_with_identical_hashes.values() {
|
for vector_vectors in self.files_with_identical_hashes.values() {
|
||||||
for vector in vector_vectors.iter() {
|
for vector in vector_vectors.iter() {
|
||||||
let tuple: (u64, usize, usize) = delete_files(vector, &self.delete_method, &mut self.text_messages, self.dryrun);
|
let tuple: (u64, usize, usize) = delete_files(vector, &self.delete_method, &mut self.text_messages, self.dryrun);
|
||||||
|
@ -1129,7 +1129,7 @@ impl SaveResults for DuplicateFinder {
|
||||||
write!(writer, "Not found any duplicates.").unwrap();
|
write!(writer, "Not found any duplicates.").unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CheckingMethod::Hash | CheckingMethod::HashMB => {
|
CheckingMethod::Hash | CheckingMethod::HashMb => {
|
||||||
if !self.files_with_identical_hashes.is_empty() {
|
if !self.files_with_identical_hashes.is_empty() {
|
||||||
writeln!(writer, "-------------------------------------------------Files with same hashes-------------------------------------------------").unwrap();
|
writeln!(writer, "-------------------------------------------------Files with same hashes-------------------------------------------------").unwrap();
|
||||||
writeln!(
|
writeln!(
|
||||||
|
@ -1183,7 +1183,7 @@ impl PrintResults for DuplicateFinder {
|
||||||
println!();
|
println!();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CheckingMethod::Hash | CheckingMethod::HashMB => {
|
CheckingMethod::Hash | CheckingMethod::HashMb => {
|
||||||
for (_size, vector) in self.files_with_identical_hashes.iter() {
|
for (_size, vector) in self.files_with_identical_hashes.iter() {
|
||||||
for j in vector {
|
for j in vector {
|
||||||
number_of_files += j.len() as u64;
|
number_of_files += j.len() as u64;
|
||||||
|
@ -1317,7 +1317,7 @@ fn filter_hard_links(vec_file_entry: &[FileEntry]) -> Vec<FileEntry> {
|
||||||
identical
|
identical
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn make_hard_link(src: &PathBuf, dst: &PathBuf) -> io::Result<()> {
|
pub fn make_hard_link(src: &Path, dst: &Path) -> io::Result<()> {
|
||||||
let dst_dir = dst.parent().ok_or_else(|| Error::new(ErrorKind::Other, "No parent"))?;
|
let dst_dir = dst.parent().ok_or_else(|| Error::new(ErrorKind::Other, "No parent"))?;
|
||||||
let temp = tempfile::Builder::new().tempfile_in(dst_dir)?;
|
let temp = tempfile::Builder::new().tempfile_in(dst_dir)?;
|
||||||
fs::rename(dst, temp.path())?;
|
fs::rename(dst, temp.path())?;
|
||||||
|
|
|
@ -7,7 +7,7 @@ use crossbeam_channel::Receiver;
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use std::fs::{File, Metadata};
|
use std::fs::{File, Metadata};
|
||||||
use std::io::{BufWriter, Write};
|
use std::io::{BufWriter, Write};
|
||||||
use std::path::PathBuf;
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::thread::sleep;
|
use std::thread::sleep;
|
||||||
|
@ -288,7 +288,7 @@ impl EmptyFolder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_as_not_empty_folder(folders_checked: &mut BTreeMap<PathBuf, FolderEntry>, current_folder: &PathBuf) {
|
fn set_as_not_empty_folder(folders_checked: &mut BTreeMap<PathBuf, FolderEntry>, current_folder: &Path) {
|
||||||
// Not folder so it may be a file or symbolic link so it isn't empty
|
// Not folder so it may be a file or symbolic link so it isn't empty
|
||||||
folders_checked.get_mut(current_folder).unwrap().is_empty = FolderEmptiness::No;
|
folders_checked.get_mut(current_folder).unwrap().is_empty = FolderEmptiness::No;
|
||||||
let mut d = folders_checked.get_mut(current_folder).unwrap();
|
let mut d = folders_checked.get_mut(current_folder).unwrap();
|
||||||
|
|
|
@ -339,18 +339,16 @@ impl SimilarImages {
|
||||||
};
|
};
|
||||||
|
|
||||||
for (name, file_entry) in &self.images_to_check {
|
for (name, file_entry) in &self.images_to_check {
|
||||||
#[allow(clippy::collapsible_if)]
|
#[allow(clippy::if_same_then_else)]
|
||||||
if !loaded_hash_map.contains_key(name) {
|
if !loaded_hash_map.contains_key(name) {
|
||||||
// If loaded data doesn't contains current image info
|
// If loaded data doesn't contains current image info
|
||||||
non_cached_files_to_check.insert(name.clone(), file_entry.clone());
|
non_cached_files_to_check.insert(name.clone(), file_entry.clone());
|
||||||
|
} else if file_entry.size != loaded_hash_map.get(name).unwrap().size || file_entry.modified_date != loaded_hash_map.get(name).unwrap().modified_date {
|
||||||
|
// When size or modification date of image changed, then it is clear that is different image
|
||||||
|
non_cached_files_to_check.insert(name.clone(), file_entry.clone());
|
||||||
} else {
|
} else {
|
||||||
if file_entry.size != loaded_hash_map.get(name).unwrap().size || file_entry.modified_date != loaded_hash_map.get(name).unwrap().modified_date {
|
// Checking may be omitted when already there is entry with same size and modification date
|
||||||
// When size or modification date of image changed, then it is clear that is different image
|
records_already_cached.insert(name.clone(), loaded_hash_map.get(name).unwrap().clone());
|
||||||
non_cached_files_to_check.insert(name.clone(), file_entry.clone());
|
|
||||||
} else {
|
|
||||||
// Checking may be omitted when already there is entry with same size and modification date
|
|
||||||
records_already_cached.insert(name.clone(), loaded_hash_map.get(name).unwrap().clone());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -137,7 +137,7 @@ pub fn connect_button_search(
|
||||||
} else if radio_button_duplicates_size.get_active() {
|
} else if radio_button_duplicates_size.get_active() {
|
||||||
check_method = duplicate::CheckingMethod::Size;
|
check_method = duplicate::CheckingMethod::Size;
|
||||||
} else if radio_button_duplicates_hashmb.get_active() {
|
} else if radio_button_duplicates_hashmb.get_active() {
|
||||||
check_method = duplicate::CheckingMethod::HashMB;
|
check_method = duplicate::CheckingMethod::HashMb;
|
||||||
} else if radio_button_duplicates_hash.get_active() {
|
} else if radio_button_duplicates_hash.get_active() {
|
||||||
check_method = duplicate::CheckingMethod::Hash;
|
check_method = duplicate::CheckingMethod::Hash;
|
||||||
} else {
|
} else {
|
||||||
|
@ -149,9 +149,9 @@ pub fn connect_button_search(
|
||||||
if radio_button_hash_type_blake3.get_active() {
|
if radio_button_hash_type_blake3.get_active() {
|
||||||
hash_type = duplicate::HashType::Blake3;
|
hash_type = duplicate::HashType::Blake3;
|
||||||
} else if radio_button_hash_type_crc32.get_active() {
|
} else if radio_button_hash_type_crc32.get_active() {
|
||||||
hash_type = duplicate::HashType::CRC32;
|
hash_type = duplicate::HashType::Crc32;
|
||||||
} else if radio_button_hash_type_xxh3.get_active() {
|
} else if radio_button_hash_type_xxh3.get_active() {
|
||||||
hash_type = duplicate::HashType::XXH3;
|
hash_type = duplicate::HashType::Xxh3;
|
||||||
} else {
|
} else {
|
||||||
panic!("No radio button is pressed");
|
panic!("No radio button is pressed");
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,7 +70,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
|
||||||
duplicates_group = information.number_of_groups_by_name;
|
duplicates_group = information.number_of_groups_by_name;
|
||||||
entry_info.set_text(format!("Found {} files in {} groups which have same names.", duplicates_number, duplicates_group).as_str());
|
entry_info.set_text(format!("Found {} files in {} groups which have same names.", duplicates_number, duplicates_group).as_str());
|
||||||
}
|
}
|
||||||
CheckingMethod::Hash | CheckingMethod::HashMB => {
|
CheckingMethod::Hash | CheckingMethod::HashMb => {
|
||||||
duplicates_number = information.number_of_duplicated_files_by_hash;
|
duplicates_number = information.number_of_duplicated_files_by_hash;
|
||||||
duplicates_size = information.lost_space_by_hash;
|
duplicates_size = information.lost_space_by_hash;
|
||||||
duplicates_group = information.number_of_groups_by_hash;
|
duplicates_group = information.number_of_groups_by_hash;
|
||||||
|
@ -132,7 +132,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CheckingMethod::Hash | CheckingMethod::HashMB => {
|
CheckingMethod::Hash | CheckingMethod::HashMb => {
|
||||||
let btreemap = df.get_files_sorted_by_hash();
|
let btreemap = df.get_files_sorted_by_hash();
|
||||||
|
|
||||||
for (size, vectors_vector) in btreemap.iter().rev() {
|
for (size, vectors_vector) in btreemap.iter().rev() {
|
||||||
|
|
|
@ -66,7 +66,7 @@ fn popover_all_except_oldest(popover: >k::Popover, tree_view: >k::TreeView,
|
||||||
let mut tree_iter_array: Vec<TreeIter> = Vec::new();
|
let mut tree_iter_array: Vec<TreeIter> = Vec::new();
|
||||||
let mut oldest_index: Option<usize> = None;
|
let mut oldest_index: Option<usize> = None;
|
||||||
let mut current_index: usize = 0;
|
let mut current_index: usize = 0;
|
||||||
let mut oldest_modification_time: u64 = u64::max_value();
|
let mut oldest_modification_time: u64 = u64::MAX;
|
||||||
|
|
||||||
let mut file_length: usize = 0;
|
let mut file_length: usize = 0;
|
||||||
|
|
||||||
|
@ -182,7 +182,7 @@ fn popover_one_oldest(popover: >k::Popover, tree_view: >k::TreeView, column_
|
||||||
let mut tree_iter_array: Vec<TreeIter> = Vec::new();
|
let mut tree_iter_array: Vec<TreeIter> = Vec::new();
|
||||||
let mut oldest_index: Option<usize> = None;
|
let mut oldest_index: Option<usize> = None;
|
||||||
let mut current_index: usize = 0;
|
let mut current_index: usize = 0;
|
||||||
let mut oldest_modification_time: u64 = u64::max_value();
|
let mut oldest_modification_time: u64 = u64::MAX;
|
||||||
|
|
||||||
let mut file_length: usize = 0;
|
let mut file_length: usize = 0;
|
||||||
|
|
||||||
|
@ -294,7 +294,7 @@ fn popover_select_custom(popover: >k::Popover, gui_data: &GuiData, tree_view:
|
||||||
Path,
|
Path,
|
||||||
Name,
|
Name,
|
||||||
PathName,
|
PathName,
|
||||||
};
|
}
|
||||||
let wildcard_type: WildcardType;
|
let wildcard_type: WildcardType;
|
||||||
|
|
||||||
// Accept Dialog
|
// Accept Dialog
|
||||||
|
@ -410,7 +410,7 @@ fn popover_unselect_custom(popover: >k::Popover, gui_data: &GuiData, tree_view
|
||||||
Path,
|
Path,
|
||||||
Name,
|
Name,
|
||||||
PathName,
|
PathName,
|
||||||
};
|
}
|
||||||
let wildcard_type: WildcardType;
|
let wildcard_type: WildcardType;
|
||||||
|
|
||||||
// Accept Dialog
|
// Accept Dialog
|
||||||
|
@ -590,8 +590,8 @@ fn popover_all_except_smallest(popover: >k::Popover, tree_view: >k::TreeView
|
||||||
let mut tree_iter_array: Vec<TreeIter> = Vec::new();
|
let mut tree_iter_array: Vec<TreeIter> = Vec::new();
|
||||||
let mut smallest_index: Option<usize> = None;
|
let mut smallest_index: Option<usize> = None;
|
||||||
let mut current_index: usize = 0;
|
let mut current_index: usize = 0;
|
||||||
let mut smallest_size_as_bytes: u64 = u64::max_value();
|
let mut smallest_size_as_bytes: u64 = u64::MAX;
|
||||||
let mut smallest_number_of_pixels: u64 = u64::max_value();
|
let mut smallest_number_of_pixels: u64 = u64::MAX;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let color = tree_model.get_value(&tree_iter_all, column_color).get::<String>().unwrap().unwrap();
|
let color = tree_model.get_value(&tree_iter_all, column_color).get::<String>().unwrap().unwrap();
|
||||||
|
|
|
@ -32,7 +32,7 @@ pub fn connect_progress_window(
|
||||||
let future = async move {
|
let future = async move {
|
||||||
while let Some(item) = futures_receiver_duplicate_files.next().await {
|
while let Some(item) = futures_receiver_duplicate_files.next().await {
|
||||||
match item.checking_method {
|
match item.checking_method {
|
||||||
duplicate::CheckingMethod::Hash | duplicate::CheckingMethod::HashMB => {
|
duplicate::CheckingMethod::Hash | duplicate::CheckingMethod::HashMb => {
|
||||||
label_stage.show();
|
label_stage.show();
|
||||||
match item.current_stage {
|
match item.current_stage {
|
||||||
// Checking Size
|
// Checking Size
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct GUIAbout {
|
pub struct GuiAbout {
|
||||||
pub about_dialog: gtk::AboutDialog,
|
pub about_dialog: gtk::AboutDialog,
|
||||||
|
|
||||||
pub button_repository: gtk::Button,
|
pub button_repository: gtk::Button,
|
||||||
|
@ -9,7 +9,7 @@ pub struct GUIAbout {
|
||||||
pub button_instruction: gtk::Button,
|
pub button_instruction: gtk::Button,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GUIAbout {
|
impl GuiAbout {
|
||||||
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
||||||
let about_dialog: gtk::AboutDialog = builder.get_object("about_dialog").unwrap();
|
let about_dialog: gtk::AboutDialog = builder.get_object("about_dialog").unwrap();
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ use gtk::prelude::*;
|
||||||
use gtk::Button;
|
use gtk::Button;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct GUIBottomButtons {
|
pub struct GuiBottomButtons {
|
||||||
pub buttons_search: gtk::Button,
|
pub buttons_search: gtk::Button,
|
||||||
pub buttons_select: gtk::Button,
|
pub buttons_select: gtk::Button,
|
||||||
pub buttons_delete: gtk::Button,
|
pub buttons_delete: gtk::Button,
|
||||||
|
@ -14,7 +14,7 @@ pub struct GUIBottomButtons {
|
||||||
pub buttons_array: [Button; 6],
|
pub buttons_array: [Button; 6],
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GUIBottomButtons {
|
impl GuiBottomButtons {
|
||||||
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
||||||
let buttons_search: gtk::Button = builder.get_object("buttons_search").unwrap();
|
let buttons_search: gtk::Button = builder.get_object("buttons_search").unwrap();
|
||||||
let buttons_select: gtk::Button = builder.get_object("buttons_select").unwrap();
|
let buttons_select: gtk::Button = builder.get_object("buttons_select").unwrap();
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
extern crate gtk;
|
extern crate gtk;
|
||||||
use crate::gui_about::GUIAbout;
|
use crate::gui_about::GuiAbout;
|
||||||
use crate::gui_bottom_buttons::GUIBottomButtons;
|
use crate::gui_bottom_buttons::GuiBottomButtons;
|
||||||
use crate::gui_header::GUIHeader;
|
use crate::gui_header::GuiHeader;
|
||||||
use crate::gui_main_notebook::GUIMainNotebook;
|
use crate::gui_main_notebook::GuiMainNotebook;
|
||||||
use crate::gui_popovers::GUIPopovers;
|
use crate::gui_popovers::GuiPopovers;
|
||||||
use crate::gui_progress_dialog::GUIProgressDialog;
|
use crate::gui_progress_dialog::GuiProgressDialog;
|
||||||
use crate::gui_settings::GUISettings;
|
use crate::gui_settings::GuiSettings;
|
||||||
use crate::gui_upper_notepad::GUIUpperNotebook;
|
use crate::gui_upper_notepad::GuiUpperNotebook;
|
||||||
use crate::notebook_enums::*;
|
use crate::notebook_enums::*;
|
||||||
use crate::taskbar_progress::TaskbarProgress;
|
use crate::taskbar_progress::TaskbarProgress;
|
||||||
use crossbeam_channel::unbounded;
|
use crossbeam_channel::unbounded;
|
||||||
|
@ -35,14 +35,14 @@ pub struct GuiData {
|
||||||
// Windows
|
// Windows
|
||||||
pub window_main: gtk::Window,
|
pub window_main: gtk::Window,
|
||||||
|
|
||||||
pub main_notebook: GUIMainNotebook,
|
pub main_notebook: GuiMainNotebook,
|
||||||
pub upper_notebook: GUIUpperNotebook,
|
pub upper_notebook: GuiUpperNotebook,
|
||||||
pub popovers: GUIPopovers,
|
pub popovers: GuiPopovers,
|
||||||
pub bottom_buttons: GUIBottomButtons,
|
pub bottom_buttons: GuiBottomButtons,
|
||||||
pub progress_window: GUIProgressDialog,
|
pub progress_window: GuiProgressDialog,
|
||||||
pub about: GUIAbout,
|
pub about: GuiAbout,
|
||||||
pub settings: GUISettings,
|
pub settings: GuiSettings,
|
||||||
pub header: GUIHeader,
|
pub header: GuiHeader,
|
||||||
|
|
||||||
// Taskbar state
|
// Taskbar state
|
||||||
pub taskbar_state: Rc<RefCell<TaskbarProgress>>,
|
pub taskbar_state: Rc<RefCell<TaskbarProgress>>,
|
||||||
|
@ -88,14 +88,14 @@ impl GuiData {
|
||||||
window_main.show_all();
|
window_main.show_all();
|
||||||
window_main.set_title("Czkawka");
|
window_main.set_title("Czkawka");
|
||||||
|
|
||||||
let main_notebook = GUIMainNotebook::create_from_builder(&builder);
|
let main_notebook = GuiMainNotebook::create_from_builder(&builder);
|
||||||
let upper_notebook = GUIUpperNotebook::create_from_builder(&builder);
|
let upper_notebook = GuiUpperNotebook::create_from_builder(&builder);
|
||||||
let popovers = GUIPopovers::create_from_builder(&builder);
|
let popovers = GuiPopovers::create_from_builder(&builder);
|
||||||
let bottom_buttons = GUIBottomButtons::create_from_builder(&builder);
|
let bottom_buttons = GuiBottomButtons::create_from_builder(&builder);
|
||||||
let progress_window = GUIProgressDialog::create_from_builder(&builder);
|
let progress_window = GuiProgressDialog::create_from_builder(&builder);
|
||||||
let about = GUIAbout::create_from_builder(&builder);
|
let about = GuiAbout::create_from_builder(&builder);
|
||||||
let header = GUIHeader::create_from_builder(&builder);
|
let header = GuiHeader::create_from_builder(&builder);
|
||||||
let settings = GUISettings::create_from_builder(&builder);
|
let settings = GuiSettings::create_from_builder(&builder);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct GUIHeader {
|
pub struct GuiHeader {
|
||||||
pub button_settings: gtk::Button,
|
pub button_settings: gtk::Button,
|
||||||
pub button_app_info: gtk::Button,
|
pub button_app_info: gtk::Button,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GUIHeader {
|
impl GuiHeader {
|
||||||
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
||||||
let button_settings: gtk::Button = builder.get_object("button_settings").unwrap();
|
let button_settings: gtk::Button = builder.get_object("button_settings").unwrap();
|
||||||
let button_app_info: gtk::Button = builder.get_object("button_app_info").unwrap();
|
let button_app_info: gtk::Button = builder.get_object("button_app_info").unwrap();
|
||||||
|
|
|
@ -2,7 +2,7 @@ use gtk::prelude::*;
|
||||||
use gtk::TreeView;
|
use gtk::TreeView;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct GUIMainNotebook {
|
pub struct GuiMainNotebook {
|
||||||
pub notebook_main: gtk::Notebook,
|
pub notebook_main: gtk::Notebook,
|
||||||
|
|
||||||
pub scrolled_window_duplicate_finder: gtk::ScrolledWindow,
|
pub scrolled_window_duplicate_finder: gtk::ScrolledWindow,
|
||||||
|
@ -60,7 +60,7 @@ pub struct GUIMainNotebook {
|
||||||
pub image_preview_similar_images: gtk::Image,
|
pub image_preview_similar_images: gtk::Image,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GUIMainNotebook {
|
impl GuiMainNotebook {
|
||||||
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
||||||
let notebook_main: gtk::Notebook = builder.get_object("notebook_main").unwrap();
|
let notebook_main: gtk::Notebook = builder.get_object("notebook_main").unwrap();
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct GUIPopovers {
|
pub struct GuiPopovers {
|
||||||
pub buttons_popover_select_all: gtk::Button,
|
pub buttons_popover_select_all: gtk::Button,
|
||||||
pub buttons_popover_unselect_all: gtk::Button,
|
pub buttons_popover_unselect_all: gtk::Button,
|
||||||
pub buttons_popover_reverse: gtk::Button,
|
pub buttons_popover_reverse: gtk::Button,
|
||||||
|
@ -26,7 +26,7 @@ pub struct GUIPopovers {
|
||||||
pub popover_right_click: gtk::Popover,
|
pub popover_right_click: gtk::Popover,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GUIPopovers {
|
impl GuiPopovers {
|
||||||
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
||||||
let buttons_popover_select_all: gtk::Button = builder.get_object("buttons_popover_select_all").unwrap();
|
let buttons_popover_select_all: gtk::Button = builder.get_object("buttons_popover_select_all").unwrap();
|
||||||
let buttons_popover_unselect_all: gtk::Button = builder.get_object("buttons_popover_unselect_all").unwrap();
|
let buttons_popover_unselect_all: gtk::Button = builder.get_object("buttons_popover_unselect_all").unwrap();
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct GUIProgressDialog {
|
pub struct GuiProgressDialog {
|
||||||
pub window_progress: gtk::Window,
|
pub window_progress: gtk::Window,
|
||||||
|
|
||||||
pub progress_bar_current_stage: gtk::ProgressBar,
|
pub progress_bar_current_stage: gtk::ProgressBar,
|
||||||
|
@ -14,7 +14,7 @@ pub struct GUIProgressDialog {
|
||||||
pub button_stop_in_dialog: gtk::Button,
|
pub button_stop_in_dialog: gtk::Button,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GUIProgressDialog {
|
impl GuiProgressDialog {
|
||||||
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
||||||
let window_progress: gtk::Window = builder.get_object("window_progress").unwrap();
|
let window_progress: gtk::Window = builder.get_object("window_progress").unwrap();
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct GUISettings {
|
pub struct GuiSettings {
|
||||||
pub window_settings: gtk::Window,
|
pub window_settings: gtk::Window,
|
||||||
|
|
||||||
// General
|
// General
|
||||||
|
@ -25,7 +25,7 @@ pub struct GUISettings {
|
||||||
pub button_settings_reset_configuration: gtk::Button,
|
pub button_settings_reset_configuration: gtk::Button,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GUISettings {
|
impl GuiSettings {
|
||||||
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
||||||
let window_settings: gtk::Window = builder.get_object("window_settings").unwrap();
|
let window_settings: gtk::Window = builder.get_object("window_settings").unwrap();
|
||||||
|
|
||||||
|
@ -56,13 +56,13 @@ impl GUISettings {
|
||||||
check_button_settings_confirm_deletion,
|
check_button_settings_confirm_deletion,
|
||||||
check_button_settings_confirm_group_deletion,
|
check_button_settings_confirm_group_deletion,
|
||||||
check_button_settings_show_text_view,
|
check_button_settings_show_text_view,
|
||||||
|
check_button_settings_use_cache,
|
||||||
|
check_button_settings_use_trash,
|
||||||
|
check_button_settings_hide_hard_links,
|
||||||
|
check_button_settings_show_preview_similar_images,
|
||||||
button_settings_save_configuration,
|
button_settings_save_configuration,
|
||||||
button_settings_load_configuration,
|
button_settings_load_configuration,
|
||||||
button_settings_reset_configuration,
|
button_settings_reset_configuration,
|
||||||
check_button_settings_show_preview_similar_images,
|
|
||||||
check_button_settings_hide_hard_links,
|
|
||||||
check_button_settings_use_cache,
|
|
||||||
check_button_settings_use_trash,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ use gtk::prelude::*;
|
||||||
use gtk::TreeView;
|
use gtk::TreeView;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct GUIUpperNotebook {
|
pub struct GuiUpperNotebook {
|
||||||
pub notebook_upper: gtk::Notebook,
|
pub notebook_upper: gtk::Notebook,
|
||||||
|
|
||||||
pub scrolled_window_included_directories: gtk::ScrolledWindow,
|
pub scrolled_window_included_directories: gtk::ScrolledWindow,
|
||||||
|
@ -24,7 +24,7 @@ pub struct GUIUpperNotebook {
|
||||||
pub buttons_remove_excluded_directory: gtk::Button,
|
pub buttons_remove_excluded_directory: gtk::Button,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GUIUpperNotebook {
|
impl GuiUpperNotebook {
|
||||||
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
pub fn create_from_builder(builder: >k::Builder) -> Self {
|
||||||
let notebook_upper: gtk::Notebook = builder.get_object("notebook_upper").unwrap();
|
let notebook_upper: gtk::Notebook = builder.get_object("notebook_upper").unwrap();
|
||||||
|
|
||||||
|
|
|
@ -37,8 +37,7 @@ pub fn save_configuration(gui_data: &GuiData, manual_execution: bool) {
|
||||||
add_text_to_text_view(&text_view_errors, format!("Failed configuration to create configuration folder {}", config_dir.display()).as_str());
|
add_text_to_text_view(&text_view_errors, format!("Failed configuration to create configuration folder {}", config_dir.display()).as_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
let mut data_to_save: Vec<String> = Vec::with_capacity(16);
|
||||||
let mut data_to_save: Vec<String> = Vec::new();
|
|
||||||
|
|
||||||
//// Included Directories
|
//// Included Directories
|
||||||
data_to_save.push("--included_directories:".to_string());
|
data_to_save.push("--included_directories:".to_string());
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#![allow(clippy::upper_case_acronyms)]
|
||||||
#![cfg(not(target_os = "windows"))]
|
#![cfg(not(target_os = "windows"))]
|
||||||
use std::convert::From;
|
use std::convert::From;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue