diff --git a/krokiet/src/connect_scan.rs b/krokiet/src/connect_scan.rs index 8f7e58b..5e210bc 100644 --- a/krokiet/src/connect_scan.rs +++ b/krokiet/src/connect_scan.rs @@ -1,4 +1,3 @@ -use crate::common::create_vec_model_from_vec_string; use crate::settings::{collect_settings, SettingsCustom}; use crate::{CurrentTab, GuiState, MainListModel, MainWindow, ProgressToSend}; use chrono::NaiveDateTime; @@ -54,8 +53,7 @@ fn scan_similar_images(a: Weak, progress_sender: Sender, progress_sender: Sender, progress_sender: Sender, .stack_size(DEFAULT_THREAD_SIZE) .spawn(move || { let mut finder = EmptyFiles::new(); - finder.set_included_directory(custom_settings.included_directories.clone()); - finder.set_excluded_directory(custom_settings.excluded_directories.clone()); + set_common_settings(&mut finder, &custom_settings); finder.find_empty_files(Some(&stop_receiver), Some(&progress_sender)); let mut vector = finder.get_empty_files().clone(); @@ -128,18 +114,12 @@ fn scan_empty_files(a: Weak, progress_sender: Sender, for fe in vector { let (directory, file) = split_path(fe.get_path()); let data_model = VecModel::from_slice(&[ - SharedString::from(file), - SharedString::from(directory), - SharedString::from(NaiveDateTime::from_timestamp_opt(fe.get_modified_date() as i64, 0).unwrap().to_string()), + file.into(), + directory.into(), + NaiveDateTime::from_timestamp_opt(fe.get_modified_date() as i64, 0).unwrap().to_string().into(), ]); - let main = MainListModel { - checked: false, - header_row: false, - selected_row: false, - val: ModelRc::new(data_model), - }; - items.push(main); + insert_data_to_model(&items, data_model, false); } app.set_empty_files_model(items.into()); app.invoke_scan_ended(format!("Found {} empty files", number_of_empty_files).into()); @@ -154,8 +134,7 @@ fn scan_empty_folders(a: Weak, progress_sender: Sender .stack_size(DEFAULT_THREAD_SIZE) .spawn(move || { let mut finder = EmptyFolder::new(); - finder.set_included_directory(custom_settings.included_directories.clone()); - finder.set_excluded_directory(custom_settings.excluded_directories.clone()); + set_common_settings(&mut finder, &custom_settings); finder.find_empty_folders(Some(&stop_receiver), Some(&progress_sender)); let mut vector = finder.get_empty_folder_list().keys().cloned().collect::>(); @@ -172,18 +151,12 @@ fn scan_empty_folders(a: Weak, progress_sender: Sender for path in vector { let (directory, file) = split_path(&path); let data_model = VecModel::from_slice(&[ - SharedString::from(file), - SharedString::from(directory), - SharedString::from(NaiveDateTime::from_timestamp_opt(folder_map[&path].modified_date as i64, 0).unwrap().to_string()), + file.into(), + directory.into(), + NaiveDateTime::from_timestamp_opt(folder_map[&path].modified_date as i64, 0).unwrap().to_string().into(), ]); - let main = MainListModel { - checked: false, - header_row: false, - selected_row: false, - val: ModelRc::new(data_model), - }; - items.push(main); + insert_data_to_model(&items, data_model, false); } app.set_empty_folder_model(items.into()); app.invoke_scan_ended(format!("Found {} empty folders", folder_map.len()).into()); @@ -192,3 +165,26 @@ fn scan_empty_folders(a: Weak, progress_sender: Sender }) .unwrap(); } + +fn insert_data_to_model(items: &Rc>, data_model: ModelRc, header_row: bool) { + let main = MainListModel { + checked: false, + header_row, + selected_row: false, + val: ModelRc::new(data_model), + }; + items.push(main); +} + +fn set_common_settings(component: &mut T, custom_settings: &SettingsCustom) +where + T: CommonData, +{ + component.set_included_directory(custom_settings.included_directories.clone()); + component.set_excluded_directory(custom_settings.excluded_directories.clone()); + component.set_recursive_search(true); // TODO bind + component.set_minimal_file_size(custom_settings.minimum_file_size as u64 * 1024); + component.set_minimal_file_size(custom_settings.maximum_file_size as u64 * 1024); + component.set_allowed_extensions(custom_settings.allowed_extensions.clone()); + component.set_excluded_items(custom_settings.excluded_items.split(',').map(str::to_string).collect()); +} diff --git a/krokiet/src/settings.rs b/krokiet/src/settings.rs index f69cd96..9db4efc 100644 --- a/krokiet/src/settings.rs +++ b/krokiet/src/settings.rs @@ -12,6 +12,9 @@ use log::{debug, error, info}; use serde::{Deserialize, Serialize}; use slint::{ComponentHandle, Model, ModelRc}; +pub const DEFAULT_MINIMUM_SIZE: i32 = 16 * 1024; +pub const DEFAULT_MAXIMUM_SIZE: i32 = i32::MAX; + #[derive(Debug, Clone, Serialize, Deserialize)] pub struct SettingsCustom { #[serde(default = "default_included_directories")] @@ -133,7 +136,7 @@ pub fn create_default_settings_files() { pub fn load_settings_from_file(app: &MainWindow) { let result_base_settings = load_data_from_file::(get_base_config_file()); - let base_settings; + let mut base_settings; if let Ok(base_settings_temp) = result_base_settings { base_settings = base_settings_temp; } else { @@ -151,6 +154,18 @@ pub fn load_settings_from_file(app: &MainWindow) { custom_settings = SettingsCustom::default(); } + // Validate here values and set "proper" + // preset_names should have 10 items + if base_settings.preset_names.len() > 10 { + base_settings.preset_names.truncate(10); + } else if base_settings.preset_names.len() < 10 { + while base_settings.preset_names.len() < 10 { + base_settings.preset_names.push(format!("Preset {}", base_settings.preset_names.len() + 1)); + } + } + base_settings.default_preset = max(min(base_settings.default_preset, 9), 0); + + // Ended validating set_settings_to_gui(app, &custom_settings); set_base_settings_to_gui(app, &base_settings); } @@ -241,8 +256,6 @@ pub fn get_base_config_file() -> Option { Some(base_config_file) } pub fn get_config_file(number: i32) -> Option { - let number = max(min(number, 9), 0); - let Some(configs) = ProjectDirs::from("pl", "Qarmin", "Krokiet") else { return None; }; @@ -270,8 +283,8 @@ pub fn set_settings_to_gui(app: &MainWindow, custom_settings: &SettingsCustom) { settings.set_excluded_items(custom_settings.excluded_items.clone().into()); settings.set_allowed_extensions(custom_settings.allowed_extensions.clone().into()); - settings.set_minimum_file_size(custom_settings.minimum_file_size); - settings.set_maximum_file_size(custom_settings.maximum_file_size); + settings.set_minimum_file_size(custom_settings.minimum_file_size.to_string().into()); + settings.set_maximum_file_size(custom_settings.maximum_file_size.to_string().into()); // Clear text app.global::().set_info_text("".into()); @@ -288,8 +301,8 @@ pub fn collect_settings(app: &MainWindow) -> SettingsCustom { let excluded_items = settings.get_excluded_items().to_string(); let allowed_extensions = settings.get_allowed_extensions().to_string(); - let minimum_file_size = settings.get_minimum_file_size(); - let maximum_file_size = settings.get_maximum_file_size(); + let minimum_file_size = settings.get_minimum_file_size().parse::().unwrap_or(DEFAULT_MINIMUM_SIZE); + let maximum_file_size = settings.get_maximum_file_size().parse::().unwrap_or(DEFAULT_MAXIMUM_SIZE); SettingsCustom { included_directories, @@ -364,8 +377,8 @@ fn default_preset_names() -> Vec { } fn minimum_file_size() -> i32 { - 16 + DEFAULT_MINIMUM_SIZE } fn maximum_file_size() -> i32 { - i32::MAX + DEFAULT_MAXIMUM_SIZE } diff --git a/krokiet/ui/action_buttons.slint b/krokiet/ui/action_buttons.slint index 56b5070..645447a 100644 --- a/krokiet/ui/action_buttons.slint +++ b/krokiet/ui/action_buttons.slint @@ -30,7 +30,7 @@ export component ActionButtons inherits HorizontalLayout { Rectangle { scan_button := Button { height: parent.height; - enabled: !scanning; + enabled: !scanning && active-tab != CurrentTab.Settings; visible: !scanning; text: "Scan"; clicked => { diff --git a/krokiet/ui/settings.slint b/krokiet/ui/settings.slint index d33707c..d2f5d80 100644 --- a/krokiet/ui/settings.slint +++ b/krokiet/ui/settings.slint @@ -8,7 +8,7 @@ export global Settings { // Settings in-out property excluded_items: "Excluded items"; in-out property allowed_extensions: "Allowed extensions"; - in-out property minimum_file_size: 0; - in-out property maximum_file_size: 0; + in-out property minimum_file_size: 0; + in-out property maximum_file_size: 0; } diff --git a/krokiet/ui/settings_list.slint b/krokiet/ui/settings_list.slint index e2a1526..9ceaa7d 100644 --- a/krokiet/ui/settings_list.slint +++ b/krokiet/ui/settings_list.slint @@ -2,6 +2,8 @@ import { Button, VerticalBox , HorizontalBox, TabWidget, ListView, StandardListV import { Settings } from "settings.slint"; import { Callabler } from "callabler.slint"; +// TODO use Spinbox instead LineEdit {} to be able to set only numbers + global SettingsSize { out property item_height: 30px; } @@ -26,7 +28,7 @@ component MinMaxSizeComponent inherits HorizontalLayout { spacing: 20px; Text { horizontal-stretch: 0.0; - text:"Items Size(Kb)"; + text:"Items Size(Bytes)"; vertical-alignment: TextVerticalAlignment.center; } HorizontalLayout { @@ -36,21 +38,17 @@ component MinMaxSizeComponent inherits HorizontalLayout { text:"Min:"; vertical-alignment: TextVerticalAlignment.center; } - SpinBox { - enabled: true; - maximum: 999999999999999; + LineEdit { height: SettingsSize.item_height; - value <=> Settings.minimum_file_size; + text <=> Settings.minimum_file_size; } Text { text:"Max:"; vertical-alignment: TextVerticalAlignment.center; } - SpinBox { - enabled: true; - maximum: 999999999999999; + LineEdit { height: SettingsSize.item_height; - value <=> Settings.maximum_file_size; + text <=> Settings.maximum_file_size; } } }