UUU
This commit is contained in:
parent
e2bd446768
commit
4d516dfe91
7 changed files with 177 additions and 40 deletions
|
@ -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))
|
||||
// }
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue