1
0
Fork 0
mirror of synced 2024-06-01 18:19:46 +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" open = "5.0.0"
crossbeam-channel = "0.5.8" crossbeam-channel = "0.5.8"
handsome_logger = "0.8.0" handsome_logger = "0.8.0"
rfd = { version = "0.12.0", default-features = false, features = ["xdg-portal"] }
[build-dependencies] [build-dependencies]
#slint-build = "1.2.2" #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 common;
mod connect_delete; mod connect_delete;
mod connect_directories_changes;
mod connect_open; mod connect_open;
mod connect_progress_receiver; mod connect_progress_receiver;
mod connect_scan; mod connect_scan;
@ -28,6 +29,7 @@ use crate::connect_delete::connect_delete_button;
use crate::connect_open::connect_open_items; use crate::connect_open::connect_open_items;
use crate::connect_scan::connect_scan_button; 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_progress_receiver::connect_progress_gathering;
use crate::connect_stop::connect_stop_button; use crate::connect_stop::connect_stop_button;
use crate::settings::reset_settings; use crate::settings::reset_settings;
@ -51,6 +53,7 @@ fn main() {
connect_stop_button(&app, stop_sender); connect_stop_button(&app, stop_sender);
connect_open_items(&app); connect_open_items(&app);
connect_progress_gathering(&app, progress_receiver); connect_progress_gathering(&app, progress_receiver);
connect_add_directories(&app);
reset_settings(&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 deleted;
callback scan_stopping; callback scan_stopping;
callback scan_starting(CurrentTab); callback scan_starting(CurrentTab);
@ -26,47 +26,55 @@ export component ActionButtons {
in-out property <bool> stop_requested: false; in-out property <bool> stop_requested: false;
in-out property <bool> scanning; in-out property <bool> scanning;
in-out property <CurrentTab> active-tab; in-out property <CurrentTab> active-tab;
out property <int> name;
height: 30px;
spacing: 4px;
HorizontalBox { scan_button:= Button {
height: 50px; height: parent.height;
scan_button:= Button { enabled: !scanning;
enabled: !scanning; text: "Scan";
text: "Scan"; clicked => {
clicked => { root.scanning = true;
root.scanning = true; root.scan_starting(active-tab);
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";
} }
} }
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 { component DirectoriesPanel {
out property <length> buttonSize: 75px; out property <length> buttonSize: 75px;
callback folder-choose-requested(bool);
HorizontalLayout { HorizontalLayout {
VerticalLayout { VerticalLayout {
width: buttonSize; width: buttonSize;
Button { Button {
text: "Add"; text: "Add";
clicked => {
folder-choose-requested(true);
}
} }
Button { Button {
text: "Remove"; text: "Remove";
@ -33,6 +37,9 @@ component DirectoriesPanel {
width: buttonSize; width: buttonSize;
Button { Button {
text: "Add"; text: "Add";
clicked => {
folder-choose-requested(false);
}
} }
Button { Button {
text: "Remove"; text: "Remove";
@ -62,6 +69,7 @@ component TextErrorsPanel {
export component BottomPanel { export component BottomPanel {
in-out property <BottomPanelVisibility> bottom_panel_visibility: BottomPanelVisibility.Directories; in-out property <BottomPanelVisibility> bottom_panel_visibility: BottomPanelVisibility.Directories;
callback folder-choose-requested(bool);
min-height: bottom-panel-visibility == BottomPanelVisibility.NotVisible ? 0px : 150px; min-height: bottom-panel-visibility == BottomPanelVisibility.NotVisible ? 0px : 150px;
min-width: bottom-panel-visibility == BottomPanelVisibility.NotVisible ? 0px : 400px; min-width: bottom-panel-visibility == BottomPanelVisibility.NotVisible ? 0px : 400px;
@ -69,6 +77,7 @@ export component BottomPanel {
if bottom-panel-visibility == BottomPanelVisibility.Directories: DirectoriesPanel { if bottom-panel-visibility == BottomPanelVisibility.Directories: DirectoriesPanel {
width: parent.width; width: parent.width;
height: parent.height; height: parent.height;
folder-choose-requested(included-directories) => {root.folder-choose-requested(included-directories)}
} }
if bottom-panel-visibility == BottomPanelVisibility.TextErrors : TextErrorsPanel { if bottom-panel-visibility == BottomPanelVisibility.TextErrors : TextErrorsPanel {
width: parent.width; width: parent.width;

View file

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