diff --git a/components/Window.slint b/components/Window.slint index 20cb447..074ec35 100644 --- a/components/Window.slint +++ b/components/Window.slint @@ -1,12 +1,22 @@ import { Button, VerticalBox } from "std-widgets.slint"; +export global Globals { + //启动按钮状态 + in-out property StartEnable: false; + //停止按钮状态 + in-out property StopEnable: false; +} + export component MainWindow inherits Window { + title: "VoileTftpTools"; + icon: @image-url("../tftp.png"); height: 180px; width: 320px; - title: "VoileTftpTools"; default-font-family: "Segoe UI"; default-font-size: 16px; default-font-weight: 700; + in-out property StartEnable <=> Globals.StartEnable; + in-out property StopEnable <=> Globals.StopEnable; //选择路径回调 callback BrowserFolder() -> string; property SelectFolder: ""; @@ -39,6 +49,7 @@ export component MainWindow inherits Window { height: parent.height; width: parent.width; text: "启动"; + enabled: StartEnable; clicked => { StartTftp(); } @@ -54,6 +65,7 @@ export component MainWindow inherits Window { height: parent.height; width: parent.width; text: "停止"; + enabled: StopEnable; clicked => { StopTftp(); } diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..f78fda6 --- /dev/null +++ b/config.toml @@ -0,0 +1,2 @@ +[build] +rustflags = ["-C", "link-arg=resource.res"] \ No newline at end of file diff --git a/logo.ico b/logo.ico new file mode 100644 index 0000000..6abbaed Binary files /dev/null and b/logo.ico differ diff --git a/resource.rc b/resource.rc new file mode 100644 index 0000000..8904c5a --- /dev/null +++ b/resource.rc @@ -0,0 +1 @@ +0001 ICON "logo.ico" \ No newline at end of file diff --git a/resource.res b/resource.res new file mode 100644 index 0000000..ab3084b Binary files /dev/null and b/resource.res differ diff --git a/src/main.rs b/src/main.rs index 1b3d25e..c943513 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +#![windows_subsystem = "windows"] use async_tftp::server::TftpServerBuilder; use async_tftp::Result; use rfd::FileDialog; @@ -10,7 +11,6 @@ slint::include_modules!(); struct ServerState { abort_handle: Option, } - async fn start_tftp_server(dir: PathBuf) -> Result<(JoinHandle<()>, AbortHandle)> { let task = tokio::spawn(async move { println!("Starting TFTP server at: {:?}", dir); @@ -34,39 +34,70 @@ async fn main() { let state = Arc::new(Mutex::new(ServerState { abort_handle: None })); let folder_path = Arc::new(Mutex::new(String::new())); let path_clone = folder_path.clone(); + let ui_weak = ui.as_weak(); //选择路径按钮的回调函数 ui.on_BrowserFolder(move || { let result = FileDialog::new() .set_directory("/") .pick_folder(); - let path = result.map(|p| p.to_string_lossy().into_owned()) + let mut path = result.map(|p| p.to_string_lossy().into_owned()) .unwrap_or_default(); + if path == "" { + println!("TFTP Dir Empty !"); + if let Some(ui) = ui_weak.upgrade() { + ui.set_StartEnable(false); + } + path = String::from(""); + } + else { + if let Some(ui) = ui_weak.upgrade() { + ui.set_StartEnable(true); + } + } *path_clone.lock().unwrap() = path.clone(); // 存储到变量 SharedString::from(path) }); //启动按钮的回调函数 let state_clone = state.clone(); let path_clone = Arc::clone(&folder_path); + let ui_weak = ui.as_weak(); ui.on_StartTftp(move || { - // let Dir = PathBuf::from("C:/Users/anonymous/Desktop/Rust/VoiletTftp/target/release"); let dir = PathBuf::from(&*path_clone.lock().unwrap()); - println!("{:?}",dir); - let state = state_clone.clone(); - tokio::spawn(async move { - match start_tftp_server(dir).await { - Ok((_handle, abort_handle)) => { - println!("Server started"); - // 存储 abort_handle 以便停止 - state.lock().unwrap().abort_handle = Some(abort_handle); - } - Err(e) => eprintln!("Error: {}", e), + if dir.iter().count() == 0 { + println!("TFTP Dir Empty !"); + if let Some(ui) = ui_weak.upgrade() { + ui.set_StartEnable(true); + ui.set_StopEnable(false); } - }); + } + else { + if let Some(ui) = ui_weak.upgrade() { + ui.set_StartEnable(false); + ui.set_StopEnable(true); + } + println!("{:?}",dir); + let state = state_clone.clone(); + tokio::spawn(async move { + match start_tftp_server(dir).await { + Ok((_handle, abort_handle)) => { + println!("Server started"); + // 存储 abort_handle 以便停止 + state.lock().unwrap().abort_handle = Some(abort_handle); + } + Err(e) => eprintln!("Error: {}", e), + } + }); + } }); //停止按钮的回调函数 + let ui_weak = ui.as_weak(); let state_clone = state.clone(); ui.on_StopTftp(move || { + if let Some(ui) = ui_weak.upgrade() { + ui.set_StartEnable(true); + ui.set_StopEnable(false); + } if let Some(handle) = state_clone.lock().unwrap().abort_handle.take() { handle.abort(); println!("Server stopped"); diff --git a/tftp.png b/tftp.png new file mode 100644 index 0000000..d3a5244 Binary files /dev/null and b/tftp.png differ