1
0
Fork 0
mirror of synced 2024-06-27 18:40:50 +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::{DefaultLocalizer, LanguageLoader, Localizer};
use i18n_embed::LanguageLoader;
use once_cell::sync::Lazy;
use rust_embed::RustEmbed;
@ -26,7 +26,7 @@ macro_rules! flk {
}};
}
// Get the `Localizer` to be used for localizing this library.
pub fn localizer_krokiet() -> Box<dyn Localizer> {
Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER_GUI, &Localizations))
}
// // Get the `Localizer` to be used for localizing this library.
// pub fn localizer_krokiet() -> Box<dyn Localizer> {
// 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_stop::connect_stop_button;
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_dir_traversal::ProgressData;
use slint::{ModelRc, VecModel};
@ -69,10 +69,11 @@ fn main() {
connect_add_remove_directories(&app);
connect_show_preview(&app);
connect_translations(&app);
connect_changing_settings_preset(&app);
app.run().unwrap();
save_settings_to_file(&app);
save_all_settings_to_file(&app);
}
// 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::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 czkawka_core::common_items::{DEFAULT_EXCLUDED_DIRECTORIES, DEFAULT_EXCLUDED_ITEMS};
use directories_next::ProjectDirs;
use home::home_dir;
use log::{error, info};
use log::{debug, error, info};
use serde::{Deserialize, Serialize};
use slint::{ComponentHandle, Model};
use slint::{ComponentHandle, Model, ModelRc};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SettingsCustom {
@ -22,6 +22,10 @@ pub struct SettingsCustom {
pub excluded_items: String,
#[serde(default)]
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 {
@ -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() {
let base_config_file = get_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());
}
}
for i in 0..10 {
for i in 1..=10 {
let config_file = get_config_file(i);
if let Some(config_file) = config_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) {
let result_base_settings = load_data_from_file::<BasicSettings>(get_base_config_file());
let base_settings;
if let Ok(base_settings_temp) = result_base_settings {
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 custom_settings;
if let Ok(custom_settings_temp) = results_custom_settings {
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);
}
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 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
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());
};
if !config_data.is_file() {
if !config_file.is_file() {
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(custom_settings) => Ok(custom_settings),
Err(e) => {
return Err(format!("Cannot deserialize settings: {e}"));
}
Err(e) => Err(format!("Cannot deserialize settings: {e}")),
},
Err(e) => {
return Err(format!("Cannot read config file: {e}"));
}
}
Err(e) => 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>
where
T: Serialize,
{
let current_time = std::time::Instant::now();
let Some(config_file) = config_file else {
return Err("Cannot get config file".into());
};
@ -139,7 +219,7 @@ where
match serde_json::to_string_pretty(&serializable_data) {
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}"));
}
}
@ -147,6 +227,8 @@ where
return Err(format!("Cannot serialize settings: {e}"));
}
}
debug!("Saving data to file {:?} took {:?}", config_file, current_time.elapsed());
Ok(())
}
@ -173,6 +255,7 @@ pub fn set_base_settings_to_gui(app: &MainWindow, basic_settings: &BasicSettings
let settings = app.global::<Settings>();
// settings.set_language(basic_settings.language.clone());
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) {
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_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
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 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 {
included_directories,
excluded_directories,
excluded_items,
allowed_extensions,
minimum_file_size,
maximum_file_size,
}
}
@ -257,10 +346,26 @@ fn default_language() -> 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()
.map(|x| x.to_string())
.map(|x| (*x).to_string())
.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);
// Settings
callback changed_settings_preset(string, int);
callback changed_settings_preset();
callback save_current_preset();
callback load_current_preset();
callback reset_current_preset();
// Translations
pure callback translate(string, [{key: string, value: string}]) -> string;

View file

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

View file

@ -8,4 +8,7 @@ export global Settings {
// Settings
in-out property <string> excluded_items: "Excluded items";
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 {
horizontal-stretch: 1.0;
height: SettingsSize.item_height;
text: model;
text <=> model;
}
}
@ -40,6 +40,7 @@ component MinMaxSizeComponent inherits HorizontalLayout {
enabled: true;
maximum: 999999999999999;
height: SettingsSize.item_height;
value <=> Settings.minimum_file_size;
}
Text {
text:"Max:";
@ -49,6 +50,7 @@ component MinMaxSizeComponent inherits HorizontalLayout {
enabled: true;
maximum: 999999999999999;
height: SettingsSize.item_height;
value <=> Settings.maximum_file_size;
}
}
}
@ -59,7 +61,7 @@ component Presets inherits Rectangle {
if !edit_name: HorizontalLayout {
spacing: 5px;
Text {
text : "Current:";
text : "Current Preset:";
vertical-alignment: TextVerticalAlignment.center;
}
combo_box := ComboBox {
@ -67,7 +69,7 @@ component Presets inherits Rectangle {
model: Settings.settings_presets;
selected(item) => {
Settings.settings_preset_idx = self.current_index;
Callabler.changed_settings_preset(item, self.current_index);
Callabler.changed_settings_preset();
}
}
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();
}
}
}
}