dont create new UI on close (#184)

* dont create new UI on close

* dont create new UI on close

* more

* more

* more

* more

* more
This commit is contained in:
Logan McNaughton 2025-01-26 17:47:17 +01:00 committed by GitHub
parent b1bb96c7d2
commit 333865e7de
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 53 additions and 37 deletions

View File

@ -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())
}

View File

@ -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<storage::SaveTypes>,
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(),

View File

@ -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 {

View File

@ -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<String>,
controller_enabled: [bool; 4],
controller_paths: Vec<String>,
upscale: bool,
integer_scaling: bool,
fullscreen: bool,
@ -39,7 +41,7 @@ struct SaveConfig {
fn get_input_profiles(game_ui: &ui::Ui) -> Vec<String> {
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<String> {
controllers
}
pub fn get_controller_paths(game_ui: &ui::Ui) -> Vec<String> {
fn get_controller_paths(game_ui: &ui::Ui) -> Vec<String> {
let mut controller_paths: Vec<String> = 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<String>,
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())
}

View File

@ -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;