1
0
Fork 0
mirror of synced 2024-06-02 10:35:02 +12:00

Core and GUI support for few

This commit is contained in:
Rafał Mikrut 2022-06-10 18:43:34 +02:00
parent 81e9989361
commit a8ad9b5176
3 changed files with 85 additions and 29 deletions

View file

@ -48,7 +48,7 @@ pub struct FileEntry {
pub error_string: String,
}
#[derive(Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[derive(Copy, Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
pub enum TypeOfFile {
Unknown = -1,
Image = 0,
@ -58,15 +58,13 @@ pub enum TypeOfFile {
}
bitflags! {
pub struct CheckedFiles : u32 {
pub struct CheckedTypes : u32 {
const NONE = 0;
const TRACK_TITLE = 0b1;
const TRACK_ARTIST = 0b10;
const YEAR = 0b100;
const LENGTH = 0b1000;
const GENRE = 0b10000;
const BITRATE = 0b100000;
const PDF = 0b1;
const AUDIO = 0b10;
const IMAGE = 0b100;
const ARCHIVE = 0b1000;
}
}
@ -93,6 +91,7 @@ pub struct BrokenFiles {
recursive_search: bool,
delete_method: DeleteMethod,
stopped_search: bool,
checked_types: CheckedTypes,
use_cache: bool,
delete_outdated_cache: bool, // TODO add this to GUI
save_also_as_json: bool,
@ -114,6 +113,7 @@ impl BrokenFiles {
use_cache: true,
delete_outdated_cache: true,
save_also_as_json: false,
checked_types: CheckedTypes::PDF | CheckedTypes::AUDIO | CheckedTypes::IMAGE | CheckedTypes::ARCHIVE,
}
}
@ -139,6 +139,10 @@ impl BrokenFiles {
&self.broken_files
}
pub fn set_checked_types(&mut self, checked_types: CheckedTypes) {
self.checked_types = checked_types;
}
pub const fn get_text_messages(&self) -> &Messages {
&self.text_messages
}
@ -316,6 +320,10 @@ impl BrokenFiles {
continue 'dir;
}
if !check_extension_allowed(&type_of_file, &self.checked_types) {
continue 'dir;
}
let current_file_name = current_folder.join(entry_data.file_name());
if self.excluded_items.is_excluded(&current_file_name) {
continue 'dir;
@ -381,6 +389,8 @@ impl BrokenFiles {
let mut records_already_cached: BTreeMap<String, FileEntry> = Default::default();
let mut non_cached_files_to_check: BTreeMap<String, FileEntry> = Default::default();
let mut files_to_check = Default::default();
mem::swap(&mut self.files_to_check, &mut files_to_check);
if self.use_cache {
loaded_hash_map = match load_cache_from_file(&mut self.text_messages, self.delete_outdated_cache) {
@ -388,22 +398,26 @@ impl BrokenFiles {
None => Default::default(),
};
for (name, file_entry) in &self.files_to_check {
for (name, file_entry) in files_to_check {
let checked_extension = check_extension_allowed(&file_entry.type_of_file, &self.checked_types); // Only broken
#[allow(clippy::if_same_then_else)]
if !loaded_hash_map.contains_key(name) {
// If loaded data doesn't contains current image info
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 {
if checked_extension && !loaded_hash_map.contains_key(&name) {
// If loaded data doesn't contains current info
non_cached_files_to_check.insert(name, file_entry.clone());
} else if checked_extension && 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());
non_cached_files_to_check.insert(name, file_entry);
} 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());
records_already_cached.insert(name.clone(), loaded_hash_map.get(&name).unwrap().clone());
}
}
} else {
loaded_hash_map = Default::default();
mem::swap(&mut self.files_to_check, &mut non_cached_files_to_check);
non_cached_files_to_check = files_to_check;
}
//// PROGRESS THREAD START
@ -778,6 +792,12 @@ fn check_extension_availability(file_name_lowercase: &str) -> TypeOfFile {
TypeOfFile::Unknown
}
}
fn check_extension_allowed(type_of_file: &TypeOfFile, checked_types: &CheckedTypes) -> bool {
((*type_of_file == TypeOfFile::Image) && ((*checked_types & CheckedTypes::IMAGE) == CheckedTypes::IMAGE))
|| ((*type_of_file == TypeOfFile::PDF) && ((*checked_types & CheckedTypes::PDF) == CheckedTypes::PDF))
|| ((*type_of_file == TypeOfFile::ArchiveZip) && ((*checked_types & CheckedTypes::ARCHIVE) == CheckedTypes::ARCHIVE))
|| ((*type_of_file == TypeOfFile::Audio) && ((*checked_types & CheckedTypes::AUDIO) == CheckedTypes::AUDIO))
}
fn unpack_pdf_error(e: PdfError) -> PdfError {
if let Try {

View file

@ -479,6 +479,7 @@ move_stats = Properly moved {$num_files}/{$all_files} items
save_results_to_file = Saved results to file {$name}
search_not_choosing_any_music = ERROR: You must select at least one checkbox with music searching types.
search_not_choosing_any_broken_files = ERROR: You must select at least one checkbox with type of checked broken files.
include_folders_dialog_title = Folders to include
exclude_folders_dialog_title = Folders to exclude

View file

@ -7,7 +7,7 @@ use gtk4::prelude::*;
use czkawka_core::bad_extensions::BadExtensions;
use czkawka_core::big_file::BigFile;
use czkawka_core::broken_files::BrokenFiles;
use czkawka_core::broken_files::{BrokenFiles, CheckedTypes};
use czkawka_core::common_dir_traversal;
use czkawka_core::duplicate::DuplicateFinder;
use czkawka_core::empty_files::EmptyFiles;
@ -64,6 +64,10 @@ pub fn connect_button_search(
let check_button_music_genre: gtk4::CheckButton = gui_data.main_notebook.check_button_music_genre.clone();
let check_button_music_length: gtk4::CheckButton = gui_data.main_notebook.check_button_music_length.clone();
let check_button_music_bitrate: gtk4::CheckButton = gui_data.main_notebook.check_button_music_bitrate.clone();
let check_button_broken_files_archive: gtk4::CheckButton = gui_data.main_notebook.check_button_broken_files_archive.clone();
let check_button_broken_files_pdf: gtk4::CheckButton = gui_data.main_notebook.check_button_broken_files_pdf.clone();
let check_button_broken_files_audio: gtk4::CheckButton = gui_data.main_notebook.check_button_broken_files_audio.clone();
let check_button_broken_files_image: gtk4::CheckButton = gui_data.main_notebook.check_button_broken_files_image.clone();
let check_button_recursive = gui_data.upper_notebook.check_button_recursive.clone();
let check_button_settings_duplicates_delete_outdated_cache = gui_data.settings.check_button_settings_duplicates_delete_outdated_cache.clone();
let check_button_settings_hide_hard_links = gui_data.settings.check_button_settings_hide_hard_links.clone();
@ -484,19 +488,50 @@ pub fn connect_button_search(
let futures_sender_broken_files = futures_sender_broken_files.clone();
thread::spawn(move || {
let mut br = BrokenFiles::new();
let mut checked_types: CheckedTypes = CheckedTypes::NONE;
br.set_included_directory(included_directories);
br.set_excluded_directory(excluded_directories);
br.set_recursive_search(recursive_search);
br.set_excluded_items(excluded_items);
br.set_use_cache(use_cache);
br.set_allowed_extensions(allowed_extensions);
br.set_save_also_as_json(save_also_as_json);
br.find_broken_files(Some(&stop_receiver), Some(&futures_sender_broken_files));
let _ = glib_stop_sender.send(Message::BrokenFiles(br));
});
if check_button_broken_files_audio.is_active() {
checked_types |= CheckedTypes::AUDIO;
}
if check_button_broken_files_pdf.is_active() {
checked_types |= CheckedTypes::PDF;
}
if check_button_broken_files_image.is_active() {
checked_types |= CheckedTypes::IMAGE;
}
if check_button_broken_files_archive.is_active() {
checked_types |= CheckedTypes::ARCHIVE;
}
if checked_types != CheckedTypes::NONE {
thread::spawn(move || {
let mut br = BrokenFiles::new();
br.set_included_directory(included_directories);
br.set_excluded_directory(excluded_directories);
br.set_recursive_search(recursive_search);
br.set_excluded_items(excluded_items);
br.set_use_cache(use_cache);
br.set_allowed_extensions(allowed_extensions);
br.set_save_also_as_json(save_also_as_json);
br.set_checked_types(checked_types);
br.find_broken_files(Some(&stop_receiver), Some(&futures_sender_broken_files));
let _ = glib_stop_sender.send(Message::BrokenFiles(br));
});
} else {
set_buttons(
&mut *shared_buttons.borrow_mut().get_mut(&NotebookMainEnum::BrokenFiles).unwrap(),
&buttons_array,
&buttons_names,
);
entry_info.set_text(&flg!("search_not_choosing_any_broken_files"));
show_dialog.store(false, Ordering::Relaxed);
notebook_main.set_sensitive(true);
notebook_upper.set_sensitive(true);
button_settings.set_sensitive(true);
button_app_info.set_sensitive(true);
}
}
NotebookMainEnum::BadExtensions => {
label_stage.show();