1
0
Fork 0
mirror of synced 2024-06-27 18:40:50 +12:00
This commit is contained in:
Rafał Mikrut 2023-11-25 23:47:58 +01:00
parent cbca9021d0
commit e2bd446768
6 changed files with 271 additions and 83 deletions

144
Cargo.lock generated
View file

@ -233,12 +233,12 @@ dependencies = [
[[package]]
name = "async-channel"
version = "2.1.0"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d37875bd9915b7d67c2f117ea2c30a0989874d0b2cb694fe25403c85763c0c9e"
checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c"
dependencies = [
"concurrent-queue",
"event-listener 3.1.0",
"event-listener 4.0.0",
"event-listener-strategy",
"futures-core",
"pin-project-lite",
@ -246,11 +246,11 @@ dependencies = [
[[package]]
name = "async-executor"
version = "1.7.2"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc5ea910c42e5ab19012bab31f53cb4d63d54c3a27730f9a833a88efcf4bb52d"
checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c"
dependencies = [
"async-lock 3.1.1",
"async-lock 3.1.2",
"async-task",
"concurrent-queue",
"fastrand 2.0.1",
@ -276,10 +276,10 @@ version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b4353121d5644cdf2beb5726ab752e79a8db1ebb52031770ec47db31d245526"
dependencies = [
"async-channel 2.1.0",
"async-channel 2.1.1",
"async-executor",
"async-io 2.2.0",
"async-lock 3.1.1",
"async-io 2.2.1",
"async-lock 3.1.2",
"blocking",
"futures-lite 2.0.1",
"once_cell",
@ -307,22 +307,21 @@ dependencies = [
[[package]]
name = "async-io"
version = "2.2.0"
version = "2.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41ed9d5715c2d329bf1b4da8d60455b99b187f27ba726df2883799af9af60997"
checksum = "d6d3b15875ba253d1110c740755e246537483f152fa334f91abd7fe84c88b3ff"
dependencies = [
"async-lock 3.1.1",
"async-lock 3.1.2",
"cfg-if",
"concurrent-queue",
"futures-io",
"futures-lite 2.0.1",
"parking",
"polling 3.3.0",
"polling 3.3.1",
"rustix 0.38.25",
"slab",
"tracing",
"waker-fn",
"windows-sys 0.48.0",
"windows-sys 0.52.0",
]
[[package]]
@ -336,11 +335,11 @@ dependencies = [
[[package]]
name = "async-lock"
version = "3.1.1"
version = "3.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "655b9c7fe787d3b25cc0f804a1a8401790f0c5bc395beb5a64dc77d8de079105"
checksum = "dea8b3453dd7cc96711834b75400d671b73e3656975fa68d9f277163b7f7e316"
dependencies = [
"event-listener 3.1.0",
"event-listener 4.0.0",
"event-listener-strategy",
"pin-project-lite",
]
@ -379,7 +378,7 @@ version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5"
dependencies = [
"async-io 2.2.0",
"async-io 2.2.1",
"async-lock 2.8.0",
"atomic-waker",
"cfg-if",
@ -610,8 +609,8 @@ version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118"
dependencies = [
"async-channel 2.1.0",
"async-lock 3.1.1",
"async-channel 2.1.1",
"async-lock 3.1.2",
"async-task",
"fastrand 2.0.1",
"futures-io",
@ -733,7 +732,7 @@ checksum = "7b50b5a44d59a98c55a9eeb518f39bf7499ba19fd98ee7d22618687f3f10adbf"
dependencies = [
"bitflags 2.4.1",
"log",
"polling 3.3.0",
"polling 3.3.1",
"rustix 0.38.25",
"slab",
"thiserror",
@ -1685,12 +1684,23 @@ dependencies = [
]
[[package]]
name = "event-listener-strategy"
version = "0.3.0"
name = "event-listener"
version = "4.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d96b852f1345da36d551b9473fa1e2b1eb5c5195585c6c018118bc92a8d91160"
checksum = "770d968249b5d99410d61f5bf89057f3199a077a04d087092f58e7d10692baae"
dependencies = [
"event-listener 3.1.0",
"concurrent-queue",
"parking",
"pin-project-lite",
]
[[package]]
name = "event-listener-strategy"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3"
dependencies = [
"event-listener 4.0.0",
"pin-project-lite",
]
@ -4303,16 +4313,16 @@ dependencies = [
[[package]]
name = "polling"
version = "3.3.0"
version = "3.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e53b6af1f60f36f8c2ac2aad5459d75a5a9b4be1e8cdd40264f315d78193e531"
checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e"
dependencies = [
"cfg-if",
"concurrent-queue",
"pin-project-lite",
"rustix 0.38.25",
"tracing",
"windows-sys 0.48.0",
"windows-sys 0.52.0",
]
[[package]]
@ -6151,9 +6161,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "ureq"
version = "2.9.0"
version = "2.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7830e33f6e25723d41a63f77e434159dad02919f18f55a512b5f16f3b1d77138"
checksum = "f8cdd25c339e200129fe4de81451814e5228c9b771d57378817d6117cc2b3f97"
dependencies = [
"base64",
"flate2",
@ -6683,6 +6693,15 @@ dependencies = [
"windows-targets 0.48.5",
]
[[package]]
name = "windows-sys"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
"windows-targets 0.52.0",
]
[[package]]
name = "windows-targets"
version = "0.42.2"
@ -6713,6 +6732,21 @@ dependencies = [
"windows_x86_64_msvc 0.48.5",
]
[[package]]
name = "windows-targets"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
dependencies = [
"windows_aarch64_gnullvm 0.52.0",
"windows_aarch64_msvc 0.52.0",
"windows_i686_gnu 0.52.0",
"windows_i686_msvc 0.52.0",
"windows_x86_64_gnu 0.52.0",
"windows_x86_64_gnullvm 0.52.0",
"windows_x86_64_msvc 0.52.0",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.42.2"
@ -6725,6 +6759,12 @@ version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
[[package]]
name = "windows_aarch64_msvc"
version = "0.42.2"
@ -6737,6 +6777,12 @@ version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
[[package]]
name = "windows_i686_gnu"
version = "0.42.2"
@ -6749,6 +6795,12 @@ version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_gnu"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
[[package]]
name = "windows_i686_msvc"
version = "0.42.2"
@ -6761,6 +6813,12 @@ version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_i686_msvc"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
[[package]]
name = "windows_x86_64_gnu"
version = "0.42.2"
@ -6773,6 +6831,12 @@ version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.42.2"
@ -6785,6 +6849,12 @@ version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
[[package]]
name = "windows_x86_64_msvc"
version = "0.42.2"
@ -6798,10 +6868,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]]
name = "winit"
version = "0.29.3"
name = "windows_x86_64_msvc"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "161598019a9da35ab6c34dc46cd13546cba9dbf9816475d4dd9a639455016563"
checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
[[package]]
name = "winit"
version = "0.29.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d25d662bb83b511acd839534bb2d88521b0bbc81440969cb077d23c4db9e62c7"
dependencies = [
"ahash",
"android-activity",

View file

@ -28,21 +28,25 @@ pub fn connect_progress_window(gui_data: &GuiData, progress_receiver: Receiver<P
let future = async move {
loop {
let item = progress_receiver.try_recv();
if let Ok(item) = item {
match item.tool_type {
ToolType::Duplicate => process_bar_duplicates(&gui_data, &item),
ToolType::EmptyFiles => process_bar_empty_files(&gui_data, &item),
ToolType::EmptyFolders => process_bar_empty_folder(&gui_data, &item),
ToolType::BigFile => process_bar_big_files(&gui_data, &item),
ToolType::SameMusic => process_bar_same_music(&gui_data, &item),
ToolType::SimilarImages => process_bar_similar_images(&gui_data, &item),
ToolType::SimilarVideos => process_bar_similar_videos(&gui_data, &item),
ToolType::TemporaryFiles => process_bar_temporary(&gui_data, &item),
ToolType::InvalidSymlinks => process_bar_invalid_symlinks(&gui_data, &item),
ToolType::BrokenFiles => process_bar_broken_files(&gui_data, &item),
ToolType::BadExtensions => process_bar_bad_extensions(&gui_data, &item),
ToolType::None => panic!(),
loop {
let item = progress_receiver.try_recv();
if let Ok(item) = item {
match item.tool_type {
ToolType::Duplicate => process_bar_duplicates(&gui_data, &item),
ToolType::EmptyFiles => process_bar_empty_files(&gui_data, &item),
ToolType::EmptyFolders => process_bar_empty_folder(&gui_data, &item),
ToolType::BigFile => process_bar_big_files(&gui_data, &item),
ToolType::SameMusic => process_bar_same_music(&gui_data, &item),
ToolType::SimilarImages => process_bar_similar_images(&gui_data, &item),
ToolType::SimilarVideos => process_bar_similar_videos(&gui_data, &item),
ToolType::TemporaryFiles => process_bar_temporary(&gui_data, &item),
ToolType::InvalidSymlinks => process_bar_invalid_symlinks(&gui_data, &item),
ToolType::BrokenFiles => process_bar_broken_files(&gui_data, &item),
ToolType::BadExtensions => process_bar_bad_extensions(&gui_data, &item),
ToolType::None => panic!(),
}
} else {
break;
}
}
glib::timeout_future(Duration::from_millis(300)).await;

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::{load_settings_from_file, reset_settings, save_settings_to_file};
use crate::settings::{create_default_settings_files, load_settings_from_file, reset_settings, save_settings_to_file};
use czkawka_core::common::{print_version_mode, setup_logger};
use czkawka_core::common_dir_traversal::ProgressData;
use slint::{ModelRc, VecModel};
@ -58,7 +58,7 @@ fn main() {
to_remove_debug(&app);
reset_settings(&app);
create_default_settings_files();
load_settings_from_file(&app);
connect_delete_button(&app);

View file

@ -1,13 +1,14 @@
use crate::MainWindow;
use std::cmp::{max, min};
use std::env;
use std::path::PathBuf;
use std::path::{Path, PathBuf};
use crate::common::create_string_standard_list_view_from_pathbuf;
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;
use log::{error, info};
use serde::{Deserialize, Serialize};
use slint::{ComponentHandle, Model};
@ -29,70 +30,150 @@ impl Default for SettingsCustom {
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BasicSettings {
#[serde(default = "default_language")]
pub language: String,
#[serde(default)]
pub default_preset: i32,
#[serde(default = "default_preset_names")]
pub preset_names: Vec<String>,
}
impl Default for BasicSettings {
fn default() -> Self {
serde_json::from_str("{}").unwrap()
}
}
pub fn create_default_settings_files() {
let base_config_file = get_base_config_file();
if let Some(base_config_file) = base_config_file {
if !base_config_file.is_file() {
let _ = save_data_to_file(Some(base_config_file), &BasicSettings::default());
}
}
for i in 0..10 {
let config_file = get_config_file(i);
if let Some(config_file) = config_file {
if !config_file.is_file() {
let _ = save_data_to_file(Some(config_file), &SettingsCustom::default());
}
}
}
}
pub fn reset_settings(app: &MainWindow) {
set_settings_to_gui(app, &SettingsCustom::default());
}
pub fn load_settings_from_file(app: &MainWindow) {
let Some(config_file) = get_config_file() else {
error!("Cannot get config file");
return;
};
if !config_file.is_file() {
error!("Config file doesn't exists");
return;
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;
} else {
info!("Cannot load base settings, using default instead");
base_settings = BasicSettings::default();
}
match std::fs::read_to_string(config_file) {
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;
} else {
info!("Cannot load custom settings, using default instead");
custom_settings = SettingsCustom::default();
}
set_settings_to_gui(app, &custom_settings);
set_base_settings_to_gui(app, &base_settings);
}
pub fn save_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));
if let Err(e) = result {
error!("{e}");
}
}
pub fn load_data_from_file<T>(config_data: Option<PathBuf>) -> Result<T, String>
where
for<'de> T: Deserialize<'de>,
{
let Some(config_data) = config_data else {
return Err("Cannot get config file".into());
};
if !config_data.is_file() {
return Err("Config file doesn't exists".into());
}
match std::fs::read_to_string(config_data) {
Ok(serialized) => match serde_json::from_str(&serialized) {
Ok(custom_settings) => {
set_settings_to_gui(app, &custom_settings);
}
Ok(custom_settings) => Ok(custom_settings),
Err(e) => {
error!("Cannot deserialize settings: {e}");
return Err(format!("Cannot deserialize settings: {e}"));
}
},
Err(e) => {
error!("Cannot read config file: {e}");
return Err(format!("Cannot read config file: {e}"));
}
}
}
pub fn save_settings_to_file(app: &MainWindow) {
let Some(config_file) = get_config_file() else {
error!("Cannot get config file");
return;
pub fn save_data_to_file<T>(config_file: Option<PathBuf>, serializable_data: &T) -> Result<(), String>
where
T: Serialize,
{
let Some(config_file) = config_file else {
return Err("Cannot get config file".into());
};
// Create dirs if not exists
if let Some(parent) = config_file.parent() {
if let Err(e) = std::fs::create_dir_all(parent) {
error!("Cannot create config folder: {e}");
return;
return Err(format!("Cannot create config folder: {e}"));
}
}
let collected_settings = collect_settings(app);
match serde_json::to_string_pretty(&collected_settings) {
match serde_json::to_string_pretty(&serializable_data) {
Ok(serialized) => {
if let Err(e) = std::fs::write(config_file, serialized) {
error!("Cannot save config file: {e}");
return Err(format!("Cannot save config file: {e}"));
}
}
Err(e) => {
error!("Cannot serialize settings: {e}");
return Err(format!("Cannot serialize settings: {e}"));
}
}
Ok(())
}
pub fn get_config_file() -> Option<PathBuf> {
pub fn get_base_config_file() -> Option<PathBuf> {
let Some(configs) = ProjectDirs::from("pl", "Qarmin", "Krokiet") else {
return None;
};
let config_folder = configs.config_dir();
let config_file = config_folder.join("config.json");
let base_config_file = config_folder.join("config_general.json");
Some(base_config_file)
}
pub fn get_config_file(number: i32) -> Option<PathBuf> {
let number = max(min(number, 9), 0);
let Some(configs) = ProjectDirs::from("pl", "Qarmin", "Krokiet") else {
return None;
};
let config_folder = configs.config_dir();
let config_file = config_folder.join(format!("config_preset_{number}.json"));
Some(config_file)
}
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);
}
pub fn set_settings_to_gui(app: &MainWindow, custom_settings: &SettingsCustom) {
let settings = app.global::<Settings>();
@ -131,6 +212,20 @@ pub fn collect_settings(app: &MainWindow) -> SettingsCustom {
}
}
pub fn collect_base_settings(app: &MainWindow) -> BasicSettings {
let settings = app.global::<Settings>();
let default_preset = settings.get_settings_preset_idx();
let preset_names = settings.get_settings_presets().iter().map(|x| x.to_string()).collect::<Vec<_>>();
assert_eq!(preset_names.len(), 10);
BasicSettings {
language: "en".to_string(),
default_preset,
preset_names,
}
}
fn default_included_directories() -> Vec<PathBuf> {
let mut included_directories = vec![];
if let Ok(current_dir) = env::current_dir() {
@ -156,3 +251,16 @@ fn default_excluded_directories() -> Vec<PathBuf> {
fn default_excluded_items() -> String {
DEFAULT_EXCLUDED_ITEMS.to_string()
}
fn default_language() -> String {
"en".to_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",
]
.iter()
.map(|x| x.to_string())
.collect::<Vec<_>>()
}

View file

@ -110,12 +110,12 @@ export component LeftSidePanel {
}
HorizontalLayout {
padding-bottom: 2px;
padding-right: 3px;
alignment: end;
Button {
height: 50px;
width: self.height;
min-width: 20px;
min-height: 20px;
max-height: self.width;
preferred-height: self.width;
icon: @image-url("../icons/settings.svg");
clicked => {
active_tab = CurrentTab.Settings;

View file

@ -26,7 +26,7 @@ component MinMaxSizeComponent inherits HorizontalLayout {
spacing: 20px;
Text {
horizontal-stretch: 0.0;
text:"Items Size";
text:"Items Size(Kb)";
vertical-alignment: TextVerticalAlignment.center;
}
HorizontalLayout {