diff --git a/src/ui/main_menu.rs b/src/ui/main_menu.rs index 7fa1d43731..297d638027 100644 --- a/src/ui/main_menu.rs +++ b/src/ui/main_menu.rs @@ -5,7 +5,7 @@ use super::ImageMeta; mod credits; mod map_select; pub mod player_select; -mod settings; +pub(super) mod settings; use shadow_rs::shadow; // Generate build info. @@ -104,12 +104,15 @@ static VERSION_STRING: Lazy = Lazy::new(|| { fn main_menu_system(world: &World) { let ctx = (*world.resource::()).clone(); + let mut close_settings_menu = false; egui::CentralPanel::default() .frame(egui::Frame::none()) .show(&ctx, |ui| match ctx.get_state::() { MenuPage::Home => world.run_system(home_menu, ui), - MenuPage::Settings => world.run_system(settings::widget, ui), + MenuPage::Settings => { + world.run_system(settings::widget, (ui, &mut close_settings_menu)) + } MenuPage::PlayerSelect => world.run_system(player_select::widget, ui), MenuPage::MapSelect { .. } => world.run_system(map_select::widget, ui), MenuPage::Credits => world.run_system(credits::widget, ui), @@ -120,6 +123,10 @@ fn main_menu_system(world: &World) { } }); + if close_settings_menu { + ctx.set_state(MenuPage::Home); + } + egui::CentralPanel::default() .frame(egui::Frame::none()) .show(&ctx, |ui| { diff --git a/src/ui/main_menu/settings.rs b/src/ui/main_menu/settings.rs index abdb1295c5..9635cfeac2 100644 --- a/src/ui/main_menu/settings.rs +++ b/src/ui/main_menu/settings.rs @@ -3,8 +3,6 @@ use crate::{ settings::{PlayerControlMapping, Settings}, }; -use super::MenuPage; - mod audio; mod controls; mod graphics; @@ -38,7 +36,7 @@ impl SettingsTab { } pub fn widget( - mut ui: In<&mut egui::Ui>, + mut ui: In<(&mut egui::Ui, &mut bool)>, meta: Root, localization: Localization, input: Res, @@ -46,7 +44,7 @@ pub fn widget( mut storage: ResMut, world: &World, ) { - let ui = &mut *ui; + let (ui, close_settings_menu) = &mut *ui; let mut state = ui.ctx().get_state::(); let screen_rect = ui.max_rect(); @@ -132,7 +130,7 @@ pub fn widget( || input.values().any(|x| x.menu_back_just_pressed)) && state.currently_binding_input_idx.is_none() { - ui.ctx().set_state(MenuPage::Home); + **close_settings_menu = true; // Reset the modified settings to their stored settings. state.modified_settings = storage.get::().unwrap().clone(); // Run cancel callbacks @@ -170,7 +168,7 @@ pub fn widget( *mapping = state.modified_settings.player_controls.clone(); storage.insert(state.modified_settings.clone()); storage.save(); - ui.ctx().set_state(MenuPage::Home); + **close_settings_menu = true; } }); diff --git a/src/ui/pause_menu.rs b/src/ui/pause_menu.rs index 6557dca8b5..f050b445ac 100644 --- a/src/ui/pause_menu.rs +++ b/src/ui/pause_menu.rs @@ -12,6 +12,7 @@ enum PauseMenuPage { #[default] Pause, MapSelect, + Settings, } pub fn session_plugin(session: &mut Session) { @@ -43,6 +44,7 @@ fn pause_menu_system( let mut back_to_menu = false; let mut restart_game = false; let mut close_pause_menu = false; + let mut close_settings_menu = false; let mut select_map = None; if let Some(session) = sessions.get_mut(SessionNames::GAME) { let pause_pressed = controls.values().any(|x| x.pause_just_pressed); @@ -97,6 +99,16 @@ fn pause_menu_system( } } } + PauseMenuPage::Settings => { + egui::CentralPanel::default() + .frame(egui::Frame::none()) + .show(&ctx, |ui| { + world.run_system( + super::main_menu::settings::widget, + (ui, &mut close_settings_menu), + ); + }); + } } } else if pause_pressed { pause_menu.menu_open = true; @@ -136,6 +148,10 @@ fn pause_menu_system( if close_pause_menu { pause_menu.menu_open = false; } + + if close_settings_menu { + ctx.set_state(PauseMenuPage::Pause); + } } fn main_pause_menu( @@ -217,6 +233,15 @@ fn main_pause_menu( ui.ctx().set_state(PauseMenuPage::MapSelect); } + // Settings button + if BorderedButton::themed(&meta.theme.buttons.normal, localization.get("settings")) + .min_size(vec2(width, 0.0)) + .show(ui) + .clicked() + { + ui.ctx().set_state(PauseMenuPage::Settings); + } + // Restart button if BorderedButton::themed(&meta.theme.buttons.normal, localization.get("restart")) .min_size(vec2(width, 0.0))