From e268afbc4b794827f68bbe41e50b24b7cddc0b82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= Date: Sat, 17 Feb 2024 13:11:07 +0100 Subject: [PATCH] Names --- czkawka_core/src/common_dir_traversal.rs | 4 +- czkawka_gui/src/compute_results.rs | 2 +- .../connect_things/connect_button_search.rs | 6 +- .../connect_things/connect_progress_window.rs | 4 +- .../connect_selection_of_directories.rs | 2 +- krokiet/src/connect_progress_receiver.rs | 4 +- krokiet/src/connect_scan.rs | 28 +++--- krokiet/src/model_operations.rs | 1 + krokiet/src/set_initial_gui_info.rs | 3 - krokiet/src/settings.rs | 26 +++++- krokiet/ui/settings.slint | 6 ++ krokiet/ui/tool_settings.slint | 87 ++++++++++++------- 12 files changed, 111 insertions(+), 62 deletions(-) diff --git a/czkawka_core/src/common_dir_traversal.rs b/czkawka_core/src/common_dir_traversal.rs index 1f02457..218b8a8 100644 --- a/czkawka_core/src/common_dir_traversal.rs +++ b/czkawka_core/src/common_dir_traversal.rs @@ -328,7 +328,7 @@ where { #[fun_time(message = "run(collecting files/dirs)", level = "debug")] pub fn run(self) -> DirTraversalResult { - 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 grouped_file_entries: BTreeMap> = BTreeMap::new(); @@ -766,7 +766,6 @@ mod tests { } #[cfg(target_family = "unix")] - #[ignore] // Flaky test #[test] fn test_traversal_group_by_inode() -> io::Result<()> { let dir = tempfile::Builder::new().tempdir()?; @@ -808,7 +807,6 @@ mod tests { } #[cfg(target_family = "windows")] - #[ignore] // Flaky test #[test] fn test_traversal_group_by_inode() -> io::Result<()> { let dir = tempfile::Builder::new().tempdir()?; diff --git a/czkawka_gui/src/compute_results.rs b/czkawka_gui/src/compute_results.rs index e77fdbb..7959d31 100644 --- a/czkawka_gui/src/compute_results.rs +++ b/czkawka_gui/src/compute_results.rs @@ -1296,7 +1296,7 @@ where fn vector_sort_simple_unstable_entry_by_path(vector: &[T]) -> Vec where T: ResultEntry + Clone, - T: std::marker::Send, + T: Send, { let mut vector = vector.to_vec(); vector.par_sort_unstable_by(|a, b| split_path_compare(a.get_path(), b.get_path())); diff --git a/czkawka_gui/src/connect_things/connect_button_search.rs b/czkawka_gui/src/connect_things/connect_button_search.rs index d648fb7..4108d74 100644 --- a/czkawka_gui/src/connect_things/connect_button_search.rs +++ b/czkawka_gui/src/connect_things/connect_button_search.rs @@ -77,8 +77,8 @@ pub fn connect_button_search(gui_data: &GuiData, result_sender: Sender, entry_info.set_text(&flg!("searching_for_data")); // Resets progress bars - progress_bar_all_stages.set_fraction(0 as f64); - progress_bar_current_stage.set_fraction(0 as f64); + progress_bar_all_stages.set_fraction(0f64); + progress_bar_current_stage.set_fraction(0f64); reset_text_view(&text_view_errors); @@ -162,7 +162,7 @@ impl LoadedCommonItems { .as_str() .to_string() .split(',') - .map(std::string::ToString::to_string) + .map(ToString::to_string) .collect::>(); let allowed_extensions = entry_allowed_extensions.text().as_str().to_string(); let excluded_extensions = entry_excluded_extensions.text().as_str().to_string(); diff --git a/czkawka_gui/src/connect_things/connect_progress_window.rs b/czkawka_gui/src/connect_things/connect_progress_window.rs index 09c5e08..9121842 100644 --- a/czkawka_gui/src/connect_things/connect_progress_window.rs +++ b/czkawka_gui/src/connect_things/connect_progress_window.rs @@ -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>) { 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 }; 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( ((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, diff --git a/czkawka_gui/src/connect_things/connect_selection_of_directories.rs b/czkawka_gui/src/connect_things/connect_selection_of_directories.rs index 93074fd..daeb6cc 100644 --- a/czkawka_gui/src/connect_things/connect_selection_of_directories.rs +++ b/czkawka_gui/src/connect_things/connect_selection_of_directories.rs @@ -212,7 +212,7 @@ fn add_manually_directories(window_main: &Window, tree_view: &TreeView, excluded let list_store = get_list_store(&tree_view); 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)]; list_store.set(&list_store.append(), &values); } diff --git a/krokiet/src/connect_progress_receiver.rs b/krokiet/src/connect_progress_receiver.rs index 4ba4f3c..efc611e 100644 --- a/krokiet/src/connect_progress_receiver.rs +++ b/krokiet/src/connect_progress_receiver.rs @@ -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 fn common_get_data(item: &ProgressData) -> (i32, i32) { 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 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 }; ((all_stages * 100.0) as i32, (current_stage * 100.0) as i32) } else { diff --git a/krokiet/src/connect_scan.rs b/krokiet/src/connect_scan.rs index ac1e01a..5da7888 100644 --- a/krokiet/src/connect_scan.rs +++ b/krokiet/src/connect_scan.rs @@ -105,7 +105,7 @@ fn scan_duplicates(a: Weak, progress_sender: Sender, s // finder.set_ignore_hard_links(custom_settings.ignore); // TODO finder.set_use_prehash_cache(custom_settings.duplicate_use_prehash); 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)); let messages = finder.get_text_messages().create_messages_text(); @@ -396,7 +396,7 @@ fn write_similar_images_results(app: &MainWindow, vector: Vec<(Option().set_info_text(messages.into()); } fn prepare_data_model_similar_images(fe: &ImagesEntry, hash_size: u8) -> (ModelRc, ModelRc) { @@ -470,7 +470,7 @@ fn write_similar_videos_results(app: &MainWindow, vector: Vec<(Option().set_info_text(messages.into()); } fn prepare_data_model_similar_videos(fe: &VideosEntry) -> (ModelRc, ModelRc) { @@ -523,8 +523,8 @@ fn scan_similar_music(a: Weak, progress_sender: Sender } finder.set_music_similarity(music_similarity); - // finder.set_maximum_difference(custom_settings.mus); // TODO - // finder.set_minimum_segment_duration(minimum_segment_duration); // TODO + finder.set_maximum_difference(custom_settings.similar_music_sub_maximum_difference_value as f64); + 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; finder.set_check_type(audio_check_type); finder.set_approximate_comparison(custom_settings.similar_music_sub_approximate_comparison); @@ -549,7 +549,7 @@ fn scan_similar_music(a: Weak, progress_sender: Sender } 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(); @@ -559,14 +559,14 @@ fn write_similar_music_results(app: &MainWindow, vector: Vec<(Option let items = Rc::new(VecModel::default()); for (ref_fe, vec_fe) in vector { 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)); } else { insert_data_to_model(&items, ModelRc::new(VecModel::default()), ModelRc::new(VecModel::default()), Some(false)); } 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); } } @@ -618,7 +618,7 @@ fn write_invalid_symlinks_results(app: &MainWindow, vector: Vec, progress_sender: Sender, progress_sender: Sender, 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| { - crate::connect_scan::write_broken_files_results(&app, vector, messages); + write_broken_files_results(&app, vector, messages); }) }) .unwrap(); @@ -730,7 +730,7 @@ fn write_broken_files_results(app: &MainWindow, vector: Vec, messag let items_found = vector.len(); let items = Rc::new(VecModel::default()); 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); } app.set_broken_files_model(items.into()); @@ -767,7 +767,7 @@ fn scan_bad_extensions(a: Weak, progress_sender: Sender SettingsCustom { .parse::() .unwrap_or(DEFAULT_MINIMUM_PREHASH_CACHE_SIZE); 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_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_genre = settings.get_similar_music_sub_genre(); 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_pdf = settings.get_broken_files_sub_pdf(); @@ -647,6 +658,7 @@ pub fn collect_settings(app: &MainWindow) -> SettingsCustom { similar_images_sub_similarity, duplicates_sub_check_method, duplicates_sub_available_hash_type, + duplicates_sub_name_case_sensitive, biggest_files_sub_method, biggest_files_sub_number_of_files, similar_videos_sub_ignore_same_size, @@ -659,6 +671,8 @@ pub fn collect_settings(app: &MainWindow) -> SettingsCustom { similar_music_sub_bitrate, similar_music_sub_genre, similar_music_sub_length, + similar_music_sub_maximum_difference_value, + similar_music_sub_minimal_fragment_duration_value, broken_files_sub_audio, broken_files_sub_pdf, broken_files_sub_archive, @@ -704,6 +718,12 @@ fn default_excluded_directories() -> Vec { fn default_duplicates_check_method() -> 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 { ALLOWED_DUPLICATES_HASH_TYPE_VALUES[0].0.to_string() } diff --git a/krokiet/ui/settings.slint b/krokiet/ui/settings.slint index 8ec6186..d0309ad 100644 --- a/krokiet/ui/settings.slint +++ b/krokiet/ui/settings.slint @@ -61,6 +61,8 @@ export global Settings { in-out property <[string]> duplicates_sub_available_hash_type: ["Blake3", "CRC32", "XXH3"]; in-out property duplicates_sub_available_hash_type_index: 0; in-out property duplicates_sub_available_hash_type_value: "Blake3"; + in-out property duplicates_sub_name_case_sensitive: false; + // Big files in-out property <[string]> biggest_files_sub_method: ["The Biggest", "The Smallest"]; @@ -84,6 +86,10 @@ export global Settings { in-out property similar_music_sub_bitrate: false; in-out property similar_music_sub_genre: false; in-out property similar_music_sub_length: false; + in-out property similar_music_sub_minimal_fragment_duration_value: 5.0; + in-out property similar_music_sub_minimal_fragment_duration_max: 180.0; + in-out property similar_music_sub_maximum_difference_value: 3.0; + in-out property similar_music_sub_maximum_difference_max: 10.0; // Broken Files in-out property broken_files_sub_audio: true; diff --git a/krokiet/ui/tool_settings.slint b/krokiet/ui/tool_settings.slint index 4fd9e71..83d3d56 100644 --- a/krokiet/ui/tool_settings.slint +++ b/krokiet/ui/tool_settings.slint @@ -118,6 +118,10 @@ export component ToolSettings { current_index <=> Settings.duplicates_sub_available_hash_type_index; current_value <=> Settings.duplicates_sub_available_hash_type_value; } + CheckBoxWrapper { + text: "Case Sensitive(only name modes)"; + checked <=> Settings.duplicates_sub_name_case_sensitive; + } Rectangle {} } VerticalLayout { @@ -166,37 +170,60 @@ export component ToolSettings { current_index <=> Settings.similar_music_sub_audio_check_type_index; current_value <=> Settings.similar_music_sub_audio_check_type_value; } - CheckBoxWrapper { - text: "Approximate Tag Comparison"; - checked <=> Settings.similar_music_sub_approximate_comparison; + // A little bit of a hack + // Mode should be set with a enum, not index, but it's not possible in slint(maybe yet) + 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 { - 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; + if Settings.similar_music_sub_audio_check_type_index == 1: VerticalLayout { + spacing: 5px; + SliderWrapper { + text: "Max difference"; + end_text: "(" + round(Settings.similar_music_sub_maximum_difference_value) + "/" + round(Settings.similar_music_sub_maximum_difference_max) + ")"; + end_text_size: 40px; + maximum <=> Settings.similar_music_sub_maximum_difference_max; + value <=> Settings.similar_music_sub_maximum_difference_value; + } + SliderWrapper { + text: "Minimal fragment duration"; + end_text: round(Settings.similar_music_sub_minimal_fragment_duration_value); + end_text_size: 40px; + maximum <=> Settings.similar_music_sub_minimal_fragment_duration_max; + value <=> Settings.similar_music_sub_minimal_fragment_duration_value; + } + } Rectangle {} }