Settings
This commit is contained in:
parent
4f65c9193a
commit
ea29b65c11
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -3322,6 +3322,8 @@ dependencies = [
|
|||
"open",
|
||||
"rand",
|
||||
"rfd",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"slint",
|
||||
"slint-build",
|
||||
]
|
||||
|
|
|
@ -35,6 +35,8 @@ handsome_logger = "0.8.0"
|
|||
rfd = { version = "0.12.0", default-features = false, features = ["xdg-portal"] }
|
||||
home = "0.5.5"
|
||||
log = "0.4.20"
|
||||
serde = "1.0"
|
||||
serde_json = "1.0"
|
||||
|
||||
[build-dependencies]
|
||||
#slint-build = "1.2.2"
|
||||
|
@ -43,7 +45,7 @@ slint-build = { git = "https://github.com/slint-ui/slint.git" }
|
|||
|
||||
[features]
|
||||
# TODO remove from deault features skia, because is harder to cross-compile it
|
||||
default = ["winit_femtovg", "winit_software", "winit_skia_opengl"]
|
||||
default = ["winit_femtovg", "winit_software"]
|
||||
skia_opengl = ["slint/renderer-skia-opengl"]
|
||||
skia_vulkan = ["slint/renderer-skia-vulkan"]
|
||||
software = ["slint/renderer-software"]
|
||||
|
|
|
@ -1,11 +1,23 @@
|
|||
use slint::{ModelRc, SharedString, StandardListViewItem, VecModel};
|
||||
use std::path::PathBuf;
|
||||
|
||||
pub fn create_string_standard_list_view(items: &[String]) -> ModelRc<StandardListViewItem> {
|
||||
// pub fn create_string_standard_list_view(items: &[String]) -> ModelRc<StandardListViewItem> {
|
||||
// let new_folders_standard_list_view = items
|
||||
// .iter()
|
||||
// .map(|x| {
|
||||
// let mut element = StandardListViewItem::default();
|
||||
// element.text = SharedString::from(x.to_string());
|
||||
// element
|
||||
// })
|
||||
// .collect::<Vec<_>>();
|
||||
// ModelRc::new(VecModel::from(new_folders_standard_list_view))
|
||||
// }
|
||||
pub fn create_string_standard_list_view_from_pathbuf(items: &[PathBuf]) -> ModelRc<StandardListViewItem> {
|
||||
let new_folders_standard_list_view = items
|
||||
.iter()
|
||||
.map(|x| {
|
||||
let mut element = StandardListViewItem::default();
|
||||
element.text = SharedString::from(x.to_string());
|
||||
element.text = SharedString::from(x.to_string_lossy().to_string());
|
||||
element
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
|
|
@ -2,8 +2,7 @@ use std::borrow::Borrow;
|
|||
|
||||
use slint::{ComponentHandle, Model, ModelRc, VecModel};
|
||||
|
||||
use crate::MainListModel;
|
||||
use crate::{CurrentTab, MainWindow};
|
||||
use crate::{CurrentTab, MainListModel, MainWindow};
|
||||
use log::info;
|
||||
|
||||
pub fn connect_delete_button(app: &MainWindow) {
|
||||
|
|
|
@ -24,7 +24,7 @@ fn connect_add_manual_directories(app: &MainWindow) {
|
|||
let mut included_model = included_model.iter().collect::<Vec<_>>();
|
||||
included_model.extend(non_empty_lines.iter().map(|x| {
|
||||
let mut element = slint::StandardListViewItem::default();
|
||||
element.text = slint::SharedString::from(x.to_string());
|
||||
element.text = slint::SharedString::from((*x).to_string());
|
||||
element
|
||||
}));
|
||||
included_model.sort_by_cached_key(|x| x.text.to_string());
|
||||
|
@ -35,7 +35,7 @@ fn connect_add_manual_directories(app: &MainWindow) {
|
|||
let mut excluded_model = excluded_model.iter().collect::<Vec<_>>();
|
||||
excluded_model.extend(non_empty_lines.iter().map(|x| {
|
||||
let mut element = slint::StandardListViewItem::default();
|
||||
element.text = slint::SharedString::from(x.to_string());
|
||||
element.text = slint::SharedString::from((*x).to_string());
|
||||
element
|
||||
}));
|
||||
excluded_model.sort_by_cached_key(|x| x.text.to_string());
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
use crate::MainListModel;
|
||||
use crate::{CurrentTab, MainWindow, ProgressToSend};
|
||||
use crate::settings::{collect_settings, SettingsCustom};
|
||||
use crate::{CurrentTab, MainListModel, MainWindow, ProgressToSend};
|
||||
use chrono::NaiveDateTime;
|
||||
use crossbeam_channel::{Receiver, Sender};
|
||||
use czkawka_core::common::split_path;
|
||||
use czkawka_core::common_dir_traversal::ProgressData;
|
||||
use czkawka_core::common_tool::CommonData;
|
||||
use czkawka_core::common_traits::ResultEntry;
|
||||
use czkawka_core::empty_files::EmptyFiles;
|
||||
use czkawka_core::empty_folder::EmptyFolder;
|
||||
use slint::{ComponentHandle, ModelRc, SharedString, VecModel, Weak};
|
||||
use std::path::PathBuf;
|
||||
|
@ -24,25 +26,67 @@ pub fn connect_scan_button(app: &MainWindow, progress_sender: Sender<ProgressDat
|
|||
step_name: SharedString::from(""),
|
||||
});
|
||||
|
||||
let custom_settings = collect_settings(&app);
|
||||
|
||||
let a = app.as_weak();
|
||||
match active_tab {
|
||||
CurrentTab::EmptyFolders => {
|
||||
scan_empty_folders(a, progress_sender, stop_receiver);
|
||||
scan_empty_folders(a, progress_sender, stop_receiver, custom_settings);
|
||||
}
|
||||
CurrentTab::EmptyFiles => {
|
||||
scan_empty_files(a, progress_sender, stop_receiver, custom_settings);
|
||||
}
|
||||
_ => panic!(),
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
fn scan_empty_folders(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>, stop_receiver: Receiver<()>) {
|
||||
fn scan_empty_files(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>, stop_receiver: Receiver<()>, custom_settings: SettingsCustom) {
|
||||
thread::spawn(move || {
|
||||
let mut ef = EmptyFolder::new();
|
||||
ef.set_included_directory(vec![PathBuf::from("/home/rafal/Desktop")]);
|
||||
ef.find_empty_folders(Some(&stop_receiver), Some(&progress_sender));
|
||||
let mut finder = EmptyFiles::new();
|
||||
finder.set_included_directory(custom_settings.included_directories.clone());
|
||||
finder.set_excluded_directory(custom_settings.excluded_directories.clone());
|
||||
finder.find_empty_files(Some(&stop_receiver), Some(&progress_sender));
|
||||
|
||||
ef.get_empty_folder_list();
|
||||
let mut vector = finder.get_empty_files().clone();
|
||||
|
||||
let mut vector = ef.get_empty_folder_list().keys().cloned().collect::<Vec<PathBuf>>();
|
||||
vector.sort_unstable_by_key(|e| {
|
||||
let t = split_path(e.get_path());
|
||||
(t.0, t.1)
|
||||
});
|
||||
|
||||
a.upgrade_in_event_loop(move |app| {
|
||||
let items = Rc::new(VecModel::default());
|
||||
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()),
|
||||
]);
|
||||
|
||||
let main = MainListModel {
|
||||
checked: false,
|
||||
header_row: false,
|
||||
selected_row: false,
|
||||
val: ModelRc::new(data_model),
|
||||
};
|
||||
items.push(main);
|
||||
}
|
||||
app.set_empty_files_model(items.into());
|
||||
app.invoke_scan_ended();
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
fn scan_empty_folders(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>, stop_receiver: Receiver<()>, custom_settings: SettingsCustom) {
|
||||
thread::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());
|
||||
finder.find_empty_folders(Some(&stop_receiver), Some(&progress_sender));
|
||||
|
||||
let mut vector = finder.get_empty_folder_list().keys().cloned().collect::<Vec<PathBuf>>();
|
||||
|
||||
vector.sort_unstable_by_key(|e| {
|
||||
let t = split_path(e.as_path());
|
||||
|
@ -50,7 +94,7 @@ fn scan_empty_folders(a: Weak<MainWindow>, progress_sender: Sender<ProgressData>
|
|||
});
|
||||
|
||||
a.upgrade_in_event_loop(move |app| {
|
||||
let folder_map = ef.get_empty_folder_list();
|
||||
let folder_map = finder.get_empty_folder_list();
|
||||
let items = Rc::new(VecModel::default());
|
||||
for path in vector {
|
||||
let (directory, file) = split_path(&path);
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
use crate::MainWindow;
|
||||
use std::env;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use crate::common::create_string_standard_list_view;
|
||||
use crate::common::create_string_standard_list_view_from_pathbuf;
|
||||
use crate::Settings;
|
||||
use home::home_dir;
|
||||
use slint::{ComponentHandle, SharedString};
|
||||
use slint::{ComponentHandle, Model, SharedString};
|
||||
|
||||
#[cfg(target_family = "unix")]
|
||||
const DEFAULT_EXCLUDED_DIRECTORIES: &[&str] = &["/proc", "/dev", "/sys", "/run", "/snap"];
|
||||
|
@ -12,30 +13,65 @@ const DEFAULT_EXCLUDED_DIRECTORIES: &[&str] = &["/proc", "/dev", "/sys", "/run",
|
|||
const DEFAULT_EXCLUDED_DIRECTORIES: &[&str] = &["C:\\Windows"];
|
||||
|
||||
pub fn reset_settings(app: &MainWindow) {
|
||||
let settings = app.global::<Settings>();
|
||||
|
||||
// app.width(1000);
|
||||
app.invoke_set_console_text(SharedString::from(""));
|
||||
|
||||
set_settings_to_gui(app, &SettingsCustom::default());
|
||||
}
|
||||
|
||||
pub fn set_settings_to_gui(app: &MainWindow, custom_settings: &SettingsCustom) {
|
||||
let settings = app.global::<Settings>();
|
||||
|
||||
// Included directories
|
||||
let mut included_directories = vec![];
|
||||
if let Ok(current_dir) = env::current_dir() {
|
||||
included_directories.push(current_dir.to_string_lossy().to_string());
|
||||
} else if let Some(home_dir) = home_dir() {
|
||||
included_directories.push(home_dir.to_string_lossy().to_string());
|
||||
} else if cfg!(target_family = "unix") {
|
||||
included_directories.push("/".to_string());
|
||||
} else {
|
||||
// This could be set to default
|
||||
included_directories.push("C:\\".to_string());
|
||||
};
|
||||
included_directories.sort();
|
||||
let included_items = create_string_standard_list_view(&included_directories);
|
||||
let included_items = create_string_standard_list_view_from_pathbuf(&custom_settings.included_directories);
|
||||
settings.set_included_directories(included_items);
|
||||
|
||||
// Excluded directories
|
||||
let mut excluded_directories = DEFAULT_EXCLUDED_DIRECTORIES.iter().map(|x| (*x).to_string()).collect::<Vec<_>>();
|
||||
excluded_directories.sort();
|
||||
let excluded_items = create_string_standard_list_view(&excluded_directories);
|
||||
let excluded_items = create_string_standard_list_view_from_pathbuf(&custom_settings.excluded_directories);
|
||||
settings.set_excluded_directories(excluded_items);
|
||||
}
|
||||
|
||||
pub struct SettingsCustom {
|
||||
pub included_directories: Vec<PathBuf>,
|
||||
pub excluded_directories: Vec<PathBuf>,
|
||||
}
|
||||
|
||||
impl Default for SettingsCustom {
|
||||
fn default() -> Self {
|
||||
let mut included_directories = vec![];
|
||||
if let Ok(current_dir) = env::current_dir() {
|
||||
included_directories.push(current_dir.to_string_lossy().to_string());
|
||||
} else if let Some(home_dir) = home_dir() {
|
||||
included_directories.push(home_dir.to_string_lossy().to_string());
|
||||
} else if cfg!(target_family = "unix") {
|
||||
included_directories.push("/".to_string());
|
||||
} else {
|
||||
// This could be set to default
|
||||
included_directories.push("C:\\".to_string());
|
||||
};
|
||||
included_directories.sort();
|
||||
let included_directories = included_directories.iter().map(PathBuf::from).collect::<Vec<_>>();
|
||||
|
||||
let mut excluded_directories = DEFAULT_EXCLUDED_DIRECTORIES.iter().map(PathBuf::from).collect::<Vec<_>>();
|
||||
excluded_directories.sort();
|
||||
|
||||
Self {
|
||||
included_directories,
|
||||
excluded_directories,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn collect_settings(app: &MainWindow) -> SettingsCustom {
|
||||
let settings = app.global::<Settings>();
|
||||
|
||||
let included_directories = settings.get_included_directories();
|
||||
let included_directories = included_directories.iter().map(|x| PathBuf::from(x.text.as_str())).collect::<Vec<_>>();
|
||||
|
||||
let excluded_directories = settings.get_excluded_directories();
|
||||
let excluded_directories = excluded_directories.iter().map(|x| PathBuf::from(x.text.as_str())).collect::<Vec<_>>();
|
||||
|
||||
SettingsCustom {
|
||||
included_directories,
|
||||
excluded_directories,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -135,14 +135,8 @@ export component MainWindow inherits Window {
|
|||
property <bool> included_directories;
|
||||
private property <string> text_data;
|
||||
|
||||
callback set_included_directories(bool);
|
||||
|
||||
close-on-click: false;
|
||||
|
||||
set-included-directories(included-directories) => {
|
||||
self.included-directories = included-directories;
|
||||
}
|
||||
|
||||
HorizontalLayout {
|
||||
alignment: LayoutAlignment.center;
|
||||
VerticalLayout {
|
||||
|
|
Loading…
Reference in a new issue