1
0
Fork 0
mirror of synced 2024-06-30 03:50:52 +12:00
This commit is contained in:
Rafał Mikrut 2023-11-26 00:46:00 +01:00
parent e2bd446768
commit 4d516dfe91
7 changed files with 177 additions and 40 deletions

View file

@ -1,5 +1,5 @@
use i18n_embed::fluent::{fluent_language_loader, FluentLanguageLoader}; use i18n_embed::fluent::{fluent_language_loader, FluentLanguageLoader};
use i18n_embed::{DefaultLocalizer, LanguageLoader, Localizer}; use i18n_embed::LanguageLoader;
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
use rust_embed::RustEmbed; use rust_embed::RustEmbed;
@ -26,7 +26,7 @@ macro_rules! flk {
}}; }};
} }
// Get the `Localizer` to be used for localizing this library. // // Get the `Localizer` to be used for localizing this library.
pub fn localizer_krokiet() -> Box<dyn Localizer> { // pub fn localizer_krokiet() -> Box<dyn Localizer> {
Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER_GUI, &Localizations)) // Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER_GUI, &Localizations))
} // }

View file

@ -41,7 +41,7 @@ use crate::connect_progress_receiver::connect_progress_gathering;
use crate::connect_show_preview::connect_show_preview; use crate::connect_show_preview::connect_show_preview;
use crate::connect_stop::connect_stop_button; use crate::connect_stop::connect_stop_button;
use crate::connect_translation::connect_translations; use crate::connect_translation::connect_translations;
use crate::settings::{create_default_settings_files, load_settings_from_file, reset_settings, save_settings_to_file}; use crate::settings::{connect_changing_settings_preset, create_default_settings_files, load_settings_from_file, save_all_settings_to_file};
use czkawka_core::common::{print_version_mode, setup_logger}; use czkawka_core::common::{print_version_mode, setup_logger};
use czkawka_core::common_dir_traversal::ProgressData; use czkawka_core::common_dir_traversal::ProgressData;
use slint::{ModelRc, VecModel}; use slint::{ModelRc, VecModel};
@ -69,10 +69,11 @@ fn main() {
connect_add_remove_directories(&app); connect_add_remove_directories(&app);
connect_show_preview(&app); connect_show_preview(&app);
connect_translations(&app); connect_translations(&app);
connect_changing_settings_preset(&app);
app.run().unwrap(); app.run().unwrap();
save_settings_to_file(&app); save_all_settings_to_file(&app);
} }
// TODO remove this after debugging - or leave commented // TODO remove this after debugging - or leave commented

View file

@ -1,16 +1,16 @@
use crate::MainWindow; use crate::{Callabler, MainWindow};
use std::cmp::{max, min}; use std::cmp::{max, min};
use std::env; use std::env;
use std::path::{Path, PathBuf}; use std::path::PathBuf;
use crate::common::create_string_standard_list_view_from_pathbuf; use crate::common::{create_string_standard_list_view_from_pathbuf, create_vec_model_from_vec_string};
use crate::{GuiState, Settings}; use crate::{GuiState, Settings};
use czkawka_core::common_items::{DEFAULT_EXCLUDED_DIRECTORIES, DEFAULT_EXCLUDED_ITEMS}; use czkawka_core::common_items::{DEFAULT_EXCLUDED_DIRECTORIES, DEFAULT_EXCLUDED_ITEMS};
use directories_next::ProjectDirs; use directories_next::ProjectDirs;
use home::home_dir; use home::home_dir;
use log::{error, info}; use log::{debug, error, info};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use slint::{ComponentHandle, Model}; use slint::{ComponentHandle, Model, ModelRc};
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SettingsCustom { pub struct SettingsCustom {
@ -22,6 +22,10 @@ pub struct SettingsCustom {
pub excluded_items: String, pub excluded_items: String,
#[serde(default)] #[serde(default)]
pub allowed_extensions: String, pub allowed_extensions: String,
#[serde(default = "minimum_file_size")]
pub minimum_file_size: i32,
#[serde(default = "maximum_file_size")]
pub maximum_file_size: i32,
} }
impl Default for SettingsCustom { impl Default for SettingsCustom {
@ -46,6 +50,68 @@ impl Default for BasicSettings {
} }
} }
pub fn connect_changing_settings_preset(app: &MainWindow) {
let a = app.as_weak();
app.global::<Callabler>().on_changed_settings_preset(move || {
let app = a.upgrade().unwrap();
let current_item = app.global::<Settings>().get_settings_preset_idx();
let loaded_data = load_data_from_file::<SettingsCustom>(get_config_file(current_item));
match loaded_data {
Ok(loaded_data) => {
set_settings_to_gui(&app, &loaded_data);
app.set_text_summary_text(format!("Changed and loaded properly preset {}", current_item + 1).into());
}
Err(e) => {
set_settings_to_gui(&app, &SettingsCustom::default());
app.set_text_summary_text(format!("Cannot change and load preset {} - reason {e}", current_item + 1).into());
}
}
});
let a = app.as_weak();
app.global::<Callabler>().on_save_current_preset(move || {
let app = a.upgrade().unwrap();
let settings = app.global::<Settings>();
let current_item = settings.get_settings_preset_idx();
let result = save_data_to_file(get_config_file(current_item), &collect_settings(&app));
match result {
Ok(()) => {
app.set_text_summary_text(format!("Saved preset {}", current_item + 1).into());
}
Err(e) => {
app.set_text_summary_text(format!("Cannot save preset {} - reason {e}", current_item + 1).into());
error!("{e}");
}
}
});
let a = app.as_weak();
app.global::<Callabler>().on_reset_current_preset(move || {
let app = a.upgrade().unwrap();
let settings = app.global::<Settings>();
let current_item = settings.get_settings_preset_idx();
set_settings_to_gui(&app, &SettingsCustom::default());
app.set_text_summary_text(format!("Reset preset {}", current_item + 1).into());
});
let a = app.as_weak();
app.global::<Callabler>().on_load_current_preset(move || {
let app = a.upgrade().unwrap();
let settings = app.global::<Settings>();
let current_item = settings.get_settings_preset_idx();
let loaded_data = load_data_from_file::<SettingsCustom>(get_config_file(current_item));
match loaded_data {
Ok(loaded_data) => {
set_settings_to_gui(&app, &loaded_data);
app.set_text_summary_text(format!("Loaded preset {}", current_item + 1).into());
}
Err(e) => {
set_settings_to_gui(&app, &SettingsCustom::default());
let err_message = format!("Cannot load preset {} - reason {e}", current_item + 1);
app.set_text_summary_text(err_message.into());
error!("{e}");
}
}
});
}
pub fn create_default_settings_files() { pub fn create_default_settings_files() {
let base_config_file = get_base_config_file(); let base_config_file = get_base_config_file();
if let Some(base_config_file) = base_config_file { if let Some(base_config_file) = base_config_file {
@ -53,7 +119,8 @@ pub fn create_default_settings_files() {
let _ = save_data_to_file(Some(base_config_file), &BasicSettings::default()); let _ = save_data_to_file(Some(base_config_file), &BasicSettings::default());
} }
} }
for i in 0..10 {
for i in 1..=10 {
let config_file = get_config_file(i); let config_file = get_config_file(i);
if let Some(config_file) = config_file { if let Some(config_file) = config_file {
if !config_file.is_file() { if !config_file.is_file() {
@ -63,12 +130,9 @@ pub fn create_default_settings_files() {
} }
} }
pub fn reset_settings(app: &MainWindow) {
set_settings_to_gui(app, &SettingsCustom::default());
}
pub fn load_settings_from_file(app: &MainWindow) { pub fn load_settings_from_file(app: &MainWindow) {
let result_base_settings = load_data_from_file::<BasicSettings>(get_base_config_file()); let result_base_settings = load_data_from_file::<BasicSettings>(get_base_config_file());
let base_settings; let base_settings;
if let Ok(base_settings_temp) = result_base_settings { if let Ok(base_settings_temp) = result_base_settings {
base_settings = base_settings_temp; base_settings = base_settings_temp;
@ -78,6 +142,7 @@ pub fn load_settings_from_file(app: &MainWindow) {
} }
let results_custom_settings = load_data_from_file::<SettingsCustom>(get_config_file(base_settings.default_preset)); let results_custom_settings = load_data_from_file::<SettingsCustom>(get_config_file(base_settings.default_preset));
let custom_settings; let custom_settings;
if let Ok(custom_settings_temp) = results_custom_settings { if let Ok(custom_settings_temp) = results_custom_settings {
custom_settings = custom_settings_temp; custom_settings = custom_settings_temp;
@ -90,7 +155,20 @@ pub fn load_settings_from_file(app: &MainWindow) {
set_base_settings_to_gui(app, &base_settings); set_base_settings_to_gui(app, &base_settings);
} }
pub fn save_settings_to_file(app: &MainWindow) { pub fn save_all_settings_to_file(app: &MainWindow) {
save_base_settings_to_file(app);
save_custom_settings_to_file(app);
}
pub fn save_base_settings_to_file(app: &MainWindow) {
let result = save_data_to_file(get_base_config_file(), &collect_base_settings(app));
if let Err(e) = result {
error!("{e}");
}
}
pub fn save_custom_settings_to_file(app: &MainWindow) {
let current_item = app.global::<Settings>().get_settings_preset_idx(); let current_item = app.global::<Settings>().get_settings_preset_idx();
let result = save_data_to_file(get_config_file(current_item), &collect_settings(app)); let result = save_data_to_file(get_config_file(current_item), &collect_settings(app));
@ -99,34 +177,36 @@ pub fn save_settings_to_file(app: &MainWindow) {
} }
} }
pub fn load_data_from_file<T>(config_data: Option<PathBuf>) -> Result<T, String> pub fn load_data_from_file<T>(config_file: Option<PathBuf>) -> Result<T, String>
where where
for<'de> T: Deserialize<'de>, for<'de> T: Deserialize<'de>,
{ {
let Some(config_data) = config_data else { let current_time = std::time::Instant::now();
let Some(config_file) = config_file else {
return Err("Cannot get config file".into()); return Err("Cannot get config file".into());
}; };
if !config_data.is_file() { if !config_file.is_file() {
return Err("Config file doesn't exists".into()); return Err("Config file doesn't exists".into());
} }
match std::fs::read_to_string(config_data) { let result = match std::fs::read_to_string(&config_file) {
Ok(serialized) => match serde_json::from_str(&serialized) { Ok(serialized) => match serde_json::from_str(&serialized) {
Ok(custom_settings) => Ok(custom_settings), Ok(custom_settings) => Ok(custom_settings),
Err(e) => { Err(e) => Err(format!("Cannot deserialize settings: {e}")),
return Err(format!("Cannot deserialize settings: {e}"));
}
}, },
Err(e) => { Err(e) => Err(format!("Cannot read config file: {e}")),
return Err(format!("Cannot read config file: {e}")); };
}
} debug!("Loading data from file {:?} took {:?}", config_file, current_time.elapsed());
result
} }
pub fn save_data_to_file<T>(config_file: Option<PathBuf>, serializable_data: &T) -> Result<(), String> pub fn save_data_to_file<T>(config_file: Option<PathBuf>, serializable_data: &T) -> Result<(), String>
where where
T: Serialize, T: Serialize,
{ {
let current_time = std::time::Instant::now();
let Some(config_file) = config_file else { let Some(config_file) = config_file else {
return Err("Cannot get config file".into()); return Err("Cannot get config file".into());
}; };
@ -139,7 +219,7 @@ where
match serde_json::to_string_pretty(&serializable_data) { match serde_json::to_string_pretty(&serializable_data) {
Ok(serialized) => { Ok(serialized) => {
if let Err(e) = std::fs::write(config_file, serialized) { if let Err(e) = std::fs::write(&config_file, serialized) {
return Err(format!("Cannot save config file: {e}")); return Err(format!("Cannot save config file: {e}"));
} }
} }
@ -147,6 +227,8 @@ where
return Err(format!("Cannot serialize settings: {e}")); return Err(format!("Cannot serialize settings: {e}"));
} }
} }
debug!("Saving data to file {:?} took {:?}", config_file, current_time.elapsed());
Ok(()) Ok(())
} }
@ -173,6 +255,7 @@ pub fn set_base_settings_to_gui(app: &MainWindow, basic_settings: &BasicSettings
let settings = app.global::<Settings>(); let settings = app.global::<Settings>();
// settings.set_language(basic_settings.language.clone()); // settings.set_language(basic_settings.language.clone());
settings.set_settings_preset_idx(basic_settings.default_preset); settings.set_settings_preset_idx(basic_settings.default_preset);
settings.set_settings_presets(ModelRc::new(create_vec_model_from_vec_string(basic_settings.preset_names.clone())));
} }
pub fn set_settings_to_gui(app: &MainWindow, custom_settings: &SettingsCustom) { pub fn set_settings_to_gui(app: &MainWindow, custom_settings: &SettingsCustom) {
let settings = app.global::<Settings>(); let settings = app.global::<Settings>();
@ -187,6 +270,8 @@ pub fn set_settings_to_gui(app: &MainWindow, custom_settings: &SettingsCustom) {
settings.set_excluded_items(custom_settings.excluded_items.clone().into()); settings.set_excluded_items(custom_settings.excluded_items.clone().into());
settings.set_allowed_extensions(custom_settings.allowed_extensions.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);
// Clear text // Clear text
app.global::<GuiState>().set_info_text("".into()); app.global::<GuiState>().set_info_text("".into());
@ -203,12 +288,16 @@ pub fn collect_settings(app: &MainWindow) -> SettingsCustom {
let excluded_items = settings.get_excluded_items().to_string(); let excluded_items = settings.get_excluded_items().to_string();
let allowed_extensions = settings.get_allowed_extensions().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();
SettingsCustom { SettingsCustom {
included_directories, included_directories,
excluded_directories, excluded_directories,
excluded_items, excluded_items,
allowed_extensions, allowed_extensions,
minimum_file_size,
maximum_file_size,
} }
} }
@ -257,10 +346,26 @@ fn default_language() -> String {
} }
fn default_preset_names() -> Vec<String> { fn default_preset_names() -> Vec<String> {
vec![ [
"Preset 0", "Preset 1", "Preset 2", "Preset 3", "Preset 4", "Preset 5", "Preset 6", "Preset 7", "Preset 8", "Preset 9", "Preset 1",
"Preset 2",
"Preset 3",
"Preset 4",
"Preset 5",
"Preset 6",
"Preset 7",
"Preset 8",
"Preset 9",
"Preset 10",
] ]
.iter() .iter()
.map(|x| x.to_string()) .map(|x| (*x).to_string())
.collect::<Vec<_>>() .collect::<Vec<_>>()
} }
fn minimum_file_size() -> i32 {
16
}
fn maximum_file_size() -> i32 {
i32::MAX
}

View file

@ -12,7 +12,10 @@ export global Callabler {
callback load_image_preview(string); callback load_image_preview(string);
// Settings // Settings
callback changed_settings_preset(string, int); callback changed_settings_preset();
callback save_current_preset();
callback load_current_preset();
callback reset_current_preset();
// Translations // Translations
pure callback translate(string, [{key: string, value: string}]) -> string; pure callback translate(string, [{key: string, value: string}]) -> string;

View file

@ -24,6 +24,7 @@ export component MainWindow inherits Window {
preferred-width: 800px; preferred-width: 800px;
min-height: 300px; min-height: 300px;
preferred-height: 600px; preferred-height: 600px;
in-out property <string> text_summary_text: "";
in-out property <bool> stop_requested: false; in-out property <bool> stop_requested: false;
in-out property <bool> scanning: false; in-out property <bool> scanning: false;
in-out property <ProgressToSend> progress_datas: { in-out property <ProgressToSend> progress_datas: {
@ -96,16 +97,17 @@ export component MainWindow inherits Window {
active-tab <=> root.active-tab; active-tab <=> root.active-tab;
stop_requested <=> root.stop-requested; stop_requested <=> root.stop-requested;
scan_stopping => { scan_stopping => {
text_summary.text = "Stopping scan, please wait..."; text_summary_text = "Stopping scan, please wait...";
root.scan_stopping(); root.scan_stopping();
} }
scan_starting(item) => { scan_starting(item) => {
text-summary.text = "Searching..."; text_summary_text = "Searching...";
root.scan_starting(item); root.scan_starting(item);
} }
} }
text_summary := LineEdit { text_summary := LineEdit {
text: text_summary_text;
read-only: true; read-only: true;
} }
@ -177,7 +179,7 @@ export component MainWindow inherits Window {
} }
scan_ended(scan_text) => { scan_ended(scan_text) => {
text-summary.text = scan_text; text_summary_text = scan_text;
root.scanning = false; root.scanning = false;
root.stop_requested = false; root.stop_requested = false;
} }

View file

@ -8,4 +8,7 @@ export global Settings {
// Settings // Settings
in-out property <string> excluded_items: "Excluded items"; in-out property <string> excluded_items: "Excluded items";
in-out property <string> allowed_extensions: "Allowed extensions"; in-out property <string> allowed_extensions: "Allowed extensions";
in-out property <int> minimum_file_size: 0;
in-out property <int> maximum_file_size: 0;
} }

View file

@ -18,7 +18,7 @@ component TextComponent inherits HorizontalLayout {
LineEdit { LineEdit {
horizontal-stretch: 1.0; horizontal-stretch: 1.0;
height: SettingsSize.item_height; height: SettingsSize.item_height;
text: model; text <=> model;
} }
} }
@ -40,6 +40,7 @@ component MinMaxSizeComponent inherits HorizontalLayout {
enabled: true; enabled: true;
maximum: 999999999999999; maximum: 999999999999999;
height: SettingsSize.item_height; height: SettingsSize.item_height;
value <=> Settings.minimum_file_size;
} }
Text { Text {
text:"Max:"; text:"Max:";
@ -49,6 +50,7 @@ component MinMaxSizeComponent inherits HorizontalLayout {
enabled: true; enabled: true;
maximum: 999999999999999; maximum: 999999999999999;
height: SettingsSize.item_height; height: SettingsSize.item_height;
value <=> Settings.maximum_file_size;
} }
} }
} }
@ -59,7 +61,7 @@ component Presets inherits Rectangle {
if !edit_name: HorizontalLayout { if !edit_name: HorizontalLayout {
spacing: 5px; spacing: 5px;
Text { Text {
text : "Current:"; text : "Current Preset:";
vertical-alignment: TextVerticalAlignment.center; vertical-alignment: TextVerticalAlignment.center;
} }
combo_box := ComboBox { combo_box := ComboBox {
@ -67,7 +69,7 @@ component Presets inherits Rectangle {
model: Settings.settings_presets; model: Settings.settings_presets;
selected(item) => { selected(item) => {
Settings.settings_preset_idx = self.current_index; Settings.settings_preset_idx = self.current_index;
Callabler.changed_settings_preset(item, self.current_index); Callabler.changed_settings_preset();
} }
} }
Button { Button {
@ -145,4 +147,25 @@ export component SettingsList inherits VerticalLayout {
} }
} }
} }
HorizontalLayout {
spacing: 5px;
Button {
text: "Save";
clicked => {
Callabler.save_current_preset();
}
}
Button {
text: "Load";
clicked => {
Callabler.load_current_preset();
}
}
Button {
text: "Reset";
clicked => {
Callabler.reset_current_preset();
}
}
}
} }