diff --git a/interface/src/gui.rs b/interface/src/gui.rs index a9ace36..205622a 100644 --- a/interface/src/gui.rs +++ b/interface/src/gui.rs @@ -1,16 +1,18 @@ -use std::cell::OnceCell; +use std::{cell::OnceCell, time::Duration}; use common::{ControlPacket, TelemetryPacket}; use eframe::egui::{self, containers, Align2, Checkbox, Context, Label}; -use tokio::sync::{mpsc, watch::Receiver}; +use tokio::{runtime::Runtime, sync::{mpsc, watch::Receiver}}; use egui_toast::{Toast, Toasts}; pub const GUI: OnceCell = OnceCell::new(); -pub fn gui(data: Receiver, toasts: mpsc::Receiver) -> eframe::Result { +pub fn gui(data: Receiver, toasts: mpsc::Receiver, executor: Runtime) -> eframe::Result { let options = eframe::NativeOptions { - viewport: egui::ViewportBuilder::default().with_inner_size([320.0, 240.0]), + viewport: egui::ViewportBuilder::default() + .with_inner_size([700.0, 480.0]) + .with_app_id("cruisecontrol"), ..Default::default() }; eframe::run_native( @@ -20,7 +22,7 @@ pub fn gui(data: Receiver, toasts: mpsc::Receiver) -> eframe::Re // This gives us image support: egui_extras::install_image_loaders(&cc.egui_ctx); - Ok(Box::new(GUI::with_receivers(data, toasts))) + Ok(Box::new(GUI::with_receivers(data, toasts, executor))) }), ) } @@ -34,13 +36,15 @@ pub struct GUIData { struct GUI { data: Receiver, toasts: mpsc::Receiver, + executor: Option, } impl GUI { - fn with_receivers(data: Receiver, toasts: mpsc::Receiver) -> Self { + fn with_receivers(data: Receiver, toasts: mpsc::Receiver, executor: Runtime) -> Self { Self { data, toasts, + executor: Some(executor), } } } @@ -74,5 +78,9 @@ impl eframe::App for GUI { } toasts.show(ctx); + + if ctx.input(|i| i.viewport().close_requested()) { + self.executor.take().unwrap().shutdown_timeout(Duration::from_millis(100)); + } } } diff --git a/interface/src/main.rs b/interface/src/main.rs index fd394ac..7d8a0aa 100644 --- a/interface/src/main.rs +++ b/interface/src/main.rs @@ -81,8 +81,9 @@ fn main() -> Result<()> { let (data_sender, gui_data) =watch::channel(GUIData::default()); + let spawner = executor.handle().clone(); thread::spawn(move || { - let control = executor.block_on(async { + let control = spawner.block_on(async { toast_sender.send(Toast::new().text("connecting to bot").kind(ToastKind::Info)).await.unwrap(); let cruisecontrol = TcpStream::connect("192.168.1.2:1234").await?; println!("connected"); @@ -95,11 +96,11 @@ fn main() -> Result<()> { Ok(control) }).unwrap(); - executor.block_on(controller(notes, control, data_sender.clone())).unwrap() + spawner.block_on(controller(notes, control, data_sender.clone())).unwrap() }); println!("launching gui"); - gui(gui_data, toasts).unwrap(); + gui(gui_data, toasts, executor).unwrap(); drop(stream);