Async
This commit is contained in:
parent
0be1d3f291
commit
adb905f9b7
677
Cargo.lock
generated
677
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -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"
|
||||
|
|
46
czkawka_slint_gui/src/connect_directories_changes.rs
Normal file
46
czkawka_slint_gui/src/connect_directories_changes.rs
Normal 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);
|
||||
}
|
||||
});
|
||||
}
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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)}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue