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

Random Changes (#576)

* Random Changes

* Urra

* ABC
This commit is contained in:
Rafał Mikrut 2022-01-14 06:34:43 +01:00 committed by GitHub
parent 489ec3cfda
commit ed4b721665
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 251 additions and 159 deletions

103
Cargo.lock generated
View file

@ -408,9 +408,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
[[package]] [[package]]
name = "combine" name = "combine"
version = "4.6.2" version = "4.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2b2f5d0ee456f3928812dfc8c6d9a1d592b98678f6d56db9b0cd2b7bc6c8db5" checksum = "50b727aacc797f9fc28e355d21f34709ac4fc9adecfe470ad07b8f4464f53062"
dependencies = [ dependencies = [
"bytes", "bytes",
"memchr", "memchr",
@ -628,8 +628,18 @@ version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858"
dependencies = [ dependencies = [
"darling_core", "darling_core 0.10.2",
"darling_macro", "darling_macro 0.10.2",
]
[[package]]
name = "darling"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4"
dependencies = [
"darling_core 0.13.1",
"darling_macro 0.13.1",
] ]
[[package]] [[package]]
@ -646,13 +656,38 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "darling_core"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
"strsim 0.10.0",
"syn",
]
[[package]] [[package]]
name = "darling_macro" name = "darling_macro"
version = "0.10.2" version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72"
dependencies = [ dependencies = [
"darling_core", "darling_core 0.10.2",
"quote",
"syn",
]
[[package]]
name = "darling_macro"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b"
dependencies = [
"darling_core 0.13.1",
"quote", "quote",
"syn", "syn",
] ]
@ -1647,20 +1682,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8794322172319b972f528bf90c6b467be0079f1fa82780ffb431088e741a73ab" checksum = "8794322172319b972f528bf90c6b467be0079f1fa82780ffb431088e741a73ab"
dependencies = [ dependencies = [
"jni-sys", "jni-sys",
"ndk-sys", "ndk-sys 0.2.2",
"num_enum", "num_enum",
"thiserror", "thiserror",
] ]
[[package]] [[package]]
name = "ndk" name = "ndk"
version = "0.4.0" version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d64d6af06fde0e527b1ba5c7b79a6cc89cfc46325b0b2887dffe8f70197e0c3c" checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"jni-sys", "jni-sys",
"ndk-sys", "ndk-sys 0.3.0",
"num_enum", "num_enum",
"thiserror", "thiserror",
] ]
@ -1675,22 +1710,22 @@ dependencies = [
"libc", "libc",
"log", "log",
"ndk 0.3.0", "ndk 0.3.0",
"ndk-macro", "ndk-macro 0.2.0",
"ndk-sys", "ndk-sys 0.2.2",
] ]
[[package]] [[package]]
name = "ndk-glue" name = "ndk-glue"
version = "0.4.0" version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3e9e94628f24e7a3cb5b96a2dc5683acd9230bf11991c2a1677b87695138420" checksum = "04c0d14b0858eb9962a5dac30b809b19f19da7e4547d64af2b0bb051d2e55d79"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"libc", "libc",
"log", "log",
"ndk 0.4.0", "ndk 0.6.0",
"ndk-macro", "ndk-macro 0.3.0",
"ndk-sys", "ndk-sys 0.3.0",
] ]
[[package]] [[package]]
@ -1699,19 +1734,41 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d" checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d"
dependencies = [ dependencies = [
"darling", "darling 0.10.2",
"proc-macro-crate 0.1.5", "proc-macro-crate 0.1.5",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn",
] ]
[[package]]
name = "ndk-macro"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c"
dependencies = [
"darling 0.13.1",
"proc-macro-crate 1.1.0",
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "ndk-sys" name = "ndk-sys"
version = "0.2.2" version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121"
[[package]]
name = "ndk-sys"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97"
dependencies = [
"jni-sys",
]
[[package]] [[package]]
name = "nix" name = "nix"
version = "0.20.0" version = "0.20.0"
@ -1867,13 +1924,13 @@ dependencies = [
[[package]] [[package]]
name = "oboe" name = "oboe"
version = "0.4.4" version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e15e22bc67e047fe342a32ecba55f555e3be6166b04dd157cd0f803dfa9f48e1" checksum = "2463c8f2e19b4e0d0710a21f8e4011501ff28db1c95d7a5482a553b2100502d2"
dependencies = [ dependencies = [
"jni", "jni",
"ndk 0.4.0", "ndk 0.6.0",
"ndk-glue 0.4.0", "ndk-glue 0.6.0",
"num-derive", "num-derive",
"num-traits", "num-traits",
"oboe-sys", "oboe-sys",
@ -1881,9 +1938,9 @@ dependencies = [
[[package]] [[package]]
name = "oboe-sys" name = "oboe-sys"
version = "0.4.4" version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "338142ae5ab0aaedc8275aa8f67f460e43ae0fca76a695a742d56da0a269eadc" checksum = "3370abb7372ed744232c12954d920d1a40f1c4686de9e79e800021ef492294bd"
dependencies = [ dependencies = [
"cc", "cc",
] ]

View file

@ -14,7 +14,7 @@ use crossbeam_channel::Receiver;
use humansize::{file_size_opts as options, FileSize}; use humansize::{file_size_opts as options, FileSize};
use rayon::prelude::*; use rayon::prelude::*;
use crate::common::Common; use crate::common::{Common, LOOP_DURATION};
use crate::common_directory::Directories; use crate::common_directory::Directories;
use crate::common_extensions::Extensions; use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems; use crate::common_items::ExcludedItems;
@ -131,7 +131,6 @@ impl BigFile {
} }
//// PROGRESS THREAD START //// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true)); let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicU64::new(0)); let atomic_file_counter = Arc::new(AtomicU64::new(0));
@ -326,17 +325,14 @@ impl BigFile {
self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages); self.excluded_items.set_excluded_items(excluded_items, &mut self.text_messages);
} }
/// Remove unused entries when included or excluded overlaps with each other or are duplicated etc.
fn optimize_directories(&mut self) { fn optimize_directories(&mut self) {
self.directories.optimize_directories(self.recursive_search, &mut self.text_messages); self.directories.optimize_directories(self.recursive_search, &mut self.text_messages);
} }
/// Setting included directories, at least one must be provided
pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) { pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>) {
self.directories.set_included_directory(included_directory, &mut self.text_messages); self.directories.set_included_directory(included_directory, &mut self.text_messages);
} }
/// Setting absolute path to exclude
pub fn set_excluded_directory(&mut self, excluded_directory: Vec<PathBuf>) { pub fn set_excluded_directory(&mut self, excluded_directory: Vec<PathBuf>) {
self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages); self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages);
} }

View file

@ -13,7 +13,7 @@ use crossbeam_channel::Receiver;
use rayon::prelude::*; use rayon::prelude::*;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::common::{open_cache_folder, Common}; use crate::common::{open_cache_folder, Common, LOOP_DURATION};
use crate::common_directory::Directories; use crate::common_directory::Directories;
use crate::common_extensions::Extensions; use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems; use crate::common_items::ExcludedItems;
@ -67,7 +67,6 @@ impl Info {
} }
} }
/// Struct with required information's to work
pub struct BrokenFiles { pub struct BrokenFiles {
text_messages: Messages, text_messages: Messages,
information: Info, information: Info,
@ -174,7 +173,6 @@ impl BrokenFiles {
} }
//// PROGRESS THREAD START //// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true)); let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0)); let atomic_file_counter = Arc::new(AtomicUsize::new(0));
@ -382,7 +380,6 @@ impl BrokenFiles {
let check_was_breaked = AtomicBool::new(false); // Used for breaking from GUI and ending check thread let check_was_breaked = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
//// PROGRESS THREAD START //// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true)); let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0)); let atomic_file_counter = Arc::new(AtomicUsize::new(0));

View file

@ -10,6 +10,8 @@ use std::time::SystemTime;
/// Class for common functions used across other class/functions /// Class for common functions used across other class/functions
pub const LOOP_DURATION: u32 = 200; //ms
pub struct Common(); pub struct Common();
pub fn open_cache_folder(cache_file_name: &str, save_to_cache: bool, use_json: bool, warnings: &mut Vec<String>) -> Option<((Option<File>, PathBuf), (Option<File>, PathBuf))> { pub fn open_cache_folder(cache_file_name: &str, save_to_cache: bool, use_json: bool, warnings: &mut Vec<String>) -> Option<((Option<File>, PathBuf), (Option<File>, PathBuf))> {
@ -72,7 +74,6 @@ pub fn get_dynamic_image_from_raw_image(path: impl AsRef<Path> + std::fmt::Debug
let file_handler = match OpenOptions::new().read(true).open(&path) { let file_handler = match OpenOptions::new().read(true).open(&path) {
Ok(t) => t, Ok(t) => t,
Err(_e) => { Err(_e) => {
// println!("Failed to open image {:?}, reason {}", path, e);
return None; return None;
} }
}; };
@ -81,7 +82,6 @@ pub fn get_dynamic_image_from_raw_image(path: impl AsRef<Path> + std::fmt::Debug
let raw = match rawloader::decode(&mut reader) { let raw = match rawloader::decode(&mut reader) {
Ok(raw) => raw, Ok(raw) => raw,
Err(_e) => { Err(_e) => {
// println!("Failed to decode raw image {:?}, reason {}", path, e);
return None; return None;
} }
}; };
@ -93,7 +93,6 @@ pub fn get_dynamic_image_from_raw_image(path: impl AsRef<Path> + std::fmt::Debug
let mut pipeline = match Pipeline::new_from_source(source, width, height, true) { let mut pipeline = match Pipeline::new_from_source(source, width, height, true) {
Ok(pipeline) => pipeline, Ok(pipeline) => pipeline,
Err(_e) => { Err(_e) => {
// println!("Failed to create pipeline {:?}, reason {}", path, e);
return None; return None;
} }
}; };
@ -102,7 +101,6 @@ pub fn get_dynamic_image_from_raw_image(path: impl AsRef<Path> + std::fmt::Debug
let image = match pipeline.output_8bit(None) { let image = match pipeline.output_8bit(None) {
Ok(image) => image, Ok(image) => image,
Err(_e) => { Err(_e) => {
// println!("Failed to process image {:?}, reason {}", path, e);
return None; return None;
} }
}; };
@ -110,7 +108,6 @@ pub fn get_dynamic_image_from_raw_image(path: impl AsRef<Path> + std::fmt::Debug
let image = match ImageBuffer::<Rgb<u8>, Vec<u8>>::from_raw(image.width as u32, image.height as u32, image.data) { let image = match ImageBuffer::<Rgb<u8>, Vec<u8>>::from_raw(image.width as u32, image.height as u32, image.data) {
Some(image) => image, Some(image) => image,
None => { None => {
// println!("Failed to get image {:?}", path);
return None; return None;
} }
}; };

View file

@ -7,6 +7,7 @@ use std::thread::sleep;
use std::time::{Duration, SystemTime, UNIX_EPOCH}; use std::time::{Duration, SystemTime, UNIX_EPOCH};
use std::{fs, thread}; use std::{fs, thread};
use crate::common::LOOP_DURATION;
use crossbeam_channel::Receiver; use crossbeam_channel::Receiver;
use rayon::prelude::*; use rayon::prelude::*;
@ -308,7 +309,6 @@ where
folders_to_check.extend(self.root_dirs); folders_to_check.extend(self.root_dirs);
//// PROGRESS THREAD START //// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true)); let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_entry_counter = Arc::new(AtomicUsize::new(0)); let atomic_entry_counter = Arc::new(AtomicUsize::new(0));

View file

@ -3,6 +3,8 @@ use std::time::SystemTime;
use crate::common::Common; use crate::common::Common;
use crate::common_messages::Messages; use crate::common_messages::Messages;
use crate::fl;
use crate::localizer::generate_translation_hashmap;
#[derive(Clone, Default)] #[derive(Clone, Default)]
pub struct Directories { pub struct Directories {
@ -20,12 +22,12 @@ impl Directories {
self.reference_directories = reference_directory self.reference_directories = reference_directory
} }
/// Setting included directories, at least one must be provided /// Setting included directories, at least one must be provided or scan won't start
pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>, text_messages: &mut Messages) -> bool { pub fn set_included_directory(&mut self, included_directory: Vec<PathBuf>, text_messages: &mut Messages) -> bool {
let start_time: SystemTime = SystemTime::now(); let start_time: SystemTime = SystemTime::now();
if included_directory.is_empty() { if included_directory.is_empty() {
text_messages.errors.push("At least one directory must be provided".to_string()); text_messages.errors.push(fl!("core_missing_no_chosen_included_directory"));
return false; return false;
} }
@ -34,37 +36,41 @@ impl Directories {
let mut checked_directories: Vec<PathBuf> = Vec::new(); let mut checked_directories: Vec<PathBuf> = Vec::new();
for directory in directories { for directory in directories {
if directory.to_string_lossy().contains('*') { if directory.to_string_lossy().contains('*') {
text_messages text_messages.warnings.push(fl!(
.warnings "core_directory_wildcard_no_supported",
.push(format!("Included Directory Warning: Wildcards in path are not supported, ignoring {}", directory.display())); generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue; continue;
} }
#[cfg(not(target_family = "windows"))] #[cfg(not(target_family = "windows"))]
if directory.is_relative() { if directory.is_relative() {
text_messages text_messages.warnings.push(fl!(
.warnings "core_directory_relative_path",
.push(format!("Included Directory Warning: Relative path are not supported, ignoring {}", directory.display())); generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue; continue;
} }
#[cfg(target_family = "windows")] #[cfg(target_family = "windows")]
if directory.is_relative() && !directory.starts_with("\\") { if directory.is_relative() && !directory.starts_with("\\") {
text_messages text_messages.warnings.push(fl!(
.warnings "core_directory_relative_path",
.push(format!("Included Directory Warning: Relative path are not supported, ignoring {}", directory.display())); generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue; continue;
} }
if !directory.exists() { if !directory.exists() {
text_messages text_messages.warnings.push(fl!(
.warnings "core_directory_must_exists",
.push(format!("Included Directory Warning: Provided folder path must exits, ignoring {}", directory.display())); generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue; continue;
} }
if !directory.is_dir() { if !directory.is_dir() {
text_messages.warnings.push(format!( text_messages.warnings.push(fl!(
"Included Directory Warning: Provided path must point at the directory, ignoring {}", "core_directory_must_be_directory",
directory.display() generate_translation_hashmap(vec![("path", directory.display().to_string())])
)); ));
continue; continue;
} }
@ -72,9 +78,7 @@ impl Directories {
} }
if checked_directories.is_empty() { if checked_directories.is_empty() {
text_messages text_messages.warnings.push(fl!("core_included_directory_zero_valid_directories"));
.errors
.push("Included Directory ERROR: Not found even one correct path to included which is required.".to_string());
return false; return false;
} }
@ -84,7 +88,7 @@ impl Directories {
true true
} }
/// Setting absolute path to exclude /// Setting absolute path to exclude from search
pub fn set_excluded_directory(&mut self, excluded_directory: Vec<PathBuf>, text_messages: &mut Messages) { pub fn set_excluded_directory(&mut self, excluded_directory: Vec<PathBuf>, text_messages: &mut Messages) {
let start_time: SystemTime = SystemTime::now(); let start_time: SystemTime = SystemTime::now();
if excluded_directory.is_empty() { if excluded_directory.is_empty() {
@ -97,40 +101,41 @@ impl Directories {
for directory in directories { for directory in directories {
let directory_as_string = directory.to_string_lossy(); let directory_as_string = directory.to_string_lossy();
if directory_as_string == "/" { if directory_as_string == "/" {
text_messages text_messages.errors.push(fl!("core_excluded_directory_pointless_slash"));
.errors
.push("Excluded Directory ERROR: Excluding / is pointless, because it means that no files will be scanned.".to_string());
break; break;
} }
if directory_as_string.contains('*') { if directory_as_string.contains('*') {
text_messages text_messages.warnings.push(fl!(
.warnings "core_directory_wildcard_no_supported",
.push(format!("Excluded Directory Warning: Wildcards in path are not supported, ignoring {}", directory.display())); generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue; continue;
} }
#[cfg(not(target_family = "windows"))] #[cfg(not(target_family = "windows"))]
if directory.is_relative() { if directory.is_relative() {
text_messages text_messages.warnings.push(fl!(
.warnings "core_directory_relative_path",
.push(format!("Excluded Directory Warning: Relative path are not supported, ignoring {}", directory.display())); generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue; continue;
} }
#[cfg(target_family = "windows")] #[cfg(target_family = "windows")]
if directory.is_relative() && !directory.starts_with("\\") { if directory.is_relative() && !directory.starts_with("\\") {
text_messages text_messages.warnings.push(fl!(
.warnings "core_directory_relative_path",
.push(format!("Excluded Directory Warning: Relative path are not supported, ignoring {}", directory.display())); generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue; continue;
} }
if !directory.exists() { if !directory.exists() {
// text_messages.warnings.push(format!("Excluded Directory Warning: Provided folder path must exits, ignoring {}", directory.display())); // No error when excluded directories are missing
continue; continue;
} }
if !directory.is_dir() { if !directory.is_dir() {
text_messages.warnings.push(format!( text_messages.warnings.push(fl!(
"Excluded Directory Warning: Provided path must point at the directory, ignoring {}", "core_directory_must_be_directory",
directory.display() generate_translation_hashmap(vec![("path", directory.display().to_string())])
)); ));
continue; continue;
} }
@ -265,18 +270,13 @@ impl Directories {
for folder in &self.reference_directories { for folder in &self.reference_directories {
if self.included_directories.iter().any(|e| folder.starts_with(&e)) { if self.included_directories.iter().any(|e| folder.starts_with(&e)) {
ref_folders.push(folder.clone()); ref_folders.push(folder.clone());
// println!("REF: VALID reference folder {:?}", folder);
} else {
// println!("REF: Invalid reference folder {:?}", folder);
} }
} }
self.reference_directories = ref_folders; self.reference_directories = ref_folders;
} }
if self.included_directories.is_empty() { if self.included_directories.is_empty() {
text_messages text_messages.errors.push(fl!("core_directory_overlap"));
.errors
.push("Optimize Directories ERROR: Excluded directories overlaps all included directories.".to_string());
return false; return false;
} }

View file

@ -28,12 +28,13 @@ impl ExcludedItems {
for expression in expressions { for expression in expressions {
let expression: String = expression.trim().to_string(); let expression: String = expression.trim().to_string();
#[cfg(target_family = "windows")]
let expression = expression.replace("/", "\\");
if expression.is_empty() { if expression.is_empty() {
continue; continue;
} }
#[cfg(target_family = "windows")]
let expression = expression.replace("/", "\\");
if expression == "DEFAULT" { if expression == "DEFAULT" {
if cfg!(target_family = "unix") { if cfg!(target_family = "unix") {
checked_expressions.push("*/.git/*,*/node_modules/*,*/lost+found/*,*/Trash/*,*/.Trash-*/*,*/snap/*,/home/*/.cache/*".to_string()); checked_expressions.push("*/.git/*,*/node_modules/*,*/lost+found/*,*/Trash/*,*/.Trash-*/*,*/snap/*,/home/*/.cache/*".to_string());

View file

@ -19,7 +19,7 @@ use crossbeam_channel::Receiver;
use humansize::{file_size_opts as options, FileSize}; use humansize::{file_size_opts as options, FileSize};
use rayon::prelude::*; use rayon::prelude::*;
use crate::common::{open_cache_folder, Common}; use crate::common::{open_cache_folder, Common, LOOP_DURATION};
use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData}; use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData};
use crate::common_directory::Directories; use crate::common_directory::Directories;
use crate::common_extensions::Extensions; use crate::common_extensions::Extensions;
@ -54,7 +54,6 @@ pub enum DeleteMethod {
HardLink, HardLink,
} }
/// Info struck with helpful information's about results
#[derive(Default)] #[derive(Default)]
pub struct Info { pub struct Info {
pub number_of_groups_by_size: usize, pub number_of_groups_by_size: usize,
@ -73,7 +72,6 @@ impl Info {
} }
} }
/// Struct with required information's to work
pub struct DuplicateFinder { pub struct DuplicateFinder {
text_messages: Messages, text_messages: Messages,
information: Info, information: Info,
@ -489,7 +487,6 @@ impl DuplicateFinder {
let mut pre_checked_map: BTreeMap<u64, Vec<FileEntry>> = Default::default(); let mut pre_checked_map: BTreeMap<u64, Vec<FileEntry>> = Default::default();
//// PROGRESS THREAD START //// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true)); let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0)); let atomic_file_counter = Arc::new(AtomicUsize::new(0));
@ -655,7 +652,6 @@ impl DuplicateFinder {
///////////////////////// /////////////////////////
//// PROGRESS THREAD START //// PROGRESS THREAD START
// const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true)); let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0)); let atomic_file_counter = Arc::new(AtomicUsize::new(0));

View file

@ -14,7 +14,7 @@ use crossbeam_channel::Receiver;
use rayon::prelude::*; use rayon::prelude::*;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::common::{open_cache_folder, Common}; use crate::common::{open_cache_folder, Common, LOOP_DURATION};
use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData}; use crate::common_dir_traversal::{CheckingMethod, DirTraversalBuilder, DirTraversalResult, FileEntry, ProgressData};
use crate::common_directory::Directories; use crate::common_directory::Directories;
use crate::common_extensions::Extensions; use crate::common_extensions::Extensions;
@ -322,7 +322,6 @@ impl SameMusic {
let check_was_breaked = AtomicBool::new(false); // Used for breaking from GUI and ending check thread let check_was_breaked = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
//// PROGRESS THREAD START //// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true)); let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0)); let atomic_file_counter = Arc::new(AtomicUsize::new(0));
@ -429,7 +428,6 @@ impl SameMusic {
let start_time: SystemTime = SystemTime::now(); let start_time: SystemTime = SystemTime::now();
//// PROGRESS THREAD START //// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true)); let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0)); let atomic_file_counter = Arc::new(AtomicUsize::new(0));

View file

@ -18,7 +18,7 @@ use img_hash::{FilterType, HashAlg, HasherConfig};
use rayon::prelude::*; use rayon::prelude::*;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::common::{get_dynamic_image_from_raw_image, open_cache_folder, Common}; use crate::common::{get_dynamic_image_from_raw_image, open_cache_folder, Common, LOOP_DURATION};
use crate::common_directory::Directories; use crate::common_directory::Directories;
use crate::common_extensions::Extensions; use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems; use crate::common_items::ExcludedItems;
@ -61,7 +61,6 @@ pub struct ProgressData {
pub images_checked: usize, pub images_checked: usize,
pub images_to_check: usize, pub images_to_check: usize,
} }
const LOOP_DURATION: u32 = 200; //ms
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Serialize, Deserialize)] #[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Serialize, Deserialize)]
pub enum Similarity { pub enum Similarity {

View file

@ -17,7 +17,7 @@ use serde::{Deserialize, Serialize};
use vid_dup_finder_lib::HashCreationErrorKind::DetermineVideo; use vid_dup_finder_lib::HashCreationErrorKind::DetermineVideo;
use vid_dup_finder_lib::{NormalizedTolerance, VideoHash}; use vid_dup_finder_lib::{NormalizedTolerance, VideoHash};
use crate::common::{open_cache_folder, Common}; use crate::common::{open_cache_folder, Common, LOOP_DURATION};
use crate::common_directory::Directories; use crate::common_directory::Directories;
use crate::common_extensions::Extensions; use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems; use crate::common_items::ExcludedItems;
@ -236,7 +236,6 @@ impl SimilarVideos {
} }
//// PROGRESS THREAD START //// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true)); let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0)); let atomic_file_counter = Arc::new(AtomicUsize::new(0));
@ -447,7 +446,6 @@ impl SimilarVideos {
let hash_map_modification = SystemTime::now(); let hash_map_modification = SystemTime::now();
//// PROGRESS THREAD START //// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true)); let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0)); let atomic_file_counter = Arc::new(AtomicUsize::new(0));

View file

@ -11,7 +11,7 @@ use std::{fs, thread};
use crossbeam_channel::Receiver; use crossbeam_channel::Receiver;
use rayon::prelude::*; use rayon::prelude::*;
use crate::common::Common; use crate::common::{Common, LOOP_DURATION};
use crate::common_directory::Directories; use crate::common_directory::Directories;
use crate::common_items::ExcludedItems; use crate::common_items::ExcludedItems;
use crate::common_messages::Messages; use crate::common_messages::Messages;
@ -131,7 +131,6 @@ impl Temporary {
} }
//// PROGRESS THREAD START //// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true)); let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0)); let atomic_file_counter = Arc::new(AtomicUsize::new(0));

View file

@ -48,7 +48,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
let shared_similar_videos_state = gui_data.shared_similar_videos_state.clone(); let shared_similar_videos_state = gui_data.shared_similar_videos_state.clone();
let tree_view_same_music_finder = gui_data.main_notebook.tree_view_same_music_finder.clone(); let tree_view_same_music_finder = gui_data.main_notebook.tree_view_same_music_finder.clone();
let shared_same_music_state = gui_data.shared_same_music_state.clone(); let shared_same_music_state = gui_data.shared_same_music_state.clone();
let buttons_names = gui_data.bottom_buttons.buttons_names.clone(); let buttons_names = gui_data.bottom_buttons.buttons_names;
let window_progress = gui_data.progress_window.window_progress.clone(); let window_progress = gui_data.progress_window.window_progress.clone();
let taskbar_state = gui_data.taskbar_state.clone(); let taskbar_state = gui_data.taskbar_state.clone();
let notebook_upper = gui_data.upper_notebook.notebook_upper.clone(); let notebook_upper = gui_data.upper_notebook.notebook_upper.clone();
@ -500,7 +500,14 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active( set_specific_buttons_as_active(
&shared_buttons, &shared_buttons,
&NotebookMainEnum::Duplicate, &NotebookMainEnum::Duplicate,
&["save", "delete", "select", "symlink", "hardlink", "move"], &[
BottomButtonsEnum::Save,
BottomButtonsEnum::Delete,
BottomButtonsEnum::Select,
BottomButtonsEnum::Symlink,
BottomButtonsEnum::Hardlink,
BottomButtonsEnum::Move,
],
duplicates_number > 0, duplicates_number > 0,
); );
@ -565,7 +572,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active( set_specific_buttons_as_active(
&shared_buttons, &shared_buttons,
&NotebookMainEnum::EmptyDirectories, &NotebookMainEnum::EmptyDirectories,
&["save", "delete", "select", "move"], &[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move],
empty_folder_number > 0, empty_folder_number > 0,
); );
@ -631,7 +638,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active( set_specific_buttons_as_active(
&shared_buttons, &shared_buttons,
&NotebookMainEnum::EmptyFiles, &NotebookMainEnum::EmptyFiles,
&["save", "delete", "select", "move"], &[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move],
empty_files_number > 0, empty_files_number > 0,
); );
@ -699,7 +706,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active( set_specific_buttons_as_active(
&shared_buttons, &shared_buttons,
&NotebookMainEnum::BigFiles, &NotebookMainEnum::BigFiles,
&["save", "delete", "select", "move"], &[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move],
biggest_files_number > 0, biggest_files_number > 0,
); );
@ -764,7 +771,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active( set_specific_buttons_as_active(
&shared_buttons, &shared_buttons,
&NotebookMainEnum::Temporary, &NotebookMainEnum::Temporary,
&["save", "delete", "select", "move"], &[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move],
temporary_files_number > 0, temporary_files_number > 0,
); );
@ -940,7 +947,15 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active( set_specific_buttons_as_active(
&shared_buttons, &shared_buttons,
&NotebookMainEnum::SimilarImages, &NotebookMainEnum::SimilarImages,
&["save", "delete", "select", "symlink", "hardlink", "move", "compare"], &[
BottomButtonsEnum::Save,
BottomButtonsEnum::Delete,
BottomButtonsEnum::Select,
BottomButtonsEnum::Symlink,
BottomButtonsEnum::Hardlink,
BottomButtonsEnum::Move,
BottomButtonsEnum::Compare,
],
found_any_duplicates, found_any_duplicates,
); );
@ -1102,7 +1117,14 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active( set_specific_buttons_as_active(
&shared_buttons, &shared_buttons,
&NotebookMainEnum::SimilarVideos, &NotebookMainEnum::SimilarVideos,
&["save", "delete", "select", "symlink", "hardlink", "move"], &[
BottomButtonsEnum::Save,
BottomButtonsEnum::Delete,
BottomButtonsEnum::Select,
BottomButtonsEnum::Symlink,
BottomButtonsEnum::Hardlink,
BottomButtonsEnum::Move,
],
found_any_duplicates, found_any_duplicates,
); );
@ -1317,7 +1339,14 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active( set_specific_buttons_as_active(
&shared_buttons, &shared_buttons,
&NotebookMainEnum::SameMusic, &NotebookMainEnum::SameMusic,
&["save", "delete", "select", "symlink", "hardlink", "move"], &[
BottomButtonsEnum::Save,
BottomButtonsEnum::Delete,
BottomButtonsEnum::Select,
BottomButtonsEnum::Symlink,
BottomButtonsEnum::Hardlink,
BottomButtonsEnum::Move,
],
same_music_number > 0, same_music_number > 0,
); );
@ -1387,7 +1416,12 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
{ {
*shared_same_invalid_symlinks.borrow_mut() = ifs; *shared_same_invalid_symlinks.borrow_mut() = ifs;
set_specific_buttons_as_active(&shared_buttons, &NotebookMainEnum::Symlinks, &["save", "delete", "select", "move"], invalid_symlinks > 0); set_specific_buttons_as_active(
&shared_buttons,
&NotebookMainEnum::Symlinks,
&[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move],
invalid_symlinks > 0,
);
set_buttons( set_buttons(
&mut *shared_buttons.borrow_mut().get_mut(&NotebookMainEnum::Symlinks).unwrap(), &mut *shared_buttons.borrow_mut().get_mut(&NotebookMainEnum::Symlinks).unwrap(),
@ -1452,7 +1486,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active( set_specific_buttons_as_active(
&shared_buttons, &shared_buttons,
&NotebookMainEnum::BrokenFiles, &NotebookMainEnum::BrokenFiles,
&["save", "delete", "select", "move"], &[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move],
broken_files_number > 0, broken_files_number > 0,
); );
@ -1471,12 +1505,12 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
} }
fn set_specific_buttons_as_active( fn set_specific_buttons_as_active(
buttons_array: &Rc<RefCell<HashMap<NotebookMainEnum, HashMap<String, bool>>>>, buttons_array: &Rc<RefCell<HashMap<NotebookMainEnum, HashMap<BottomButtonsEnum, bool>>>>,
notebook_enum: &NotebookMainEnum, notebook_enum: &NotebookMainEnum,
buttons: &[&str], buttons: &[BottomButtonsEnum],
value_to_set: bool, value_to_set: bool,
) { ) {
for i in buttons { for i in buttons {
*buttons_array.borrow_mut().get_mut(notebook_enum).unwrap().get_mut(*i).unwrap() = value_to_set; *buttons_array.borrow_mut().get_mut(notebook_enum).unwrap().get_mut(i).unwrap() = value_to_set;
} }
} }

View file

@ -9,6 +9,7 @@ use czkawka_core::common_traits::SaveResults;
use czkawka_core::fl; use czkawka_core::fl;
use crate::gui_structs::gui_data::GuiData; use crate::gui_structs::gui_data::GuiData;
use crate::help_functions::BottomButtonsEnum;
use crate::localizer::generate_translation_hashmap; use crate::localizer::generate_translation_hashmap;
use crate::notebook_enums::*; use crate::notebook_enums::*;
@ -96,7 +97,7 @@ pub fn connect_button_save(gui_data: &GuiData) {
fn post_save_things( fn post_save_things(
file_name: &str, file_name: &str,
type_of_tab: &NotebookMainEnum, type_of_tab: &NotebookMainEnum,
shared_buttons: &Rc<RefCell<HashMap<NotebookMainEnum, HashMap<String, bool>>>>, shared_buttons: &Rc<RefCell<HashMap<NotebookMainEnum, HashMap<BottomButtonsEnum, bool>>>>,
entry_info: &Entry, entry_info: &Entry,
buttons_save: &Button, buttons_save: &Button,
) { ) {
@ -104,6 +105,6 @@ fn post_save_things(
// Set state // Set state
{ {
buttons_save.hide(); buttons_save.hide();
*shared_buttons.borrow_mut().get_mut(type_of_tab).unwrap().get_mut("save").unwrap() = false; *shared_buttons.borrow_mut().get_mut(type_of_tab).unwrap().get_mut(&BottomButtonsEnum::Save).unwrap() = false;
} }
} }

View file

@ -50,7 +50,7 @@ pub fn connect_button_search(
let buttons_array = gui_data.bottom_buttons.buttons_array.clone(); let buttons_array = gui_data.bottom_buttons.buttons_array.clone();
let check_button_image_ignore_same_size = gui_data.main_notebook.check_button_image_ignore_same_size.clone(); let check_button_image_ignore_same_size = gui_data.main_notebook.check_button_image_ignore_same_size.clone();
let check_button_video_ignore_same_size = gui_data.main_notebook.check_button_video_ignore_same_size.clone(); let check_button_video_ignore_same_size = gui_data.main_notebook.check_button_video_ignore_same_size.clone();
let buttons_names = gui_data.bottom_buttons.buttons_names.clone(); let buttons_names = gui_data.bottom_buttons.buttons_names;
let buttons_search_clone = gui_data.bottom_buttons.buttons_search.clone(); let buttons_search_clone = gui_data.bottom_buttons.buttons_search.clone();
let check_button_duplicates_use_prehash_cache = gui_data.settings.check_button_duplicates_use_prehash_cache.clone(); let check_button_duplicates_use_prehash_cache = gui_data.settings.check_button_duplicates_use_prehash_cache.clone();
let check_button_music_album_artist: gtk::CheckButton = gui_data.main_notebook.check_button_music_album_artist.clone(); let check_button_music_album_artist: gtk::CheckButton = gui_data.main_notebook.check_button_music_album_artist.clone();

View file

@ -8,7 +8,7 @@ pub fn connect_notebook_tabs(gui_data: &GuiData) {
let shared_buttons = gui_data.shared_buttons.clone(); let shared_buttons = gui_data.shared_buttons.clone();
let buttons_array = gui_data.bottom_buttons.buttons_array.clone(); let buttons_array = gui_data.bottom_buttons.buttons_array.clone();
let notebook_main_clone = gui_data.main_notebook.notebook_main.clone(); let notebook_main_clone = gui_data.main_notebook.notebook_main.clone();
let buttons_names = gui_data.bottom_buttons.buttons_names.clone(); let buttons_names = gui_data.bottom_buttons.buttons_names;
notebook_main_clone.connect_switch_page(move |_, _, number| { notebook_main_clone.connect_switch_page(move |_, _, number| {
let current_tab_in_main_notebook = to_notebook_main_enum(number); let current_tab_in_main_notebook = to_notebook_main_enum(number);

View file

@ -390,7 +390,13 @@ fn popover_custom_select_unselect(
let model = get_list_store(&tree_view); let model = get_list_store(&tree_view);
let iter = model.iter_first().unwrap(); // Never should be available button where there is no available records let iter = match model.iter_first() {
Some(t) => t,
None => {
confirmation_dialog_select_unselect.close();
return;
}
};
let mut number_of_all_things = 0; let mut number_of_all_things = 0;
let mut number_of_already_selected_things = 0; let mut number_of_already_selected_things = 0;

View file

@ -15,28 +15,17 @@ pub fn connect_similar_image_size_change(gui_data: &GuiData) {
combo_box_image_hash_size.connect_changed(move |combo_box_image_hash_size| { combo_box_image_hash_size.connect_changed(move |combo_box_image_hash_size| {
let hash_size_index = combo_box_image_hash_size.active().unwrap() as usize; let hash_size_index = combo_box_image_hash_size.active().unwrap() as usize;
let hash_size = IMAGES_HASH_SIZE_COMBO_BOX[hash_size_index]; let hash_size = IMAGES_HASH_SIZE_COMBO_BOX[hash_size_index];
match hash_size {
8 => { let index = match hash_size {
scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[0][5] as f64); 8 => 0,
scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[0][5] as f64); 16 => 1,
label_similar_images_minimal_similarity.set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[0][5]), 8)); 32 => 2,
} 64 => 3,
16 => {
scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[1][5] as f64);
scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[1][5] as f64);
label_similar_images_minimal_similarity.set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[1][5]), 16));
}
32 => {
scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[2][5] as f64);
scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[2][5] as f64);
label_similar_images_minimal_similarity.set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[2][5]), 32));
}
64 => {
scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[3][5] as f64);
scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[3][5] as f64);
label_similar_images_minimal_similarity.set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[3][5]), 64));
}
_ => panic!(), _ => panic!(),
} };
scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[index][5] as f64);
scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[index][5] as f64);
label_similar_images_minimal_similarity.set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[index][5]), hash_size as u8));
}); });
} }

View file

@ -1,7 +1,7 @@
use gtk::prelude::*; use gtk::prelude::*;
use gtk::{Bin, Widget}; use gtk::{Bin, Widget};
use crate::help_functions::get_custom_label_from_button_with_image; use crate::help_functions::{get_custom_label_from_button_with_image, BottomButtonsEnum};
use czkawka_core::fl; use czkawka_core::fl;
#[derive(Clone)] #[derive(Clone)]
@ -16,7 +16,7 @@ pub struct GuiBottomButtons {
pub buttons_compare: gtk::Button, pub buttons_compare: gtk::Button,
pub buttons_show_errors: gtk::Button, pub buttons_show_errors: gtk::Button,
pub buttons_show_upper_notebook: gtk::Button, pub buttons_show_upper_notebook: gtk::Button,
pub buttons_names: [String; 8], pub buttons_names: [BottomButtonsEnum; 8],
pub buttons_array: [Widget; 8], pub buttons_array: [Widget; 8],
} }
@ -35,14 +35,14 @@ impl GuiBottomButtons {
let buttons_show_upper_notebook: gtk::Button = builder.object("buttons_show_upper_notebook").unwrap(); let buttons_show_upper_notebook: gtk::Button = builder.object("buttons_show_upper_notebook").unwrap();
let buttons_names = [ let buttons_names = [
"search".to_string(), BottomButtonsEnum::Search,
"select".to_string(), BottomButtonsEnum::Select,
"delete".to_string(), BottomButtonsEnum::Delete,
"save".to_string(), BottomButtonsEnum::Save,
"symlink".to_string(), BottomButtonsEnum::Symlink,
"hardlink".to_string(), BottomButtonsEnum::Hardlink,
"move".to_string(), BottomButtonsEnum::Move,
"compare".to_string(), BottomButtonsEnum::Compare,
]; ];
let buttons_array = [ let buttons_array = [
buttons_search.clone().upcast::<Widget>(), buttons_search.clone().upcast::<Widget>(),

View file

@ -28,6 +28,7 @@ use crate::gui_structs::gui_popovers::GuiPopovers;
use crate::gui_structs::gui_progress_dialog::GuiProgressDialog; use crate::gui_structs::gui_progress_dialog::GuiProgressDialog;
use crate::gui_structs::gui_settings::GuiSettings; use crate::gui_structs::gui_settings::GuiSettings;
use crate::gui_structs::gui_upper_notebook::GuiUpperNotebook; use crate::gui_structs::gui_upper_notebook::GuiUpperNotebook;
use crate::help_functions::BottomButtonsEnum;
use crate::notebook_enums::*; use crate::notebook_enums::*;
use crate::taskbar_progress::TaskbarProgress; use crate::taskbar_progress::TaskbarProgress;
@ -56,7 +57,7 @@ pub struct GuiData {
pub taskbar_state: Rc<RefCell<TaskbarProgress>>, pub taskbar_state: Rc<RefCell<TaskbarProgress>>,
// Buttons state // Buttons state
pub shared_buttons: Rc<RefCell<HashMap<NotebookMainEnum, HashMap<String, bool>>>>, pub shared_buttons: Rc<RefCell<HashMap<NotebookMainEnum, HashMap<BottomButtonsEnum, bool>>>>,
// State of search results // State of search results
pub shared_duplication_state: Rc<RefCell<DuplicateFinder>>, pub shared_duplication_state: Rc<RefCell<DuplicateFinder>>,
@ -116,16 +117,16 @@ impl GuiData {
let taskbar_state = Rc::new(RefCell::new(TaskbarProgress::new())); let taskbar_state = Rc::new(RefCell::new(TaskbarProgress::new()));
// Buttons State - to remember existence of different buttons on pages // Buttons State - to remember existence of different buttons on pages
let shared_buttons: Rc<RefCell<_>> = Rc::new(RefCell::new(HashMap::<NotebookMainEnum, HashMap<String, bool>>::new())); let shared_buttons: Rc<RefCell<_>> = Rc::new(RefCell::new(HashMap::<NotebookMainEnum, HashMap<BottomButtonsEnum, bool>>::new()));
// Show by default only search button // Show by default only search button
for i in get_all_main_tabs().iter() { for i in get_all_main_tabs().iter() {
let mut temp_hashmap: HashMap<String, bool> = Default::default(); let mut temp_hashmap: HashMap<BottomButtonsEnum, bool> = Default::default();
for button_name in bottom_buttons.buttons_names.iter() { for button_name in bottom_buttons.buttons_names.iter() {
if *button_name == "search" { if *button_name == BottomButtonsEnum::Search {
temp_hashmap.insert(button_name.to_string(), true); temp_hashmap.insert(*button_name, true);
} else { } else {
temp_hashmap.insert(button_name.to_string(), false); temp_hashmap.insert(*button_name, false);
} }
} }
shared_buttons.borrow_mut().insert(i.clone(), temp_hashmap); shared_buttons.borrow_mut().insert(i.clone(), temp_hashmap);

View file

@ -50,6 +50,18 @@ pub enum PopoverTypes {
None, None,
} }
#[derive(Eq, PartialEq, Copy, Clone, Hash)]
pub enum BottomButtonsEnum {
Search,
Select,
Delete,
Save,
Symlink,
Hardlink,
Move,
Compare,
}
pub struct NotebookObject { pub struct NotebookObject {
pub notebook_type: NotebookMainEnum, pub notebook_type: NotebookMainEnum,
pub available_modes: [PopoverTypes; 5], pub available_modes: [PopoverTypes; 5],
@ -437,9 +449,9 @@ pub fn add_text_to_text_view(text_view: &TextView, string_to_append: &str) {
} }
} }
pub fn set_buttons(hashmap: &mut HashMap<String, bool>, buttons_array: &[gtk::Widget], button_names: &[String]) { pub fn set_buttons(hashmap: &mut HashMap<BottomButtonsEnum, bool>, buttons_array: &[gtk::Widget], button_names: &[BottomButtonsEnum]) {
for (index, button) in buttons_array.iter().enumerate() { for (index, button) in buttons_array.iter().enumerate() {
if *hashmap.get_mut(button_names[index].as_str()).unwrap() { if *hashmap.get_mut(&button_names[index]).unwrap() {
button.show(); button.show();
} else { } else {
button.hide(); button.hide();

View file

@ -115,7 +115,7 @@ fn main() {
&gui_data.scrolled_window_errors, &gui_data.scrolled_window_errors,
); );
// Needs to run when entire GUI is initialized and // Needs to run when entire GUI is initialized
connect_change_language(&gui_data); connect_change_language(&gui_data);
connect_button_delete(&gui_data); connect_button_delete(&gui_data);

View file

@ -605,6 +605,7 @@ pub fn load_configuration(
let included_directories = get_string_from_list_store(&upper_notebook.tree_view_included_directories, ColumnsIncludedDirectory::Path as i32, None); let included_directories = get_string_from_list_store(&upper_notebook.tree_view_included_directories, ColumnsIncludedDirectory::Path as i32, None);
let excluded_directories = get_string_from_list_store(&upper_notebook.tree_view_excluded_directories, ColumnsExcludedDirectory::Path as i32, None); let excluded_directories = get_string_from_list_store(&upper_notebook.tree_view_excluded_directories, ColumnsExcludedDirectory::Path as i32, None);
// Loading data from hashmaps
let (hashmap_ls, _hashmap_sl) = create_hash_map(); let (hashmap_ls, _hashmap_sl) = create_hash_map();
let included_directories: Vec<String> = loaded_entries.get_vector_string(hashmap_ls.get(&LoadText::IncludedDirectories).unwrap().clone(), included_directories); let included_directories: Vec<String> = loaded_entries.get_vector_string(hashmap_ls.get(&LoadText::IncludedDirectories).unwrap().clone(), included_directories);
@ -743,6 +744,7 @@ fn save_proper_value_to_combo_box(combo_box: &ComboBoxText, what_to_save: u32) {
} }
} }
/// Reset configuration to defaults
pub fn reset_configuration(manual_clearing: bool, upper_notebook: &GuiUpperNotebook, main_notebook: &GuiMainNotebook, settings: &GuiSettings, text_view_errors: &TextView) { pub fn reset_configuration(manual_clearing: bool, upper_notebook: &GuiUpperNotebook, main_notebook: &GuiMainNotebook, settings: &GuiSettings, text_view_errors: &TextView) {
// TODO Maybe add popup dialog to confirm resetting // TODO Maybe add popup dialog to confirm resetting
let text_view_errors = text_view_errors.clone(); let text_view_errors = text_view_errors.clone();

View file

@ -15,6 +15,15 @@ core_folder_modified_before_epoch = Folder {$name} seems to be modified before U
core_file_no_modification_date = Unable to get modification date from file {$name}, reason {$reason} core_file_no_modification_date = Unable to get modification date from file {$name}, reason {$reason}
core_folder_no_modification_date = Unable to get modification date from folder {$name}, reason {$reason} core_folder_no_modification_date = Unable to get modification date from folder {$name}, reason {$reason}
core_missing_no_chosen_included_directory = At least one directory must be provided
core_directory_wildcard_no_supported = Directories: Wildcards in path are not supported, ignoring { $path }
core_directory_relative_path = Directories: Relative path are not supported, ignoring { $path }
core_directory_must_exists = Directories: Provided folder path must exits, ignoring { $path }
core_directory_must_be_directory = Directories: Provided path must point at the directory, ignoring { $path }
core_included_directory_zero_valid_directories = Included Directory ERROR: Not found even one correct path to included which is required
core_excluded_directory_pointless_slash = Directories: Excluding / is pointless, because it means that no files will be scanned
core_directory_overlap = Directories: All directories to search overlaps with excluded directories
# Window titles # Window titles
window_settings_title = Options window_settings_title = Options
window_main_title = Czkawka (Hiccup) window_main_title = Czkawka (Hiccup)