From fd7298d24e937c5228e086f35e519fc0dc8634f8 Mon Sep 17 00:00:00 2001 From: Simon Gellis Date: Thu, 9 Jan 2025 23:00:46 -0500 Subject: [PATCH] Add a checkbox to quit on disconnect --- src/app.rs | 10 +++++++--- src/window.rs | 5 +++++ src/window/game.rs | 12 +++++++++--- src/window/gdb.rs | 21 ++++++++++++++++----- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/app.rs b/src/app.rs index a421b5e..a326620 100644 --- a/src/app.rs +++ b/src/app.rs @@ -211,8 +211,12 @@ impl ApplicationHandler for Application { ); self.open(event_loop, Box::new(p2)); } - UserEvent::Quit => { - event_loop.exit(); + UserEvent::Quit(sim_id) => { + self.viewports + .retain(|_, viewport| viewport.app.sim_id() != sim_id); + if !self.viewports.contains_key(&ViewportId::ROOT) { + event_loop.exit(); + } } } } @@ -401,7 +405,7 @@ pub enum UserEvent { OpenDebugger(SimId), OpenInput, OpenPlayer2, - Quit, + Quit(SimId), } pub enum Action { diff --git a/src/window.rs b/src/window.rs index b60e9c3..85048ff 100644 --- a/src/window.rs +++ b/src/window.rs @@ -5,6 +5,8 @@ pub use gdb::GdbServerWindow; pub use input::InputWindow; use winit::event::KeyEvent; +use crate::emulator::SimId; + mod about; mod game; mod game_screen; @@ -13,6 +15,9 @@ mod input; pub trait AppWindow { fn viewport_id(&self) -> ViewportId; + fn sim_id(&self) -> SimId { + SimId::Player1 + } fn initial_viewport(&self) -> ViewportBuilder; fn show(&mut self, ctx: &Context); fn on_init(&mut self, render_state: &egui_wgpu::RenderState) { diff --git a/src/window/game.rs b/src/window/game.rs index a1ecebd..dd83dc5 100644 --- a/src/window/game.rs +++ b/src/window/game.rs @@ -78,19 +78,20 @@ impl GameWindow { ui.close_menu(); } if ui.button("Quit").clicked() { - ctx.send_viewport_cmd(ViewportCommand::Close); + let _ = self.proxy.send_event(UserEvent::Quit(self.sim_id)); } }); ui.menu_button("Emulation", |ui| { let state = self.client.emulator_state(); let is_ready = self.client.sim_state(self.sim_id) == SimState::Ready; let can_pause = is_ready && state == EmulatorState::Running; + let can_resume = is_ready && state == EmulatorState::Paused; if state == EmulatorState::Running { - if ui.add_enabled(is_ready, Button::new("Pause")).clicked() { + if ui.add_enabled(can_pause, Button::new("Pause")).clicked() { self.client.send_command(EmulatorCommand::Pause); ui.close_menu(); } - } else if ui.add_enabled(can_pause, Button::new("Resume")).clicked() { + } else if ui.add_enabled(can_resume, Button::new("Resume")).clicked() { self.client.send_command(EmulatorCommand::Resume); ui.close_menu(); } @@ -317,6 +318,10 @@ impl AppWindow for GameWindow { } } + fn sim_id(&self) -> SimId { + self.sim_id + } + fn initial_viewport(&self) -> ViewportBuilder { ViewportBuilder::default() .with_title("Lemur") @@ -380,6 +385,7 @@ impl AppWindow for GameWindow { if self.sim_id == SimId::Player2 { self.client.send_command(EmulatorCommand::StopSecondSim); } + let _ = self.proxy.send_event(UserEvent::Quit(self.sim_id)); } } diff --git a/src/window/gdb.rs b/src/window/gdb.rs index e384eb2..50d1910 100644 --- a/src/window/gdb.rs +++ b/src/window/gdb.rs @@ -12,7 +12,8 @@ use super::AppWindow; pub struct GdbServerWindow { sim_id: SimId, port_str: String, - launched: bool, + connected: bool, + quit_on_disconnect: bool, server: GdbServer, proxy: EventLoopProxy, } @@ -22,7 +23,8 @@ impl GdbServerWindow { Self { sim_id, port_str: (8080 + sim_id.to_index()).to_string(), - launched: false, + connected: false, + quit_on_disconnect: false, server: GdbServer::new(sim_id, client), proxy, } @@ -31,8 +33,9 @@ impl GdbServerWindow { pub fn launch(&mut self, port: u16) { self.server.stop(); self.port_str = port.to_string(); - self.launched = true; + self.quit_on_disconnect = true; self.server.start(port); + self.connected = true; } } @@ -41,6 +44,10 @@ impl AppWindow for GdbServerWindow { ViewportId::from_hash_of(format!("Debugger-{}", self.sim_id)) } + fn sim_id(&self) -> SimId { + self.sim_id + } + fn initial_viewport(&self) -> ViewportBuilder { ViewportBuilder::default() .with_title(format!("GDB Server ({})", self.sim_id)) @@ -61,16 +68,20 @@ impl AppWindow for GdbServerWindow { ui.label("Port"); let port_editor = TextEdit::singleline(&mut self.port_str).desired_width(100.0); ui.add_enabled(!status.running(), port_editor); + ui.checkbox(&mut self.quit_on_disconnect, "Quit on disconnect"); }); if !status.running() { - if self.launched { - self.proxy.send_event(UserEvent::Quit).unwrap(); + if self.connected && self.quit_on_disconnect { + self.proxy.send_event(UserEvent::Quit(self.sim_id)).unwrap(); + } else { + self.connected = false; } let start_button = Button::new("Start"); if ui.add_enabled(port_num.is_some(), start_button).clicked() { let port = port_num.unwrap(); self.server.start(port); + self.connected = true; } } else { let stop_button = Button::new("Stop");