1
0
Fork 0
mirror of synced 2024-04-29 01:52:39 +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]]
name = "combine"
version = "4.6.2"
version = "4.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2b2f5d0ee456f3928812dfc8c6d9a1d592b98678f6d56db9b0cd2b7bc6c8db5"
checksum = "50b727aacc797f9fc28e355d21f34709ac4fc9adecfe470ad07b8f4464f53062"
dependencies = [
"bytes",
"memchr",
@ -628,8 +628,18 @@ version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858"
dependencies = [
"darling_core",
"darling_macro",
"darling_core 0.10.2",
"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]]
@ -646,13 +656,38 @@ dependencies = [
"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]]
name = "darling_macro"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72"
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",
"syn",
]
@ -1647,20 +1682,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8794322172319b972f528bf90c6b467be0079f1fa82780ffb431088e741a73ab"
dependencies = [
"jni-sys",
"ndk-sys",
"ndk-sys 0.2.2",
"num_enum",
"thiserror",
]
[[package]]
name = "ndk"
version = "0.4.0"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d64d6af06fde0e527b1ba5c7b79a6cc89cfc46325b0b2887dffe8f70197e0c3c"
checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4"
dependencies = [
"bitflags",
"jni-sys",
"ndk-sys",
"ndk-sys 0.3.0",
"num_enum",
"thiserror",
]
@ -1675,22 +1710,22 @@ dependencies = [
"libc",
"log",
"ndk 0.3.0",
"ndk-macro",
"ndk-sys",
"ndk-macro 0.2.0",
"ndk-sys 0.2.2",
]
[[package]]
name = "ndk-glue"
version = "0.4.0"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3e9e94628f24e7a3cb5b96a2dc5683acd9230bf11991c2a1677b87695138420"
checksum = "04c0d14b0858eb9962a5dac30b809b19f19da7e4547d64af2b0bb051d2e55d79"
dependencies = [
"lazy_static",
"libc",
"log",
"ndk 0.4.0",
"ndk-macro",
"ndk-sys",
"ndk 0.6.0",
"ndk-macro 0.3.0",
"ndk-sys 0.3.0",
]
[[package]]
@ -1699,19 +1734,41 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d"
dependencies = [
"darling",
"darling 0.10.2",
"proc-macro-crate 0.1.5",
"proc-macro2",
"quote",
"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]]
name = "ndk-sys"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
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]]
name = "nix"
version = "0.20.0"
@ -1867,13 +1924,13 @@ dependencies = [
[[package]]
name = "oboe"
version = "0.4.4"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e15e22bc67e047fe342a32ecba55f555e3be6166b04dd157cd0f803dfa9f48e1"
checksum = "2463c8f2e19b4e0d0710a21f8e4011501ff28db1c95d7a5482a553b2100502d2"
dependencies = [
"jni",
"ndk 0.4.0",
"ndk-glue 0.4.0",
"ndk 0.6.0",
"ndk-glue 0.6.0",
"num-derive",
"num-traits",
"oboe-sys",
@ -1881,9 +1938,9 @@ dependencies = [
[[package]]
name = "oboe-sys"
version = "0.4.4"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "338142ae5ab0aaedc8275aa8f67f460e43ae0fca76a695a742d56da0a269eadc"
checksum = "3370abb7372ed744232c12954d920d1a40f1c4686de9e79e800021ef492294bd"
dependencies = [
"cc",
]

View file

@ -14,7 +14,7 @@ use crossbeam_channel::Receiver;
use humansize::{file_size_opts as options, FileSize};
use rayon::prelude::*;
use crate::common::Common;
use crate::common::{Common, LOOP_DURATION};
use crate::common_directory::Directories;
use crate::common_extensions::Extensions;
use crate::common_items::ExcludedItems;
@ -131,7 +131,6 @@ impl BigFile {
}
//// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true));
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);
}
/// Remove unused entries when included or excluded overlaps with each other or are duplicated etc.
fn optimize_directories(&mut self) {
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>) {
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>) {
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 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_extensions::Extensions;
use crate::common_items::ExcludedItems;
@ -67,7 +67,6 @@ impl Info {
}
}
/// Struct with required information's to work
pub struct BrokenFiles {
text_messages: Messages,
information: Info,
@ -174,7 +173,6 @@ impl BrokenFiles {
}
//// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true));
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
//// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true));
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
pub const LOOP_DURATION: u32 = 200; //ms
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))> {
@ -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) {
Ok(t) => t,
Err(_e) => {
// println!("Failed to open image {:?}, reason {}", path, e);
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) {
Ok(raw) => raw,
Err(_e) => {
// println!("Failed to decode raw image {:?}, reason {}", path, e);
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) {
Ok(pipeline) => pipeline,
Err(_e) => {
// println!("Failed to create pipeline {:?}, reason {}", path, e);
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) {
Ok(image) => image,
Err(_e) => {
// println!("Failed to process image {:?}, reason {}", path, e);
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) {
Some(image) => image,
None => {
// println!("Failed to get image {:?}", path);
return None;
}
};

View file

@ -7,6 +7,7 @@ use std::thread::sleep;
use std::time::{Duration, SystemTime, UNIX_EPOCH};
use std::{fs, thread};
use crate::common::LOOP_DURATION;
use crossbeam_channel::Receiver;
use rayon::prelude::*;
@ -308,7 +309,6 @@ where
folders_to_check.extend(self.root_dirs);
//// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true));
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_messages::Messages;
use crate::fl;
use crate::localizer::generate_translation_hashmap;
#[derive(Clone, Default)]
pub struct Directories {
@ -20,12 +22,12 @@ impl Directories {
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 {
let start_time: SystemTime = SystemTime::now();
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;
}
@ -34,37 +36,41 @@ impl Directories {
let mut checked_directories: Vec<PathBuf> = Vec::new();
for directory in directories {
if directory.to_string_lossy().contains('*') {
text_messages
.warnings
.push(format!("Included Directory Warning: Wildcards in path are not supported, ignoring {}", directory.display()));
text_messages.warnings.push(fl!(
"core_directory_wildcard_no_supported",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
#[cfg(not(target_family = "windows"))]
if directory.is_relative() {
text_messages
.warnings
.push(format!("Included Directory Warning: Relative path are not supported, ignoring {}", directory.display()));
text_messages.warnings.push(fl!(
"core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
#[cfg(target_family = "windows")]
if directory.is_relative() && !directory.starts_with("\\") {
text_messages
.warnings
.push(format!("Included Directory Warning: Relative path are not supported, ignoring {}", directory.display()));
text_messages.warnings.push(fl!(
"core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
if !directory.exists() {
text_messages
.warnings
.push(format!("Included Directory Warning: Provided folder path must exits, ignoring {}", directory.display()));
text_messages.warnings.push(fl!(
"core_directory_must_exists",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
if !directory.is_dir() {
text_messages.warnings.push(format!(
"Included Directory Warning: Provided path must point at the directory, ignoring {}",
directory.display()
text_messages.warnings.push(fl!(
"core_directory_must_be_directory",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
@ -72,9 +78,7 @@ impl Directories {
}
if checked_directories.is_empty() {
text_messages
.errors
.push("Included Directory ERROR: Not found even one correct path to included which is required.".to_string());
text_messages.warnings.push(fl!("core_included_directory_zero_valid_directories"));
return false;
}
@ -84,7 +88,7 @@ impl Directories {
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) {
let start_time: SystemTime = SystemTime::now();
if excluded_directory.is_empty() {
@ -97,40 +101,41 @@ impl Directories {
for directory in directories {
let directory_as_string = directory.to_string_lossy();
if directory_as_string == "/" {
text_messages
.errors
.push("Excluded Directory ERROR: Excluding / is pointless, because it means that no files will be scanned.".to_string());
text_messages.errors.push(fl!("core_excluded_directory_pointless_slash"));
break;
}
if directory_as_string.contains('*') {
text_messages
.warnings
.push(format!("Excluded Directory Warning: Wildcards in path are not supported, ignoring {}", directory.display()));
text_messages.warnings.push(fl!(
"core_directory_wildcard_no_supported",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
#[cfg(not(target_family = "windows"))]
if directory.is_relative() {
text_messages
.warnings
.push(format!("Excluded Directory Warning: Relative path are not supported, ignoring {}", directory.display()));
text_messages.warnings.push(fl!(
"core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
#[cfg(target_family = "windows")]
if directory.is_relative() && !directory.starts_with("\\") {
text_messages
.warnings
.push(format!("Excluded Directory Warning: Relative path are not supported, ignoring {}", directory.display()));
text_messages.warnings.push(fl!(
"core_directory_relative_path",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
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;
}
if !directory.is_dir() {
text_messages.warnings.push(format!(
"Excluded Directory Warning: Provided path must point at the directory, ignoring {}",
directory.display()
text_messages.warnings.push(fl!(
"core_directory_must_be_directory",
generate_translation_hashmap(vec![("path", directory.display().to_string())])
));
continue;
}
@ -265,18 +270,13 @@ impl Directories {
for folder in &self.reference_directories {
if self.included_directories.iter().any(|e| folder.starts_with(&e)) {
ref_folders.push(folder.clone());
// println!("REF: VALID reference folder {:?}", folder);
} else {
// println!("REF: Invalid reference folder {:?}", folder);
}
}
self.reference_directories = ref_folders;
}
if self.included_directories.is_empty() {
text_messages
.errors
.push("Optimize Directories ERROR: Excluded directories overlaps all included directories.".to_string());
text_messages.errors.push(fl!("core_directory_overlap"));
return false;
}

View file

@ -28,12 +28,13 @@ impl ExcludedItems {
for expression in expressions {
let expression: String = expression.trim().to_string();
#[cfg(target_family = "windows")]
let expression = expression.replace("/", "\\");
if expression.is_empty() {
continue;
}
#[cfg(target_family = "windows")]
let expression = expression.replace("/", "\\");
if expression == "DEFAULT" {
if cfg!(target_family = "unix") {
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 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_directory::Directories;
use crate::common_extensions::Extensions;
@ -54,7 +54,6 @@ pub enum DeleteMethod {
HardLink,
}
/// Info struck with helpful information's about results
#[derive(Default)]
pub struct Info {
pub number_of_groups_by_size: usize,
@ -73,7 +72,6 @@ impl Info {
}
}
/// Struct with required information's to work
pub struct DuplicateFinder {
text_messages: Messages,
information: Info,
@ -489,7 +487,6 @@ impl DuplicateFinder {
let mut pre_checked_map: BTreeMap<u64, Vec<FileEntry>> = Default::default();
//// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0));
@ -655,7 +652,6 @@ impl DuplicateFinder {
/////////////////////////
//// PROGRESS THREAD START
// const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0));

View file

@ -14,7 +14,7 @@ use crossbeam_channel::Receiver;
use rayon::prelude::*;
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_directory::Directories;
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
//// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0));
@ -429,7 +428,6 @@ impl SameMusic {
let start_time: SystemTime = SystemTime::now();
//// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true));
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 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_extensions::Extensions;
use crate::common_items::ExcludedItems;
@ -61,7 +61,6 @@ pub struct ProgressData {
pub images_checked: usize,
pub images_to_check: usize,
}
const LOOP_DURATION: u32 = 200; //ms
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Serialize, Deserialize)]
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::{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_extensions::Extensions;
use crate::common_items::ExcludedItems;
@ -236,7 +236,6 @@ impl SimilarVideos {
}
//// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0));
@ -447,7 +446,6 @@ impl SimilarVideos {
let hash_map_modification = SystemTime::now();
//// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0));

View file

@ -11,7 +11,7 @@ use std::{fs, thread};
use crossbeam_channel::Receiver;
use rayon::prelude::*;
use crate::common::Common;
use crate::common::{Common, LOOP_DURATION};
use crate::common_directory::Directories;
use crate::common_items::ExcludedItems;
use crate::common_messages::Messages;
@ -131,7 +131,6 @@ impl Temporary {
}
//// PROGRESS THREAD START
const LOOP_DURATION: u32 = 200; //in ms
let progress_thread_run = Arc::new(AtomicBool::new(true));
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 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 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 taskbar_state = gui_data.taskbar_state.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(
&shared_buttons,
&NotebookMainEnum::Duplicate,
&["save", "delete", "select", "symlink", "hardlink", "move"],
&[
BottomButtonsEnum::Save,
BottomButtonsEnum::Delete,
BottomButtonsEnum::Select,
BottomButtonsEnum::Symlink,
BottomButtonsEnum::Hardlink,
BottomButtonsEnum::Move,
],
duplicates_number > 0,
);
@ -565,7 +572,7 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active(
&shared_buttons,
&NotebookMainEnum::EmptyDirectories,
&["save", "delete", "select", "move"],
&[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move],
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(
&shared_buttons,
&NotebookMainEnum::EmptyFiles,
&["save", "delete", "select", "move"],
&[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move],
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(
&shared_buttons,
&NotebookMainEnum::BigFiles,
&["save", "delete", "select", "move"],
&[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move],
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(
&shared_buttons,
&NotebookMainEnum::Temporary,
&["save", "delete", "select", "move"],
&[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move],
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(
&shared_buttons,
&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,
);
@ -1102,7 +1117,14 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active(
&shared_buttons,
&NotebookMainEnum::SimilarVideos,
&["save", "delete", "select", "symlink", "hardlink", "move"],
&[
BottomButtonsEnum::Save,
BottomButtonsEnum::Delete,
BottomButtonsEnum::Select,
BottomButtonsEnum::Symlink,
BottomButtonsEnum::Hardlink,
BottomButtonsEnum::Move,
],
found_any_duplicates,
);
@ -1317,7 +1339,14 @@ pub fn connect_compute_results(gui_data: &GuiData, glib_stop_receiver: Receiver<
set_specific_buttons_as_active(
&shared_buttons,
&NotebookMainEnum::SameMusic,
&["save", "delete", "select", "symlink", "hardlink", "move"],
&[
BottomButtonsEnum::Save,
BottomButtonsEnum::Delete,
BottomButtonsEnum::Select,
BottomButtonsEnum::Symlink,
BottomButtonsEnum::Hardlink,
BottomButtonsEnum::Move,
],
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;
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(
&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(
&shared_buttons,
&NotebookMainEnum::BrokenFiles,
&["save", "delete", "select", "move"],
&[BottomButtonsEnum::Save, BottomButtonsEnum::Delete, BottomButtonsEnum::Select, BottomButtonsEnum::Move],
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(
buttons_array: &Rc<RefCell<HashMap<NotebookMainEnum, HashMap<String, bool>>>>,
buttons_array: &Rc<RefCell<HashMap<NotebookMainEnum, HashMap<BottomButtonsEnum, bool>>>>,
notebook_enum: &NotebookMainEnum,
buttons: &[&str],
buttons: &[BottomButtonsEnum],
value_to_set: bool,
) {
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 crate::gui_structs::gui_data::GuiData;
use crate::help_functions::BottomButtonsEnum;
use crate::localizer::generate_translation_hashmap;
use crate::notebook_enums::*;
@ -96,7 +97,7 @@ pub fn connect_button_save(gui_data: &GuiData) {
fn post_save_things(
file_name: &str,
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,
buttons_save: &Button,
) {
@ -104,6 +105,6 @@ fn post_save_things(
// Set state
{
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 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 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 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();

View file

@ -8,7 +8,7 @@ pub fn connect_notebook_tabs(gui_data: &GuiData) {
let shared_buttons = gui_data.shared_buttons.clone();
let buttons_array = gui_data.bottom_buttons.buttons_array.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| {
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 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_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| {
let hash_size_index = combo_box_image_hash_size.active().unwrap() as usize;
let hash_size = IMAGES_HASH_SIZE_COMBO_BOX[hash_size_index];
match hash_size {
8 => {
scale_similarity_similar_images.set_range(0_f64, SIMILAR_VALUES[0][5] as f64);
scale_similarity_similar_images.set_fill_level(SIMILAR_VALUES[0][5] as f64);
label_similar_images_minimal_similarity.set_text(&get_string_from_similarity(&Similarity::Similar(SIMILAR_VALUES[0][5]), 8));
}
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));
}
let index = match hash_size {
8 => 0,
16 => 1,
32 => 2,
64 => 3,
_ => 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::{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;
#[derive(Clone)]
@ -16,7 +16,7 @@ pub struct GuiBottomButtons {
pub buttons_compare: gtk::Button,
pub buttons_show_errors: gtk::Button,
pub buttons_show_upper_notebook: gtk::Button,
pub buttons_names: [String; 8],
pub buttons_names: [BottomButtonsEnum; 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_names = [
"search".to_string(),
"select".to_string(),
"delete".to_string(),
"save".to_string(),
"symlink".to_string(),
"hardlink".to_string(),
"move".to_string(),
"compare".to_string(),
BottomButtonsEnum::Search,
BottomButtonsEnum::Select,
BottomButtonsEnum::Delete,
BottomButtonsEnum::Save,
BottomButtonsEnum::Symlink,
BottomButtonsEnum::Hardlink,
BottomButtonsEnum::Move,
BottomButtonsEnum::Compare,
];
let buttons_array = [
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_settings::GuiSettings;
use crate::gui_structs::gui_upper_notebook::GuiUpperNotebook;
use crate::help_functions::BottomButtonsEnum;
use crate::notebook_enums::*;
use crate::taskbar_progress::TaskbarProgress;
@ -56,7 +57,7 @@ pub struct GuiData {
pub taskbar_state: Rc<RefCell<TaskbarProgress>>,
// 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
pub shared_duplication_state: Rc<RefCell<DuplicateFinder>>,
@ -116,16 +117,16 @@ impl GuiData {
let taskbar_state = Rc::new(RefCell::new(TaskbarProgress::new()));
// 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
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() {
if *button_name == "search" {
temp_hashmap.insert(button_name.to_string(), true);
if *button_name == BottomButtonsEnum::Search {
temp_hashmap.insert(*button_name, true);
} else {
temp_hashmap.insert(button_name.to_string(), false);
temp_hashmap.insert(*button_name, false);
}
}
shared_buttons.borrow_mut().insert(i.clone(), temp_hashmap);

View file

@ -50,6 +50,18 @@ pub enum PopoverTypes {
None,
}
#[derive(Eq, PartialEq, Copy, Clone, Hash)]
pub enum BottomButtonsEnum {
Search,
Select,
Delete,
Save,
Symlink,
Hardlink,
Move,
Compare,
}
pub struct NotebookObject {
pub notebook_type: NotebookMainEnum,
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() {
if *hashmap.get_mut(button_names[index].as_str()).unwrap() {
if *hashmap.get_mut(&button_names[index]).unwrap() {
button.show();
} else {
button.hide();

View file

@ -115,7 +115,7 @@ fn main() {
&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_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 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 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) {
// TODO Maybe add popup dialog to confirm resetting
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_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_settings_title = Options
window_main_title = Czkawka (Hiccup)