Add a checkbox to quit on disconnect
This commit is contained in:
		
							parent
							
								
									d99344eb15
								
							
						
					
					
						commit
						fd7298d24e
					
				
							
								
								
									
										10
									
								
								src/app.rs
								
								
								
								
							
							
						
						
									
										10
									
								
								src/app.rs
								
								
								
								
							| 
						 | 
					@ -211,8 +211,12 @@ impl ApplicationHandler<UserEvent> for Application {
 | 
				
			||||||
                );
 | 
					                );
 | 
				
			||||||
                self.open(event_loop, Box::new(p2));
 | 
					                self.open(event_loop, Box::new(p2));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            UserEvent::Quit => {
 | 
					            UserEvent::Quit(sim_id) => {
 | 
				
			||||||
                event_loop.exit();
 | 
					                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),
 | 
					    OpenDebugger(SimId),
 | 
				
			||||||
    OpenInput,
 | 
					    OpenInput,
 | 
				
			||||||
    OpenPlayer2,
 | 
					    OpenPlayer2,
 | 
				
			||||||
    Quit,
 | 
					    Quit(SimId),
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub enum Action {
 | 
					pub enum Action {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,8 @@ pub use gdb::GdbServerWindow;
 | 
				
			||||||
pub use input::InputWindow;
 | 
					pub use input::InputWindow;
 | 
				
			||||||
use winit::event::KeyEvent;
 | 
					use winit::event::KeyEvent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::emulator::SimId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mod about;
 | 
					mod about;
 | 
				
			||||||
mod game;
 | 
					mod game;
 | 
				
			||||||
mod game_screen;
 | 
					mod game_screen;
 | 
				
			||||||
| 
						 | 
					@ -13,6 +15,9 @@ mod input;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub trait AppWindow {
 | 
					pub trait AppWindow {
 | 
				
			||||||
    fn viewport_id(&self) -> ViewportId;
 | 
					    fn viewport_id(&self) -> ViewportId;
 | 
				
			||||||
 | 
					    fn sim_id(&self) -> SimId {
 | 
				
			||||||
 | 
					        SimId::Player1
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    fn initial_viewport(&self) -> ViewportBuilder;
 | 
					    fn initial_viewport(&self) -> ViewportBuilder;
 | 
				
			||||||
    fn show(&mut self, ctx: &Context);
 | 
					    fn show(&mut self, ctx: &Context);
 | 
				
			||||||
    fn on_init(&mut self, render_state: &egui_wgpu::RenderState) {
 | 
					    fn on_init(&mut self, render_state: &egui_wgpu::RenderState) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -78,19 +78,20 @@ impl GameWindow {
 | 
				
			||||||
                ui.close_menu();
 | 
					                ui.close_menu();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if ui.button("Quit").clicked() {
 | 
					            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| {
 | 
					        ui.menu_button("Emulation", |ui| {
 | 
				
			||||||
            let state = self.client.emulator_state();
 | 
					            let state = self.client.emulator_state();
 | 
				
			||||||
            let is_ready = self.client.sim_state(self.sim_id) == SimState::Ready;
 | 
					            let is_ready = self.client.sim_state(self.sim_id) == SimState::Ready;
 | 
				
			||||||
            let can_pause = is_ready && state == EmulatorState::Running;
 | 
					            let can_pause = is_ready && state == EmulatorState::Running;
 | 
				
			||||||
 | 
					            let can_resume = is_ready && state == EmulatorState::Paused;
 | 
				
			||||||
            if state == EmulatorState::Running {
 | 
					            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);
 | 
					                    self.client.send_command(EmulatorCommand::Pause);
 | 
				
			||||||
                    ui.close_menu();
 | 
					                    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);
 | 
					                self.client.send_command(EmulatorCommand::Resume);
 | 
				
			||||||
                ui.close_menu();
 | 
					                ui.close_menu();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -317,6 +318,10 @@ impl AppWindow for GameWindow {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn sim_id(&self) -> SimId {
 | 
				
			||||||
 | 
					        self.sim_id
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn initial_viewport(&self) -> ViewportBuilder {
 | 
					    fn initial_viewport(&self) -> ViewportBuilder {
 | 
				
			||||||
        ViewportBuilder::default()
 | 
					        ViewportBuilder::default()
 | 
				
			||||||
            .with_title("Lemur")
 | 
					            .with_title("Lemur")
 | 
				
			||||||
| 
						 | 
					@ -380,6 +385,7 @@ impl AppWindow for GameWindow {
 | 
				
			||||||
        if self.sim_id == SimId::Player2 {
 | 
					        if self.sim_id == SimId::Player2 {
 | 
				
			||||||
            self.client.send_command(EmulatorCommand::StopSecondSim);
 | 
					            self.client.send_command(EmulatorCommand::StopSecondSim);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        let _ = self.proxy.send_event(UserEvent::Quit(self.sim_id));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,8 @@ use super::AppWindow;
 | 
				
			||||||
pub struct GdbServerWindow {
 | 
					pub struct GdbServerWindow {
 | 
				
			||||||
    sim_id: SimId,
 | 
					    sim_id: SimId,
 | 
				
			||||||
    port_str: String,
 | 
					    port_str: String,
 | 
				
			||||||
    launched: bool,
 | 
					    connected: bool,
 | 
				
			||||||
 | 
					    quit_on_disconnect: bool,
 | 
				
			||||||
    server: GdbServer,
 | 
					    server: GdbServer,
 | 
				
			||||||
    proxy: EventLoopProxy<UserEvent>,
 | 
					    proxy: EventLoopProxy<UserEvent>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -22,7 +23,8 @@ impl GdbServerWindow {
 | 
				
			||||||
        Self {
 | 
					        Self {
 | 
				
			||||||
            sim_id,
 | 
					            sim_id,
 | 
				
			||||||
            port_str: (8080 + sim_id.to_index()).to_string(),
 | 
					            port_str: (8080 + sim_id.to_index()).to_string(),
 | 
				
			||||||
            launched: false,
 | 
					            connected: false,
 | 
				
			||||||
 | 
					            quit_on_disconnect: false,
 | 
				
			||||||
            server: GdbServer::new(sim_id, client),
 | 
					            server: GdbServer::new(sim_id, client),
 | 
				
			||||||
            proxy,
 | 
					            proxy,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -31,8 +33,9 @@ impl GdbServerWindow {
 | 
				
			||||||
    pub fn launch(&mut self, port: u16) {
 | 
					    pub fn launch(&mut self, port: u16) {
 | 
				
			||||||
        self.server.stop();
 | 
					        self.server.stop();
 | 
				
			||||||
        self.port_str = port.to_string();
 | 
					        self.port_str = port.to_string();
 | 
				
			||||||
        self.launched = true;
 | 
					        self.quit_on_disconnect = true;
 | 
				
			||||||
        self.server.start(port);
 | 
					        self.server.start(port);
 | 
				
			||||||
 | 
					        self.connected = true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,6 +44,10 @@ impl AppWindow for GdbServerWindow {
 | 
				
			||||||
        ViewportId::from_hash_of(format!("Debugger-{}", self.sim_id))
 | 
					        ViewportId::from_hash_of(format!("Debugger-{}", self.sim_id))
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn sim_id(&self) -> SimId {
 | 
				
			||||||
 | 
					        self.sim_id
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn initial_viewport(&self) -> ViewportBuilder {
 | 
					    fn initial_viewport(&self) -> ViewportBuilder {
 | 
				
			||||||
        ViewportBuilder::default()
 | 
					        ViewportBuilder::default()
 | 
				
			||||||
            .with_title(format!("GDB Server ({})", self.sim_id))
 | 
					            .with_title(format!("GDB Server ({})", self.sim_id))
 | 
				
			||||||
| 
						 | 
					@ -61,16 +68,20 @@ impl AppWindow for GdbServerWindow {
 | 
				
			||||||
                ui.label("Port");
 | 
					                ui.label("Port");
 | 
				
			||||||
                let port_editor = TextEdit::singleline(&mut self.port_str).desired_width(100.0);
 | 
					                let port_editor = TextEdit::singleline(&mut self.port_str).desired_width(100.0);
 | 
				
			||||||
                ui.add_enabled(!status.running(), port_editor);
 | 
					                ui.add_enabled(!status.running(), port_editor);
 | 
				
			||||||
 | 
					                ui.checkbox(&mut self.quit_on_disconnect, "Quit on disconnect");
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if !status.running() {
 | 
					            if !status.running() {
 | 
				
			||||||
                if self.launched {
 | 
					                if self.connected && self.quit_on_disconnect {
 | 
				
			||||||
                    self.proxy.send_event(UserEvent::Quit).unwrap();
 | 
					                    self.proxy.send_event(UserEvent::Quit(self.sim_id)).unwrap();
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    self.connected = false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                let start_button = Button::new("Start");
 | 
					                let start_button = Button::new("Start");
 | 
				
			||||||
                if ui.add_enabled(port_num.is_some(), start_button).clicked() {
 | 
					                if ui.add_enabled(port_num.is_some(), start_button).clicked() {
 | 
				
			||||||
                    let port = port_num.unwrap();
 | 
					                    let port = port_num.unwrap();
 | 
				
			||||||
                    self.server.start(port);
 | 
					                    self.server.start(port);
 | 
				
			||||||
 | 
					                    self.connected = true;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                let stop_button = Button::new("Stop");
 | 
					                let stop_button = Button::new("Stop");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue