Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 0 additions & 20 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ i-slint-backend-winit = "1.15.1"
image = "0.25.10"
interprocess = { version = "2.4.0", features = ["tokio"] }
itertools = "0.14.0"
mimalloc = "0.1.48"
mime_guess = "2.0.5"
open = "5.3.3"
parking_lot = { version = "0.12.5", features = ["serde"] }
Expand Down
17 changes: 7 additions & 10 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ use fast_down_gui::{
utils::{LogErr, show_task_dialog},
};
use file_alloc::init_fast_alloc;
use rfd::FileDialog;
use slint::{Model, ModelRc, ToSharedString, VecModel};
use std::{collections::HashSet, rc::Rc, sync::Arc};
use tracing::{info, level_filters::LevelFilter};
Expand All @@ -22,9 +21,6 @@ use tracing_appender::{
use tracing_subscriber::{EnvFilter, Registry, fmt, layer::SubscriberExt, util::SubscriberInitExt};
use url::Url;

#[global_allocator]
static GLOBAL_ALLOCATOR: mimalloc::MiMalloc = mimalloc::MiMalloc;

const VERSION: &str = env!("CARGO_PKG_VERSION");

fn init_tracing() -> WorkerGuard {
Expand Down Expand Up @@ -120,13 +116,14 @@ async fn main() -> color_eyre::Result<()> {
let ui = ui.as_weak();
move || {
let ui = ui.clone();
std::thread::spawn(move || {
if let Some(folder) = FileDialog::new().pick_folder() {
let _ = ui.upgrade_in_event_loop(move |ui| {
ui.invoke_set_save_dir(folder.to_string_lossy().to_shared_string());
});
slint::spawn_local(async move {
if let Some(folder) = rfd::AsyncFileDialog::new().pick_folder().await
&& let Some(ui) = ui.upgrade()
{
ui.invoke_set_save_dir(folder.path().to_string_lossy().to_shared_string());
}
});
})
.unwrap();
}
});

Expand Down
53 changes: 9 additions & 44 deletions src/utils/dialog.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
use crate::ui::{DialogType, DownloadConfig, TaskDialog};
use crate::utils::LogErr;
#[cfg(target_os = "macos")]
use i_slint_backend_winit::WinitWindowAccessor;
use rfd::FileDialog;
#[cfg(target_os = "macos")]
use slint::CloseRequestResponse;
use slint::{ComponentHandle, SharedString, ToSharedString};

/// 显示添加任务对话框
Expand All @@ -20,52 +15,22 @@ pub fn show_task_dialog(
dialog.set_download_config(config);

let dialog_weak = dialog.as_weak();

#[cfg(not(target_os = "macos"))]
let hide_dialog = move || {
let _ = dialog_weak.upgrade_in_event_loop(|d| {
if let Some(d) = dialog_weak.upgrade() {
let _ = d.hide().log_err("隐藏窗口失败");
});
};
#[cfg(target_os = "macos")]
// TaskDialog.hide 方法在有 TouchBar 的 MacBook Pro 机型上调用会 remove 不存在的 Observer 导致程序崩溃
let hide_dialog = move || {
let _ = dialog_weak.upgrade_in_event_loop(move |d| {
let _ = slint::spawn_local(async move {
if let Ok(window) = d
.window()
.winit_window()
.await
.log_err("隐藏窗口失败 - 获取窗口失败")
{
window.set_visible(false);
}
})
.log_err("隐藏窗口失败 - 执行任务失败");
});
}
};

#[cfg(target_os = "macos")]
{
let hide_dialog_clone = hide_dialog.clone();
dialog.window().on_close_requested(move || {
hide_dialog_clone();
// 返回保持展示仅是为了绕过 slint 内置的隐藏策略 窗体由 hide_dialog_clone 隐藏
CloseRequestResponse::KeepWindowShown
});
}

dialog.on_canceled(hide_dialog.clone());

dialog.on_browse_folder({
let dialog = dialog.as_weak();
let dialog_weak = dialog.as_weak();
move || {
let dialog = dialog.clone();
std::thread::spawn(move || {
if let Some(folder) = FileDialog::new().pick_folder() {
let _ = dialog.upgrade_in_event_loop(move |d| {
d.invoke_set_save_dir(folder.to_string_lossy().to_shared_string());
});
let dialog_weak = dialog_weak.clone();
let _ = slint::spawn_local(async move {
if let Some(folder) = rfd::AsyncFileDialog::new().pick_folder().await
&& let Some(d) = dialog_weak.upgrade()
{
d.invoke_set_save_dir(folder.path().to_string_lossy().to_shared_string());
}
});
}
Expand Down