Core and GUI support for few
This commit is contained in:
parent
81e9989361
commit
a8ad9b5176
|
@ -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(¤t_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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue