Names
This commit is contained in:
parent
cd1c6e953d
commit
e268afbc4b
|
@ -328,7 +328,7 @@ where
|
||||||
{
|
{
|
||||||
#[fun_time(message = "run(collecting files/dirs)", level = "debug")]
|
#[fun_time(message = "run(collecting files/dirs)", level = "debug")]
|
||||||
pub fn run(self) -> DirTraversalResult<T> {
|
pub fn run(self) -> DirTraversalResult<T> {
|
||||||
assert!(self.tool_type != ToolType::None, "Tool type cannot be None");
|
assert_ne!(self.tool_type, ToolType::None, "Tool type cannot be None");
|
||||||
|
|
||||||
let mut all_warnings = vec![];
|
let mut all_warnings = vec![];
|
||||||
let mut grouped_file_entries: BTreeMap<T, Vec<FileEntry>> = BTreeMap::new();
|
let mut grouped_file_entries: BTreeMap<T, Vec<FileEntry>> = BTreeMap::new();
|
||||||
|
@ -766,7 +766,6 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_family = "unix")]
|
#[cfg(target_family = "unix")]
|
||||||
#[ignore] // Flaky test
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_traversal_group_by_inode() -> io::Result<()> {
|
fn test_traversal_group_by_inode() -> io::Result<()> {
|
||||||
let dir = tempfile::Builder::new().tempdir()?;
|
let dir = tempfile::Builder::new().tempdir()?;
|
||||||
|
@ -808,7 +807,6 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_family = "windows")]
|
#[cfg(target_family = "windows")]
|
||||||
#[ignore] // Flaky test
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_traversal_group_by_inode() -> io::Result<()> {
|
fn test_traversal_group_by_inode() -> io::Result<()> {
|
||||||
let dir = tempfile::Builder::new().tempdir()?;
|
let dir = tempfile::Builder::new().tempdir()?;
|
||||||
|
|
|
@ -1296,7 +1296,7 @@ where
|
||||||
fn vector_sort_simple_unstable_entry_by_path<T>(vector: &[T]) -> Vec<T>
|
fn vector_sort_simple_unstable_entry_by_path<T>(vector: &[T]) -> Vec<T>
|
||||||
where
|
where
|
||||||
T: ResultEntry + Clone,
|
T: ResultEntry + Clone,
|
||||||
T: std::marker::Send,
|
T: Send,
|
||||||
{
|
{
|
||||||
let mut vector = vector.to_vec();
|
let mut vector = vector.to_vec();
|
||||||
vector.par_sort_unstable_by(|a, b| split_path_compare(a.get_path(), b.get_path()));
|
vector.par_sort_unstable_by(|a, b| split_path_compare(a.get_path(), b.get_path()));
|
||||||
|
|
|
@ -77,8 +77,8 @@ pub fn connect_button_search(gui_data: &GuiData, result_sender: Sender<Message>,
|
||||||
entry_info.set_text(&flg!("searching_for_data"));
|
entry_info.set_text(&flg!("searching_for_data"));
|
||||||
|
|
||||||
// Resets progress bars
|
// Resets progress bars
|
||||||
progress_bar_all_stages.set_fraction(0 as f64);
|
progress_bar_all_stages.set_fraction(0f64);
|
||||||
progress_bar_current_stage.set_fraction(0 as f64);
|
progress_bar_current_stage.set_fraction(0f64);
|
||||||
|
|
||||||
reset_text_view(&text_view_errors);
|
reset_text_view(&text_view_errors);
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ impl LoadedCommonItems {
|
||||||
.as_str()
|
.as_str()
|
||||||
.to_string()
|
.to_string()
|
||||||
.split(',')
|
.split(',')
|
||||||
.map(std::string::ToString::to_string)
|
.map(ToString::to_string)
|
||||||
.collect::<Vec<String>>();
|
.collect::<Vec<String>>();
|
||||||
let allowed_extensions = entry_allowed_extensions.text().as_str().to_string();
|
let allowed_extensions = entry_allowed_extensions.text().as_str().to_string();
|
||||||
let excluded_extensions = entry_excluded_extensions.text().as_str().to_string();
|
let excluded_extensions = entry_excluded_extensions.text().as_str().to_string();
|
||||||
|
|
|
@ -217,10 +217,10 @@ fn progress_default(gui_data: &GuiData, item: &ProgressData) {
|
||||||
|
|
||||||
fn common_set_data(item: &ProgressData, progress_bar_all_stages: &ProgressBar, progress_bar_current_stage: &ProgressBar, taskbar_state: &Rc<RefCell<TaskbarProgress>>) {
|
fn common_set_data(item: &ProgressData, progress_bar_all_stages: &ProgressBar, progress_bar_current_stage: &ProgressBar, taskbar_state: &Rc<RefCell<TaskbarProgress>>) {
|
||||||
if item.entries_to_check != 0 {
|
if item.entries_to_check != 0 {
|
||||||
let all_stages = (item.current_stage as f64 + (item.entries_checked) as f64 / item.entries_to_check as f64) / (item.max_stage + 1) as f64;
|
let all_stages = (item.current_stage as f64 + item.entries_checked as f64 / item.entries_to_check as f64) / (item.max_stage + 1) as f64;
|
||||||
let all_stages = if all_stages > 0.99 { 0.99 } else { all_stages };
|
let all_stages = if all_stages > 0.99 { 0.99 } else { all_stages };
|
||||||
progress_bar_all_stages.set_fraction(all_stages);
|
progress_bar_all_stages.set_fraction(all_stages);
|
||||||
progress_bar_current_stage.set_fraction((item.entries_checked) as f64 / item.entries_to_check as f64);
|
progress_bar_current_stage.set_fraction(item.entries_checked as f64 / item.entries_to_check as f64);
|
||||||
taskbar_state.borrow().set_progress_value(
|
taskbar_state.borrow().set_progress_value(
|
||||||
((item.current_stage as usize) * item.entries_to_check + item.entries_checked) as u64,
|
((item.current_stage as usize) * item.entries_to_check + item.entries_checked) as u64,
|
||||||
item.entries_to_check as u64 * (item.max_stage + 1) as u64,
|
item.entries_to_check as u64 * (item.max_stage + 1) as u64,
|
||||||
|
|
|
@ -212,7 +212,7 @@ fn add_manually_directories(window_main: &Window, tree_view: &TreeView, excluded
|
||||||
let list_store = get_list_store(&tree_view);
|
let list_store = get_list_store(&tree_view);
|
||||||
|
|
||||||
if excluded_items {
|
if excluded_items {
|
||||||
if !(check_if_value_is_in_list_store(&list_store, ColumnsExcludedDirectory::Path as i32, &text)) {
|
if !check_if_value_is_in_list_store(&list_store, ColumnsExcludedDirectory::Path as i32, &text) {
|
||||||
let values: [(u32, &dyn ToValue); 1] = [(ColumnsExcludedDirectory::Path as u32, &text)];
|
let values: [(u32, &dyn ToValue); 1] = [(ColumnsExcludedDirectory::Path as u32, &text)];
|
||||||
list_store.set(&list_store.append(), &values);
|
list_store.set(&list_store.append(), &values);
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,10 +138,10 @@ fn no_current_stage_get_data(item: &ProgressData) -> (i32, i32) {
|
||||||
// Used to calculate number of files to check and also to calculate current progress according to number of files to check and checked
|
// Used to calculate number of files to check and also to calculate current progress according to number of files to check and checked
|
||||||
fn common_get_data(item: &ProgressData) -> (i32, i32) {
|
fn common_get_data(item: &ProgressData) -> (i32, i32) {
|
||||||
if item.entries_to_check != 0 {
|
if item.entries_to_check != 0 {
|
||||||
let all_stages = (item.current_stage as f64 + (item.entries_checked) as f64 / item.entries_to_check as f64) / (item.max_stage + 1) as f64;
|
let all_stages = (item.current_stage as f64 + item.entries_checked as f64 / item.entries_to_check as f64) / (item.max_stage + 1) as f64;
|
||||||
let all_stages = if all_stages > 0.99 { 0.99 } else { all_stages };
|
let all_stages = if all_stages > 0.99 { 0.99 } else { all_stages };
|
||||||
|
|
||||||
let current_stage = (item.entries_checked) as f64 / item.entries_to_check as f64;
|
let current_stage = item.entries_checked as f64 / item.entries_to_check as f64;
|
||||||
let current_stage = if current_stage > 0.99 { 0.99 } else { current_stage };
|
let current_stage = if current_stage > 0.99 { 0.99 } else { current_stage };
|
||||||
((all_stages * 100.0) as i32, (current_stage * 100.0) as i32)
|
((all_stages * 100.0) as i32, (current_stage * 100.0) as i32)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -105,7 +105,7 @@ fn scan_duplicates(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>, s
|
||||||
// finder.set_ignore_hard_links(custom_settings.ignore); // TODO
|
// finder.set_ignore_hard_links(custom_settings.ignore); // TODO
|
||||||
finder.set_use_prehash_cache(custom_settings.duplicate_use_prehash);
|
finder.set_use_prehash_cache(custom_settings.duplicate_use_prehash);
|
||||||
finder.set_delete_outdated_cache(custom_settings.duplicate_delete_outdated_entries);
|
finder.set_delete_outdated_cache(custom_settings.duplicate_delete_outdated_entries);
|
||||||
// finder.set_case_sensitive_name_comparison(custom_settings.); // TODO
|
finder.set_case_sensitive_name_comparison(custom_settings.duplicates_sub_name_case_sensitive);
|
||||||
finder.find_duplicates(Some(&stop_receiver), Some(&progress_sender));
|
finder.find_duplicates(Some(&stop_receiver), Some(&progress_sender));
|
||||||
let messages = finder.get_text_messages().create_messages_text();
|
let messages = finder.get_text_messages().create_messages_text();
|
||||||
|
|
||||||
|
@ -396,7 +396,7 @@ fn write_similar_images_results(app: &MainWindow, vector: Vec<(Option<ImagesEntr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
app.set_similar_images_model(items.into());
|
app.set_similar_images_model(items.into());
|
||||||
app.invoke_scan_ended(format!("Found {items_found} similar images files").into());
|
app.invoke_scan_ended(format!("Found {items_found} similar image files").into());
|
||||||
app.global::<GuiState>().set_info_text(messages.into());
|
app.global::<GuiState>().set_info_text(messages.into());
|
||||||
}
|
}
|
||||||
fn prepare_data_model_similar_images(fe: &ImagesEntry, hash_size: u8) -> (ModelRc<SharedString>, ModelRc<i32>) {
|
fn prepare_data_model_similar_images(fe: &ImagesEntry, hash_size: u8) -> (ModelRc<SharedString>, ModelRc<i32>) {
|
||||||
|
@ -470,7 +470,7 @@ fn write_similar_videos_results(app: &MainWindow, vector: Vec<(Option<VideosEntr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
app.set_similar_videos_model(items.into());
|
app.set_similar_videos_model(items.into());
|
||||||
app.invoke_scan_ended(format!("Found {items_found} similar videos files").into());
|
app.invoke_scan_ended(format!("Found {items_found} similar video files").into());
|
||||||
app.global::<GuiState>().set_info_text(messages.into());
|
app.global::<GuiState>().set_info_text(messages.into());
|
||||||
}
|
}
|
||||||
fn prepare_data_model_similar_videos(fe: &VideosEntry) -> (ModelRc<SharedString>, ModelRc<i32>) {
|
fn prepare_data_model_similar_videos(fe: &VideosEntry) -> (ModelRc<SharedString>, ModelRc<i32>) {
|
||||||
|
@ -523,8 +523,8 @@ fn scan_similar_music(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>
|
||||||
}
|
}
|
||||||
|
|
||||||
finder.set_music_similarity(music_similarity);
|
finder.set_music_similarity(music_similarity);
|
||||||
// finder.set_maximum_difference(custom_settings.mus); // TODO
|
finder.set_maximum_difference(custom_settings.similar_music_sub_maximum_difference_value as f64);
|
||||||
// finder.set_minimum_segment_duration(minimum_segment_duration); // TODO
|
finder.set_minimum_segment_duration(custom_settings.similar_music_sub_minimal_fragment_duration_value);
|
||||||
let audio_check_type = ALLOWED_AUDIO_CHECK_TYPE_VALUES[get_audio_check_type_idx(&custom_settings.similar_music_sub_audio_check_type).unwrap()].2;
|
let audio_check_type = ALLOWED_AUDIO_CHECK_TYPE_VALUES[get_audio_check_type_idx(&custom_settings.similar_music_sub_audio_check_type).unwrap()].2;
|
||||||
finder.set_check_type(audio_check_type);
|
finder.set_check_type(audio_check_type);
|
||||||
finder.set_approximate_comparison(custom_settings.similar_music_sub_approximate_comparison);
|
finder.set_approximate_comparison(custom_settings.similar_music_sub_approximate_comparison);
|
||||||
|
@ -549,7 +549,7 @@ fn scan_similar_music(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>
|
||||||
}
|
}
|
||||||
|
|
||||||
a.upgrade_in_event_loop(move |app| {
|
a.upgrade_in_event_loop(move |app| {
|
||||||
crate::connect_scan::write_similar_music_results(&app, vector, messages);
|
write_similar_music_results(&app, vector, messages);
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -559,14 +559,14 @@ fn write_similar_music_results(app: &MainWindow, vector: Vec<(Option<MusicEntry>
|
||||||
let items = Rc::new(VecModel::default());
|
let items = Rc::new(VecModel::default());
|
||||||
for (ref_fe, vec_fe) in vector {
|
for (ref_fe, vec_fe) in vector {
|
||||||
if let Some(ref_fe) = ref_fe {
|
if let Some(ref_fe) = ref_fe {
|
||||||
let (data_model_str, data_model_int) = crate::connect_scan::prepare_data_model_similar_music(&ref_fe);
|
let (data_model_str, data_model_int) = prepare_data_model_similar_music(&ref_fe);
|
||||||
insert_data_to_model(&items, data_model_str, data_model_int, Some(true));
|
insert_data_to_model(&items, data_model_str, data_model_int, Some(true));
|
||||||
} else {
|
} else {
|
||||||
insert_data_to_model(&items, ModelRc::new(VecModel::default()), ModelRc::new(VecModel::default()), Some(false));
|
insert_data_to_model(&items, ModelRc::new(VecModel::default()), ModelRc::new(VecModel::default()), Some(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
for fe in vec_fe {
|
for fe in vec_fe {
|
||||||
let (data_model_str, data_model_int) = crate::connect_scan::prepare_data_model_similar_music(&fe);
|
let (data_model_str, data_model_int) = prepare_data_model_similar_music(&fe);
|
||||||
insert_data_to_model(&items, data_model_str, data_model_int, None);
|
insert_data_to_model(&items, data_model_str, data_model_int, None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -618,7 +618,7 @@ fn write_invalid_symlinks_results(app: &MainWindow, vector: Vec<SymlinksFileEntr
|
||||||
let items_found = vector.len();
|
let items_found = vector.len();
|
||||||
let items = Rc::new(VecModel::default());
|
let items = Rc::new(VecModel::default());
|
||||||
for fe in vector {
|
for fe in vector {
|
||||||
let (data_model_str, data_model_int) = crate::connect_scan::prepare_data_model_invalid_symlinks(&fe);
|
let (data_model_str, data_model_int) = prepare_data_model_invalid_symlinks(&fe);
|
||||||
insert_data_to_model(&items, data_model_str, data_model_int, None);
|
insert_data_to_model(&items, data_model_str, data_model_int, None);
|
||||||
}
|
}
|
||||||
app.set_invalid_symlinks_model(items.into());
|
app.set_invalid_symlinks_model(items.into());
|
||||||
|
@ -654,7 +654,7 @@ fn scan_temporary_files(a: Weak<MainWindow>, progress_sender: Sender<ProgressDat
|
||||||
vector.par_sort_unstable_by(|a, b| split_path_compare(a.path.as_path(), b.path.as_path()));
|
vector.par_sort_unstable_by(|a, b| split_path_compare(a.path.as_path(), b.path.as_path()));
|
||||||
|
|
||||||
a.upgrade_in_event_loop(move |app| {
|
a.upgrade_in_event_loop(move |app| {
|
||||||
crate::connect_scan::write_temporary_files_results(&app, vector, messages);
|
write_temporary_files_results(&app, vector, messages);
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -663,7 +663,7 @@ fn write_temporary_files_results(app: &MainWindow, vector: Vec<TemporaryFileEntr
|
||||||
let items_found = vector.len();
|
let items_found = vector.len();
|
||||||
let items = Rc::new(VecModel::default());
|
let items = Rc::new(VecModel::default());
|
||||||
for fe in vector {
|
for fe in vector {
|
||||||
let (data_model_str, data_model_int) = crate::connect_scan::prepare_data_model_temporary_files(&fe);
|
let (data_model_str, data_model_int) = prepare_data_model_temporary_files(&fe);
|
||||||
insert_data_to_model(&items, data_model_str, data_model_int, None);
|
insert_data_to_model(&items, data_model_str, data_model_int, None);
|
||||||
}
|
}
|
||||||
app.set_temporary_files_model(items.into());
|
app.set_temporary_files_model(items.into());
|
||||||
|
@ -721,7 +721,7 @@ fn scan_broken_files(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>,
|
||||||
vector.par_sort_unstable_by(|a, b| split_path_compare(a.path.as_path(), b.path.as_path()));
|
vector.par_sort_unstable_by(|a, b| split_path_compare(a.path.as_path(), b.path.as_path()));
|
||||||
|
|
||||||
a.upgrade_in_event_loop(move |app| {
|
a.upgrade_in_event_loop(move |app| {
|
||||||
crate::connect_scan::write_broken_files_results(&app, vector, messages);
|
write_broken_files_results(&app, vector, messages);
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -730,7 +730,7 @@ fn write_broken_files_results(app: &MainWindow, vector: Vec<BrokenEntry>, messag
|
||||||
let items_found = vector.len();
|
let items_found = vector.len();
|
||||||
let items = Rc::new(VecModel::default());
|
let items = Rc::new(VecModel::default());
|
||||||
for fe in vector {
|
for fe in vector {
|
||||||
let (data_model_str, data_model_int) = crate::connect_scan::prepare_data_model_broken_files(&fe);
|
let (data_model_str, data_model_int) = prepare_data_model_broken_files(&fe);
|
||||||
insert_data_to_model(&items, data_model_str, data_model_int, None);
|
insert_data_to_model(&items, data_model_str, data_model_int, None);
|
||||||
}
|
}
|
||||||
app.set_broken_files_model(items.into());
|
app.set_broken_files_model(items.into());
|
||||||
|
@ -767,7 +767,7 @@ fn scan_bad_extensions(a: Weak<MainWindow>, progress_sender: Sender<ProgressData
|
||||||
vector.par_sort_unstable_by(|a, b| split_path_compare(a.path.as_path(), b.path.as_path()));
|
vector.par_sort_unstable_by(|a, b| split_path_compare(a.path.as_path(), b.path.as_path()));
|
||||||
|
|
||||||
a.upgrade_in_event_loop(move |app| {
|
a.upgrade_in_event_loop(move |app| {
|
||||||
crate::connect_scan::write_bad_extensions_results(&app, vector, messages);
|
write_bad_extensions_results(&app, vector, messages);
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
|
@ -226,6 +226,7 @@ mod tests {
|
||||||
model.push(MainListModel {
|
model.push(MainListModel {
|
||||||
checked: item.0,
|
checked: item.0,
|
||||||
header_row: item.1,
|
header_row: item.1,
|
||||||
|
full_header_row: false, // TODO - this needs to be calculated
|
||||||
selected_row: item.2,
|
selected_row: item.2,
|
||||||
val_str: ModelRc::new(all_items),
|
val_str: ModelRc::new(all_items),
|
||||||
val_int: ModelRc::new(VecModel::default()),
|
val_int: ModelRc::new(VecModel::default()),
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
use czkawka_core::big_file::SearchMode;
|
|
||||||
use image::imageops::FilterType;
|
|
||||||
use image_hasher::HashAlg;
|
|
||||||
use slint::{ComponentHandle, SharedString, VecModel};
|
use slint::{ComponentHandle, SharedString, VecModel};
|
||||||
|
|
||||||
use czkawka_core::common::get_all_available_threads;
|
use czkawka_core::common::get_all_available_threads;
|
||||||
|
|
|
@ -26,6 +26,8 @@ pub const DEFAULT_BIGGEST_FILES: i32 = 50;
|
||||||
pub const DEFAULT_IMAGE_SIMILARITY: i32 = 10;
|
pub const DEFAULT_IMAGE_SIMILARITY: i32 = 10;
|
||||||
pub const DEFAULT_VIDEO_SIMILARITY: i32 = 15;
|
pub const DEFAULT_VIDEO_SIMILARITY: i32 = 15;
|
||||||
pub const DEFAULT_HASH_SIZE: u8 = 16;
|
pub const DEFAULT_HASH_SIZE: u8 = 16;
|
||||||
|
pub const DEFAULT_MAXIMUM_DIFFERENCE_VALUE: f32 = 3.0;
|
||||||
|
pub const DEFAULT_MINIMAL_FRAGMENT_DURATION_VALUE: f32 = 5.0;
|
||||||
|
|
||||||
// (Hash size, Maximum difference) - Ehh... to simplify it, just use everywhere 40 as maximum similarity - for now I'm to lazy to change it, when hash size changes
|
// (Hash size, Maximum difference) - Ehh... to simplify it, just use everywhere 40 as maximum similarity - for now I'm to lazy to change it, when hash size changes
|
||||||
// So if you want to change it, you need to change it in multiple places
|
// So if you want to change it, you need to change it in multiple places
|
||||||
|
@ -129,6 +131,8 @@ pub struct SettingsCustom {
|
||||||
pub duplicates_sub_check_method: String,
|
pub duplicates_sub_check_method: String,
|
||||||
#[serde(default = "default_duplicates_hash_type")]
|
#[serde(default = "default_duplicates_hash_type")]
|
||||||
pub duplicates_sub_available_hash_type: String,
|
pub duplicates_sub_available_hash_type: String,
|
||||||
|
#[serde(default)]
|
||||||
|
pub duplicates_sub_name_case_sensitive: bool,
|
||||||
#[serde(default = "default_biggest_method")]
|
#[serde(default = "default_biggest_method")]
|
||||||
pub biggest_files_sub_method: String,
|
pub biggest_files_sub_method: String,
|
||||||
#[serde(default = "default_biggest_files")]
|
#[serde(default = "default_biggest_files")]
|
||||||
|
@ -153,6 +157,10 @@ pub struct SettingsCustom {
|
||||||
pub similar_music_sub_genre: bool,
|
pub similar_music_sub_genre: bool,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub similar_music_sub_length: bool,
|
pub similar_music_sub_length: bool,
|
||||||
|
#[serde(default = "default_maximum_difference_value")]
|
||||||
|
pub similar_music_sub_maximum_difference_value: f32,
|
||||||
|
#[serde(default = "default_minimal_fragment_duration_value")]
|
||||||
|
pub similar_music_sub_minimal_fragment_duration_value: f32,
|
||||||
#[serde(default = "ttrue")]
|
#[serde(default = "ttrue")]
|
||||||
pub broken_files_sub_audio: bool,
|
pub broken_files_sub_audio: bool,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
|
@ -434,6 +442,7 @@ pub fn set_settings_to_gui(app: &MainWindow, custom_settings: &SettingsCustom) {
|
||||||
settings.set_duplicate_minimal_hash_cache_size(custom_settings.duplicate_minimal_hash_cache_size.to_string().into());
|
settings.set_duplicate_minimal_hash_cache_size(custom_settings.duplicate_minimal_hash_cache_size.to_string().into());
|
||||||
settings.set_duplicate_minimal_prehash_cache_size(custom_settings.duplicate_minimal_prehash_cache_size.to_string().into());
|
settings.set_duplicate_minimal_prehash_cache_size(custom_settings.duplicate_minimal_prehash_cache_size.to_string().into());
|
||||||
settings.set_duplicate_delete_outdated_entries(custom_settings.duplicate_delete_outdated_entries);
|
settings.set_duplicate_delete_outdated_entries(custom_settings.duplicate_delete_outdated_entries);
|
||||||
|
settings.set_duplicates_sub_name_case_sensitive(custom_settings.duplicates_sub_name_case_sensitive);
|
||||||
settings.set_similar_images_show_image_preview(custom_settings.similar_images_show_image_preview);
|
settings.set_similar_images_show_image_preview(custom_settings.similar_images_show_image_preview);
|
||||||
settings.set_similar_images_delete_outdated_entries(custom_settings.similar_images_delete_outdated_entries);
|
settings.set_similar_images_delete_outdated_entries(custom_settings.similar_images_delete_outdated_entries);
|
||||||
settings.set_similar_videos_delete_outdated_entries(custom_settings.similar_videos_delete_outdated_entries);
|
settings.set_similar_videos_delete_outdated_entries(custom_settings.similar_videos_delete_outdated_entries);
|
||||||
|
@ -449,7 +458,6 @@ pub fn set_settings_to_gui(app: &MainWindow, custom_settings: &SettingsCustom) {
|
||||||
settings.set_similar_images_sub_hash_size_index(similar_images_sub_hash_size_idx as i32);
|
settings.set_similar_images_sub_hash_size_index(similar_images_sub_hash_size_idx as i32);
|
||||||
settings.set_similar_images_sub_hash_size_value(ALLOWED_HASH_SIZE_VALUES[similar_images_sub_hash_size_idx].1.to_string().into());
|
settings.set_similar_images_sub_hash_size_value(ALLOWED_HASH_SIZE_VALUES[similar_images_sub_hash_size_idx].1.to_string().into());
|
||||||
// TODO all items with _value are not necessary, but due bug in slint are required, because combobox is not updated properly
|
// TODO all items with _value are not necessary, but due bug in slint are required, because combobox is not updated properly
|
||||||
|
|
||||||
let similar_images_sub_hash_alg_idx = get_image_hash_alg_idx(&custom_settings.similar_images_sub_hash_alg).unwrap_or_else(|| {
|
let similar_images_sub_hash_alg_idx = get_image_hash_alg_idx(&custom_settings.similar_images_sub_hash_alg).unwrap_or_else(|| {
|
||||||
warn!(
|
warn!(
|
||||||
"Value of hash type \"{}\" is invalid, setting it to default value",
|
"Value of hash type \"{}\" is invalid, setting it to default value",
|
||||||
|
@ -458,7 +466,6 @@ pub fn set_settings_to_gui(app: &MainWindow, custom_settings: &SettingsCustom) {
|
||||||
0
|
0
|
||||||
});
|
});
|
||||||
settings.set_similar_images_sub_hash_alg_index(similar_images_sub_hash_alg_idx as i32);
|
settings.set_similar_images_sub_hash_alg_index(similar_images_sub_hash_alg_idx as i32);
|
||||||
|
|
||||||
let similar_images_sub_resize_algorithm_idx = get_resize_algorithm_idx(&custom_settings.similar_images_sub_resize_algorithm).unwrap_or_else(|| {
|
let similar_images_sub_resize_algorithm_idx = get_resize_algorithm_idx(&custom_settings.similar_images_sub_resize_algorithm).unwrap_or_else(|| {
|
||||||
warn!(
|
warn!(
|
||||||
"Value of resize algorithm \"{}\" is invalid, setting it to default value",
|
"Value of resize algorithm \"{}\" is invalid, setting it to default value",
|
||||||
|
@ -468,7 +475,6 @@ pub fn set_settings_to_gui(app: &MainWindow, custom_settings: &SettingsCustom) {
|
||||||
});
|
});
|
||||||
settings.set_similar_images_sub_resize_algorithm_index(similar_images_sub_resize_algorithm_idx as i32);
|
settings.set_similar_images_sub_resize_algorithm_index(similar_images_sub_resize_algorithm_idx as i32);
|
||||||
settings.set_similar_images_sub_resize_algorithm_value(ALLOWED_RESIZE_ALGORITHM_VALUES[similar_images_sub_resize_algorithm_idx].1.to_string().into());
|
settings.set_similar_images_sub_resize_algorithm_value(ALLOWED_RESIZE_ALGORITHM_VALUES[similar_images_sub_resize_algorithm_idx].1.to_string().into());
|
||||||
|
|
||||||
settings.set_similar_images_sub_ignore_same_size(custom_settings.similar_images_sub_ignore_same_size);
|
settings.set_similar_images_sub_ignore_same_size(custom_settings.similar_images_sub_ignore_same_size);
|
||||||
settings.set_similar_images_sub_max_similarity(40.0);
|
settings.set_similar_images_sub_max_similarity(40.0);
|
||||||
settings.set_similar_images_sub_current_similarity(custom_settings.similar_images_sub_similarity as f32);
|
settings.set_similar_images_sub_current_similarity(custom_settings.similar_images_sub_similarity as f32);
|
||||||
|
@ -525,6 +531,8 @@ pub fn set_settings_to_gui(app: &MainWindow, custom_settings: &SettingsCustom) {
|
||||||
settings.set_similar_music_sub_bitrate(custom_settings.similar_music_sub_bitrate);
|
settings.set_similar_music_sub_bitrate(custom_settings.similar_music_sub_bitrate);
|
||||||
settings.set_similar_music_sub_genre(custom_settings.similar_music_sub_genre);
|
settings.set_similar_music_sub_genre(custom_settings.similar_music_sub_genre);
|
||||||
settings.set_similar_music_sub_length(custom_settings.similar_music_sub_length);
|
settings.set_similar_music_sub_length(custom_settings.similar_music_sub_length);
|
||||||
|
settings.set_similar_music_sub_maximum_difference_value(custom_settings.similar_music_sub_maximum_difference_value);
|
||||||
|
settings.set_similar_music_sub_minimal_fragment_duration_value(custom_settings.similar_music_sub_minimal_fragment_duration_value);
|
||||||
|
|
||||||
settings.set_broken_files_sub_audio(custom_settings.broken_files_sub_audio);
|
settings.set_broken_files_sub_audio(custom_settings.broken_files_sub_audio);
|
||||||
settings.set_broken_files_sub_pdf(custom_settings.broken_files_sub_pdf);
|
settings.set_broken_files_sub_pdf(custom_settings.broken_files_sub_pdf);
|
||||||
|
@ -571,6 +579,7 @@ pub fn collect_settings(app: &MainWindow) -> SettingsCustom {
|
||||||
.parse::<i32>()
|
.parse::<i32>()
|
||||||
.unwrap_or(DEFAULT_MINIMUM_PREHASH_CACHE_SIZE);
|
.unwrap_or(DEFAULT_MINIMUM_PREHASH_CACHE_SIZE);
|
||||||
let duplicate_delete_outdated_entries = settings.get_duplicate_delete_outdated_entries();
|
let duplicate_delete_outdated_entries = settings.get_duplicate_delete_outdated_entries();
|
||||||
|
let duplicates_sub_name_case_sensitive = settings.get_duplicates_sub_name_case_sensitive();
|
||||||
|
|
||||||
let similar_images_show_image_preview = settings.get_similar_images_show_image_preview();
|
let similar_images_show_image_preview = settings.get_similar_images_show_image_preview();
|
||||||
let similar_images_delete_outdated_entries = settings.get_similar_images_delete_outdated_entries();
|
let similar_images_delete_outdated_entries = settings.get_similar_images_delete_outdated_entries();
|
||||||
|
@ -609,6 +618,8 @@ pub fn collect_settings(app: &MainWindow) -> SettingsCustom {
|
||||||
let similar_music_sub_bitrate = settings.get_similar_music_sub_bitrate();
|
let similar_music_sub_bitrate = settings.get_similar_music_sub_bitrate();
|
||||||
let similar_music_sub_genre = settings.get_similar_music_sub_genre();
|
let similar_music_sub_genre = settings.get_similar_music_sub_genre();
|
||||||
let similar_music_sub_length = settings.get_similar_music_sub_length();
|
let similar_music_sub_length = settings.get_similar_music_sub_length();
|
||||||
|
let similar_music_sub_maximum_difference_value = settings.get_similar_music_sub_maximum_difference_value();
|
||||||
|
let similar_music_sub_minimal_fragment_duration_value = settings.get_similar_music_sub_minimal_fragment_duration_value();
|
||||||
|
|
||||||
let broken_files_sub_audio = settings.get_broken_files_sub_audio();
|
let broken_files_sub_audio = settings.get_broken_files_sub_audio();
|
||||||
let broken_files_sub_pdf = settings.get_broken_files_sub_pdf();
|
let broken_files_sub_pdf = settings.get_broken_files_sub_pdf();
|
||||||
|
@ -647,6 +658,7 @@ pub fn collect_settings(app: &MainWindow) -> SettingsCustom {
|
||||||
similar_images_sub_similarity,
|
similar_images_sub_similarity,
|
||||||
duplicates_sub_check_method,
|
duplicates_sub_check_method,
|
||||||
duplicates_sub_available_hash_type,
|
duplicates_sub_available_hash_type,
|
||||||
|
duplicates_sub_name_case_sensitive,
|
||||||
biggest_files_sub_method,
|
biggest_files_sub_method,
|
||||||
biggest_files_sub_number_of_files,
|
biggest_files_sub_number_of_files,
|
||||||
similar_videos_sub_ignore_same_size,
|
similar_videos_sub_ignore_same_size,
|
||||||
|
@ -659,6 +671,8 @@ pub fn collect_settings(app: &MainWindow) -> SettingsCustom {
|
||||||
similar_music_sub_bitrate,
|
similar_music_sub_bitrate,
|
||||||
similar_music_sub_genre,
|
similar_music_sub_genre,
|
||||||
similar_music_sub_length,
|
similar_music_sub_length,
|
||||||
|
similar_music_sub_maximum_difference_value,
|
||||||
|
similar_music_sub_minimal_fragment_duration_value,
|
||||||
broken_files_sub_audio,
|
broken_files_sub_audio,
|
||||||
broken_files_sub_pdf,
|
broken_files_sub_pdf,
|
||||||
broken_files_sub_archive,
|
broken_files_sub_archive,
|
||||||
|
@ -704,6 +718,12 @@ fn default_excluded_directories() -> Vec<PathBuf> {
|
||||||
fn default_duplicates_check_method() -> String {
|
fn default_duplicates_check_method() -> String {
|
||||||
ALLOWED_DUPLICATES_CHECK_METHOD_VALUES[0].0.to_string()
|
ALLOWED_DUPLICATES_CHECK_METHOD_VALUES[0].0.to_string()
|
||||||
}
|
}
|
||||||
|
fn default_maximum_difference_value() -> f32 {
|
||||||
|
DEFAULT_MAXIMUM_DIFFERENCE_VALUE
|
||||||
|
}
|
||||||
|
fn default_minimal_fragment_duration_value() -> f32 {
|
||||||
|
DEFAULT_MINIMAL_FRAGMENT_DURATION_VALUE
|
||||||
|
}
|
||||||
fn default_duplicates_hash_type() -> String {
|
fn default_duplicates_hash_type() -> String {
|
||||||
ALLOWED_DUPLICATES_HASH_TYPE_VALUES[0].0.to_string()
|
ALLOWED_DUPLICATES_HASH_TYPE_VALUES[0].0.to_string()
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,8 @@ export global Settings {
|
||||||
in-out property <[string]> duplicates_sub_available_hash_type: ["Blake3", "CRC32", "XXH3"];
|
in-out property <[string]> duplicates_sub_available_hash_type: ["Blake3", "CRC32", "XXH3"];
|
||||||
in-out property <int> duplicates_sub_available_hash_type_index: 0;
|
in-out property <int> duplicates_sub_available_hash_type_index: 0;
|
||||||
in-out property <string> duplicates_sub_available_hash_type_value: "Blake3";
|
in-out property <string> duplicates_sub_available_hash_type_value: "Blake3";
|
||||||
|
in-out property <bool> duplicates_sub_name_case_sensitive: false;
|
||||||
|
|
||||||
|
|
||||||
// Big files
|
// Big files
|
||||||
in-out property <[string]> biggest_files_sub_method: ["The Biggest", "The Smallest"];
|
in-out property <[string]> biggest_files_sub_method: ["The Biggest", "The Smallest"];
|
||||||
|
@ -84,6 +86,10 @@ export global Settings {
|
||||||
in-out property <bool> similar_music_sub_bitrate: false;
|
in-out property <bool> similar_music_sub_bitrate: false;
|
||||||
in-out property <bool> similar_music_sub_genre: false;
|
in-out property <bool> similar_music_sub_genre: false;
|
||||||
in-out property <bool> similar_music_sub_length: false;
|
in-out property <bool> similar_music_sub_length: false;
|
||||||
|
in-out property <float> similar_music_sub_minimal_fragment_duration_value: 5.0;
|
||||||
|
in-out property <float> similar_music_sub_minimal_fragment_duration_max: 180.0;
|
||||||
|
in-out property <float> similar_music_sub_maximum_difference_value: 3.0;
|
||||||
|
in-out property <float> similar_music_sub_maximum_difference_max: 10.0;
|
||||||
|
|
||||||
// Broken Files
|
// Broken Files
|
||||||
in-out property <bool> broken_files_sub_audio: true;
|
in-out property <bool> broken_files_sub_audio: true;
|
||||||
|
|
|
@ -118,6 +118,10 @@ export component ToolSettings {
|
||||||
current_index <=> Settings.duplicates_sub_available_hash_type_index;
|
current_index <=> Settings.duplicates_sub_available_hash_type_index;
|
||||||
current_value <=> Settings.duplicates_sub_available_hash_type_value;
|
current_value <=> Settings.duplicates_sub_available_hash_type_value;
|
||||||
}
|
}
|
||||||
|
CheckBoxWrapper {
|
||||||
|
text: "Case Sensitive(only name modes)";
|
||||||
|
checked <=> Settings.duplicates_sub_name_case_sensitive;
|
||||||
|
}
|
||||||
Rectangle {}
|
Rectangle {}
|
||||||
}
|
}
|
||||||
VerticalLayout {
|
VerticalLayout {
|
||||||
|
@ -166,37 +170,60 @@ export component ToolSettings {
|
||||||
current_index <=> Settings.similar_music_sub_audio_check_type_index;
|
current_index <=> Settings.similar_music_sub_audio_check_type_index;
|
||||||
current_value <=> Settings.similar_music_sub_audio_check_type_value;
|
current_value <=> Settings.similar_music_sub_audio_check_type_value;
|
||||||
}
|
}
|
||||||
CheckBoxWrapper {
|
// A little bit of a hack
|
||||||
text: "Approximate Tag Comparison";
|
// Mode should be set with a enum, not index, but it's not possible in slint(maybe yet)
|
||||||
checked <=> Settings.similar_music_sub_approximate_comparison;
|
if Settings.similar_music_sub_audio_check_type_index == 0: VerticalLayout {
|
||||||
|
spacing: 5px;
|
||||||
|
CheckBoxWrapper {
|
||||||
|
text: "Approximate Tag Comparison";
|
||||||
|
checked <=> Settings.similar_music_sub_approximate_comparison;
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "Compared tags";
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
CheckBoxWrapper {
|
||||||
|
text: "Title";
|
||||||
|
checked <=> Settings.similar_music_sub_title;
|
||||||
|
}
|
||||||
|
CheckBoxWrapper {
|
||||||
|
text: "Artist";
|
||||||
|
checked <=> Settings.similar_music_sub_artist;
|
||||||
|
}
|
||||||
|
CheckBoxWrapper {
|
||||||
|
text: "Bitrate";
|
||||||
|
checked <=> Settings.similar_music_sub_bitrate;
|
||||||
|
}
|
||||||
|
CheckBoxWrapper {
|
||||||
|
text: "Genre";
|
||||||
|
checked <=> Settings.similar_music_sub_genre;
|
||||||
|
}
|
||||||
|
CheckBoxWrapper {
|
||||||
|
text: "Year";
|
||||||
|
checked <=> Settings.similar_music_sub_year;
|
||||||
|
}
|
||||||
|
CheckBoxWrapper {
|
||||||
|
text: "Length";
|
||||||
|
checked <=> Settings.similar_music_sub_length;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Text {
|
if Settings.similar_music_sub_audio_check_type_index == 1: VerticalLayout {
|
||||||
text: "Compared tags";
|
spacing: 5px;
|
||||||
font-size: 12px;
|
SliderWrapper {
|
||||||
}
|
text: "Max difference";
|
||||||
CheckBoxWrapper {
|
end_text: "(" + round(Settings.similar_music_sub_maximum_difference_value) + "/" + round(Settings.similar_music_sub_maximum_difference_max) + ")";
|
||||||
text: "Title";
|
end_text_size: 40px;
|
||||||
checked <=> Settings.similar_music_sub_title;
|
maximum <=> Settings.similar_music_sub_maximum_difference_max;
|
||||||
}
|
value <=> Settings.similar_music_sub_maximum_difference_value;
|
||||||
CheckBoxWrapper {
|
}
|
||||||
text: "Artist";
|
SliderWrapper {
|
||||||
checked <=> Settings.similar_music_sub_artist;
|
text: "Minimal fragment duration";
|
||||||
}
|
end_text: round(Settings.similar_music_sub_minimal_fragment_duration_value);
|
||||||
CheckBoxWrapper {
|
end_text_size: 40px;
|
||||||
text: "Bitrate";
|
maximum <=> Settings.similar_music_sub_minimal_fragment_duration_max;
|
||||||
checked <=> Settings.similar_music_sub_bitrate;
|
value <=> Settings.similar_music_sub_minimal_fragment_duration_value;
|
||||||
}
|
}
|
||||||
CheckBoxWrapper {
|
|
||||||
text: "Genre";
|
|
||||||
checked <=> Settings.similar_music_sub_genre;
|
|
||||||
}
|
|
||||||
CheckBoxWrapper {
|
|
||||||
text: "Year";
|
|
||||||
checked <=> Settings.similar_music_sub_year;
|
|
||||||
}
|
|
||||||
CheckBoxWrapper {
|
|
||||||
text: "Length";
|
|
||||||
checked <=> Settings.similar_music_sub_length;
|
|
||||||
}
|
}
|
||||||
Rectangle {}
|
Rectangle {}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue