1
0
Fork 0
mirror of synced 2024-05-17 19:03:08 +12:00
This commit is contained in:
Rafał Mikrut 2023-11-08 21:27:24 +01:00
parent 4f65c9193a
commit ea29b65c11
8 changed files with 133 additions and 44 deletions

2
Cargo.lock generated
View file

@ -3322,6 +3322,8 @@ dependencies = [
"open",
"rand",
"rfd",
"serde",
"serde_json",
"slint",
"slint-build",
]

View file

@ -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"]

View file

@ -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<_>>();

View file

@ -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) {

View file

@ -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());

View file

@ -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);

View file

@ -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,
}
}

View file

@ -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 {