From 333865e7de65bd8a075c17fab2690017d47dbbc5 Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Sun, 26 Jan 2025 17:47:17 +0100 Subject: [PATCH] dont create new UI on close (#184) * dont create new UI on close * dont create new UI on close * more * more * more * more * more --- src/main.rs | 4 ++-- src/ui.rs | 19 +---------------- src/ui/config.rs | 22 ++++++++++++++++++++ src/ui/gui.rs | 43 ++++++++++++++++++++++++--------------- src/ui/gui/gui_netplay.rs | 2 +- 5 files changed, 53 insertions(+), 37 deletions(-) diff --git a/src/main.rs b/src/main.rs index a53787a..f1c549d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -68,7 +68,7 @@ struct Args { async fn main() { let dirs = ui::get_dirs(); - let mut result = std::fs::create_dir_all(dirs.config_dir.clone()); + let mut result = std::fs::create_dir_all(dirs.config_dir); if result.is_err() { panic!("could not create config dir: {}", result.err().unwrap()) } @@ -76,7 +76,7 @@ async fn main() { if result.is_err() { panic!("could not create cache dir: {}", result.err().unwrap()) } - result = std::fs::create_dir_all(dirs.data_dir.clone().join("saves")); + result = std::fs::create_dir_all(dirs.data_dir.join("saves")); if result.is_err() { panic!("could not create data dir: {}", result.err().unwrap()) } diff --git a/src/ui.rs b/src/ui.rs index 8e6c425..125226a 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -16,7 +16,6 @@ pub struct Ui { pub dirs: Dirs, pub keyboard_state: *const bool, pub controllers: [input::Controllers; 4], - pub config_file_path: std::path::PathBuf, pub config: config::Config, pub save_type: Vec, pub game_id: String, @@ -39,15 +38,9 @@ impl Drop for Ui { sdl3_sys::stdinc::SDL_free(self.joysticks as *mut std::ffi::c_void); sdl3_sys::init::SDL_Quit(); } - write_config(self); } } -fn write_config(ui: &Ui) { - let f = std::fs::File::create(ui.config_file_path.clone()).unwrap(); - serde_json::to_writer_pretty(f, &ui.config).unwrap(); -} - pub fn sdl_init(flag: sdl3_sys::init::SDL_InitFlags) { unsafe { let init = sdl3_sys::init::SDL_WasInit(0); @@ -91,15 +84,6 @@ impl Ui { } let dirs = get_dirs(); - let config_file_path = dirs.config_dir.join("config.json"); - let config_file = std::fs::read(config_file_path.clone()); - let mut config_map = config::Config::new(); - if config_file.is_ok() { - let result = serde_json::from_slice(config_file.unwrap().as_ref()); - if result.is_ok() { - config_map = result.unwrap(); - } - } Ui { controllers: [ @@ -125,8 +109,7 @@ impl Ui { }, ], keyboard_state: std::ptr::null_mut(), - config_file_path, - config: config_map, + config: config::Config::new(), save_type: vec![], game_id: String::new(), game_hash: String::new(), diff --git a/src/ui/config.rs b/src/ui/config.rs index 5864959..ad8b4cc 100644 --- a/src/ui/config.rs +++ b/src/ui/config.rs @@ -31,8 +31,30 @@ pub struct Config { pub video: Video, } +impl Drop for Config { + fn drop(&mut self) { + write_config(self); + } +} + +fn write_config(config: &Config) { + let dirs = ui::get_dirs(); + let file_path = dirs.config_dir.join("config.json"); + let f = std::fs::File::create(file_path).unwrap(); + serde_json::to_writer_pretty(f, &config).unwrap(); +} + impl Config { pub fn new() -> Config { + let dirs = ui::get_dirs(); + let file_path = dirs.config_dir.join("config.json"); + let config_file = std::fs::read(file_path); + if config_file.is_ok() { + let result = serde_json::from_slice(config_file.unwrap().as_ref()); + if let Ok(result) = result { + return result; + } + } let mut input_profiles = std::collections::HashMap::new(); input_profiles.insert("default".to_string(), ui::input::get_default_profile()); Config { diff --git a/src/ui/gui.rs b/src/ui/gui.rs index 4d71590..fa41e41 100644 --- a/src/ui/gui.rs +++ b/src/ui/gui.rs @@ -2,6 +2,7 @@ use crate::device; use crate::netplay; use crate::ui; use eframe::egui; + pub mod gui_netplay; pub struct GopherEguiApp { @@ -13,6 +14,7 @@ pub struct GopherEguiApp { selected_profile: [String; 4], input_profiles: Vec, controller_enabled: [bool; 4], + controller_paths: Vec, upscale: bool, integer_scaling: bool, fullscreen: bool, @@ -39,7 +41,7 @@ struct SaveConfig { fn get_input_profiles(game_ui: &ui::Ui) -> Vec { let mut profiles = vec![]; for key in game_ui.config.input.input_profiles.keys() { - profiles.push((*key).clone()) + profiles.push(key.clone()) } profiles } @@ -59,7 +61,7 @@ pub fn get_controller_names(game_ui: &ui::Ui) -> Vec { controllers } -pub fn get_controller_paths(game_ui: &ui::Ui) -> Vec { +fn get_controller_paths(game_ui: &ui::Ui) -> Vec { let mut controller_paths: Vec = vec![]; for offset in 0..game_ui.num_joysticks as isize { @@ -113,6 +115,7 @@ impl GopherEguiApp { emulate_vru: game_ui.config.input.emulate_vru, show_vru_dialog: false, dinput: false, + controller_paths, netplay_error_receiver: None, vru_window_receiver: None, vru_word_notifier: None, @@ -127,29 +130,31 @@ impl GopherEguiApp { } } -fn save_config(game_ui: &mut ui::Ui, save_config_items: SaveConfig) { - let controller_paths = get_controller_paths(game_ui); +fn save_config( + config: &mut ui::config::Config, + controller_paths: Vec, + save_config_items: SaveConfig, +) { for (pos, item) in save_config_items.selected_controller.iter().enumerate() { if *item != -1 { - game_ui.config.input.controller_assignment[pos] = + config.input.controller_assignment[pos] = Some(controller_paths[*item as usize].clone()); } else { - game_ui.config.input.controller_assignment[pos] = None + config.input.controller_assignment[pos] = None } } - game_ui.config.input.input_profile_binding = save_config_items.selected_profile; - game_ui.config.input.controller_enabled = save_config_items.controller_enabled; + config.input.input_profile_binding = save_config_items.selected_profile; + config.input.controller_enabled = save_config_items.controller_enabled; - game_ui.config.video.upscale = save_config_items.upscale; - game_ui.config.video.integer_scaling = save_config_items.integer_scaling; - game_ui.config.video.fullscreen = save_config_items.fullscreen; - game_ui.config.input.emulate_vru = save_config_items.emulate_vru; + config.video.upscale = save_config_items.upscale; + config.video.integer_scaling = save_config_items.integer_scaling; + config.video.fullscreen = save_config_items.fullscreen; + config.input.emulate_vru = save_config_items.emulate_vru; } impl Drop for GopherEguiApp { fn drop(&mut self) { - let mut game_ui = ui::Ui::new(); let save_config_items = SaveConfig { selected_controller: self.selected_controller, selected_profile: self.selected_profile.clone(), @@ -159,7 +164,12 @@ impl Drop for GopherEguiApp { fullscreen: self.fullscreen, emulate_vru: self.emulate_vru, }; - save_config(&mut game_ui, save_config_items); + let mut config = ui::config::Config::new(); + save_config( + &mut config, + self.controller_paths.clone(), + save_config_items, + ); } } @@ -253,6 +263,7 @@ pub fn open_rom(app: &mut GopherEguiApp, ctx: &egui::Context) { let session; let player_number; let cache_dir = app.dirs.cache_dir.clone(); + let controller_paths = app.controller_paths.clone(); if app.netplay.player_name.is_empty() { task = Some(rfd::AsyncFileDialog::new().pick_file()); @@ -320,7 +331,7 @@ pub fn open_rom(app: &mut GopherEguiApp, ctx: &egui::Context) { fullscreen, emulate_vru, }; - save_config(&mut device.ui, save_config_items); + save_config(&mut device.ui.config, controller_paths, save_config_items); if netplay { device.netplay = Some(netplay::init( @@ -346,7 +357,7 @@ pub fn open_rom(app: &mut GopherEguiApp, ctx: &egui::Context) { device::run_game(rom_contents, &mut device, fullscreen); } } - let result = std::fs::remove_file(running_file.clone()); + let result = std::fs::remove_file(running_file); if result.is_err() { panic!("could not remove running file: {}", result.err().unwrap()) } diff --git a/src/ui/gui/gui_netplay.rs b/src/ui/gui/gui_netplay.rs index 128f13c..fc1550b 100644 --- a/src/ui/gui/gui_netplay.rs +++ b/src/ui/gui/gui_netplay.rs @@ -347,7 +347,7 @@ pub fn netplay_create(app: &mut GopherEguiApp, ctx: &egui::Context) { fn get_sessions(app: &mut GopherEguiApp, ctx: &egui::Context) { if app.netplay.have_sessions.is_some() - && app.netplay.server != app.netplay.have_sessions.as_ref().unwrap().clone() + && app.netplay.server != *app.netplay.have_sessions.as_ref().unwrap() { // User has changed the server app.netplay.have_sessions = None;