1
0
Fork 0
mirror of synced 2024-05-17 19:03:08 +12:00
This commit is contained in:
Rafał Mikrut 2023-11-01 21:52:25 +01:00
parent 0be1d3f291
commit adb905f9b7
7 changed files with 744 additions and 84 deletions

677
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -27,6 +27,7 @@ chrono = "0.4.31"
open = "5.0.0"
crossbeam-channel = "0.5.8"
handsome_logger = "0.8.0"
rfd = { version = "0.12.0", default-features = false, features = ["xdg-portal"] }
[build-dependencies]
#slint-build = "1.2.2"

View file

@ -0,0 +1,46 @@
use crate::{MainWindow, Settings};
use rfd::FileDialog;
use slint::{ComponentHandle, Model, ModelRc, VecModel};
pub fn connect_add_directories(app: &MainWindow) {
let a = app.as_weak();
app.on_folder_choose_requested(move |included_directories| {
let app = a.upgrade().unwrap();
let directory = std::env::current_dir().unwrap_or(std::path::PathBuf::from("/"));
let file_dialog = FileDialog::new().set_directory(directory);
let Some(folders) = file_dialog.pick_folders() else {
return;
};
let settings = app.global::<Settings>();
let old_folders = if included_directories {
settings.get_included_directories()
} else {
settings.get_excluded_directories()
};
let mut new_folders = old_folders.iter().map(|x| x.text.to_string()).collect::<Vec<_>>();
new_folders.extend(folders.iter().map(|x| x.to_string_lossy().to_string()));
new_folders.sort();
new_folders.dedup();
let new_folders_standard_list_view = new_folders
.iter()
.map(|x| {
let mut element = slint::StandardListViewItem::default();
element.text = slint::SharedString::from(x.to_string());
element
})
.collect::<Vec<_>>();
let new_folders_model = ModelRc::new(VecModel::from(new_folders_standard_list_view));
if included_directories {
settings.set_included_directories(new_folders_model);
} else {
settings.set_excluded_directories(new_folders_model);
}
});
}

View file

@ -14,6 +14,7 @@
mod common;
mod connect_delete;
mod connect_directories_changes;
mod connect_open;
mod connect_progress_receiver;
mod connect_scan;
@ -28,6 +29,7 @@ use crate::connect_delete::connect_delete_button;
use crate::connect_open::connect_open_items;
use crate::connect_scan::connect_scan_button;
use crate::connect_directories_changes::connect_add_directories;
use crate::connect_progress_receiver::connect_progress_gathering;
use crate::connect_stop::connect_stop_button;
use crate::settings::reset_settings;
@ -51,6 +53,7 @@ fn main() {
connect_stop_button(&app, stop_sender);
connect_open_items(&app);
connect_progress_gathering(&app, progress_receiver);
connect_add_directories(&app);
reset_settings(&app);

View file

@ -17,7 +17,7 @@ export component VisibilityButton inherits Button {
}
}
export component ActionButtons {
export component ActionButtons inherits HorizontalLayout {
callback deleted;
callback scan_stopping;
callback scan_starting(CurrentTab);
@ -26,47 +26,55 @@ export component ActionButtons {
in-out property <bool> stop_requested: false;
in-out property <bool> scanning;
in-out property <CurrentTab> active-tab;
out property <int> name;
height: 30px;
spacing: 4px;
HorizontalBox {
height: 50px;
scan_button:= Button {
enabled: !scanning;
text: "Scan";
clicked => {
root.scanning = true;
root.scan_starting(active-tab);
}
}
stop_button:= Button {
enabled: scanning && !stop_requested;
text: "Stop";
clicked => {
root.scan_stopping();
root.stop_requested = true;
}
}
delete_button:= Button {
enabled: !scanning;
text: "Delete";
clicked => {
root.deleted();
}
}
VisibilityButton {
button-visibility: BottomPanelVisibility.Directories;
bottom_panel_visibility <=> bottom_panel_visibility;
text: "Dirs";
}
VisibilityButton {
button-visibility: BottomPanelVisibility.NotVisible;
bottom_panel_visibility <=> bottom_panel_visibility;
text: "NotVS";
}
VisibilityButton {
button-visibility: BottomPanelVisibility.TextErrors;
bottom_panel_visibility <=> bottom_panel_visibility;
text: "Text";
scan_button:= Button {
height: parent.height;
enabled: !scanning;
text: "Scan";
clicked => {
root.scanning = true;
root.scan_starting(active-tab);
}
}
stop_button:= Button {
height: parent.height;
enabled: scanning && !stop_requested;
text: "Stop";
clicked => {
root.scan_stopping();
root.stop_requested = true;
}
}
delete_button:= Button {
height: parent.height;
enabled: !scanning;
text: "Delete";
clicked => {
root.deleted();
}
}
VisibilityButton {
height: parent.height;
button-visibility: BottomPanelVisibility.Directories;
bottom_panel_visibility <=> bottom_panel_visibility;
text: "Dirs";
}
VisibilityButton {
height: parent.height;
button-visibility: BottomPanelVisibility.NotVisible;
bottom_panel_visibility <=> bottom_panel_visibility;
text: "NotVS";
}
VisibilityButton {
height: parent.height;
button-visibility: BottomPanelVisibility.TextErrors;
bottom_panel_visibility <=> bottom_panel_visibility;
text: "Text";
}
}

View file

@ -5,12 +5,16 @@ import {BottomPanelVisibility} from "common.slint";
component DirectoriesPanel {
out property <length> buttonSize: 75px;
callback folder-choose-requested(bool);
HorizontalLayout {
VerticalLayout {
width: buttonSize;
Button {
text: "Add";
clicked => {
folder-choose-requested(true);
}
}
Button {
text: "Remove";
@ -33,6 +37,9 @@ component DirectoriesPanel {
width: buttonSize;
Button {
text: "Add";
clicked => {
folder-choose-requested(false);
}
}
Button {
text: "Remove";
@ -62,6 +69,7 @@ component TextErrorsPanel {
export component BottomPanel {
in-out property <BottomPanelVisibility> bottom_panel_visibility: BottomPanelVisibility.Directories;
callback folder-choose-requested(bool);
min-height: bottom-panel-visibility == BottomPanelVisibility.NotVisible ? 0px : 150px;
min-width: bottom-panel-visibility == BottomPanelVisibility.NotVisible ? 0px : 400px;
@ -69,6 +77,7 @@ export component BottomPanel {
if bottom-panel-visibility == BottomPanelVisibility.Directories: DirectoriesPanel {
width: parent.width;
height: parent.height;
folder-choose-requested(included-directories) => {root.folder-choose-requested(included-directories)}
}
if bottom-panel-visibility == BottomPanelVisibility.TextErrors : TextErrorsPanel {
width: parent.width;

View file

@ -16,6 +16,7 @@ export component MainWindow inherits Window {
callback scan_stopping;
callback scan_starting(CurrentTab);
callback item_opened(string);
callback folder-choose-requested(bool);
callback scan_ended();
@ -117,6 +118,7 @@ export component MainWindow inherits Window {
BottomPanel {
bottom-panel-visibility <=> action_buttons.bottom-panel-visibility;
vertical-stretch: 0.0;
folder-choose-requested(included-directories) => {root.folder-choose-requested(included-directories)}
}
}