diff --git a/src/bin/macroquad_client.rs b/src/bin/macroquad_client.rs index 91a5181..c199c43 100644 --- a/src/bin/macroquad_client.rs +++ b/src/bin/macroquad_client.rs @@ -1,10 +1,16 @@ -use checkers::ui::{ - macroquad::{ - difficulty_selection::draw_dificulty_selection, game::game::GameClient, - main_menu::draw_main_menu, mode_selection::draw_mode_selection, - server_selection::draw_server_selection, settings::draw_settings, +use checkers::{ + settings::{ + client_settings::ClientSettings, general_settings::SettingsLike, + server_settings::ServerSettings, + }, + ui::{ + macroquad::{ + difficulty_selection::draw_dificulty_selection, game::game::GameClient, + main_menu::draw_main_menu, mode_selection::draw_mode_selection, + server_selection::draw_server_selection, settings::draw_settings, + }, + state::{GameContext, GuiState}, }, - state::{GameContext, GuiState}, }; use macroquad::{ color::{BLACK, WHITE}, @@ -62,6 +68,9 @@ pub async fn main() { let mut state = Default::default(); let mut context = GameContext::default(); + let mut client_settings = ClientSettings::new(); + let mut server_settings = ServerSettings::new(); + let background = load_texture("assets/background.png").await.unwrap(); let main_menu_style = get_general_style().await; @@ -121,7 +130,13 @@ pub async fn main() { } GuiState::Settings => { - draw_settings(&mut state).await; + draw_settings( + &mut state, + &mut context, + &mut client_settings, + &mut server_settings, + ) + .await; } GuiState::Game(client) => { diff --git a/src/ui/macroquad/menu_builder.rs b/src/ui/macroquad/menu_builder.rs index fd94cf4..cf88dce 100644 --- a/src/ui/macroquad/menu_builder.rs +++ b/src/ui/macroquad/menu_builder.rs @@ -24,8 +24,8 @@ impl MenuBuilder { } } - pub fn text_input(&mut self, ui: &mut Ui, buffer: &mut String) { - InputText::new(hash!()) + pub fn text_input(&mut self, ui: &mut Ui, id: &str, buffer: &mut String) { + InputText::new(hash!(id)) .position(vec2(self.center_x, self.current_y)) .size(self.button_size) .ui(ui, buffer); diff --git a/src/ui/macroquad/server_selection.rs b/src/ui/macroquad/server_selection.rs index a80eb35..0c465a5 100644 --- a/src/ui/macroquad/server_selection.rs +++ b/src/ui/macroquad/server_selection.rs @@ -47,7 +47,7 @@ pub async fn draw_server_selection(state: &mut GuiState, context: &mut GameConte menu_builder.label(ui, "Server selection"); - menu_builder.text_input(ui, &mut context.server_url_buffer); + menu_builder.text_input(ui, "server url", &mut context.server_url_buffer); //context.normalise_url(); if menu_builder.button(ui, "Connect") { diff --git a/src/ui/macroquad/settings.rs b/src/ui/macroquad/settings.rs index 29569c9..f231515 100644 --- a/src/ui/macroquad/settings.rs +++ b/src/ui/macroquad/settings.rs @@ -1,3 +1,4 @@ +use log::error; use macroquad::{ color::GRAY, math::vec2, @@ -6,9 +7,23 @@ use macroquad::{ window::{screen_height, screen_width}, }; -use crate::ui::{macroquad::menu_builder::MenuBuilder, state::GuiState}; +use crate::{ + settings::{ + client_settings::ClientSettings, general_settings::SettingsLike, + server_settings::ServerSettings, + }, + ui::{ + macroquad::menu_builder::MenuBuilder, + state::{GameContext, GuiState}, + }, +}; -pub async fn draw_settings(state: &mut GuiState) { +pub async fn draw_settings( + state: &mut GuiState, + context: &mut GameContext, + client_settings: &mut ClientSettings, + server_settings: &mut ServerSettings, +) { let menu_size = vec2(screen_width() * 0.5, screen_height() * 0.5); let menu_pos = vec2( screen_width() / 2.0 - menu_size.x / 2.0, @@ -21,11 +36,50 @@ pub async fn draw_settings(state: &mut GuiState) { Group::new(hash!(), menu_size) .position(menu_pos) .ui(&mut root_ui(), |ui| { + // Client menu_builder.label(ui, "Game settings"); - menu_builder.label(ui, "Server settings"); + menu_builder.label(ui, "Name"); + menu_builder.text_input(ui, "name input", &mut client_settings.name); - if menu_builder.button(ui, "Go back") { + menu_builder.label(ui, "Default server url"); + menu_builder.text_input(ui, "url input", &mut context.server_url_buffer); + + menu_builder.label(ui, ""); + + // Server + menu_builder.label(ui, "Server settings"); + menu_builder.label(ui, "TODO"); + + if let Some(error_msg) = &context.latest_error_message { + menu_builder.label(ui, &error_msg); + } + + // Exit + if menu_builder.button(ui, "Save and back") { + client_settings.server_url = match context.server_url_buffer.parse() { + Ok(result) => result, + + Err(e) => { + context.latest_error_message = + Some(format!("Error while parsing url: {}", e)); + return; + } + }; + + if let Err(e) = client_settings.save_to_file() { + context.latest_error_message = Some(format!("Error: {}", e)); + error!("Error while saving client settings to file: {}", e); + return; + } + + if let Err(e) = server_settings.save_to_file() { + context.latest_error_message = Some(format!("Error: {}", e)); + error!("Error while saving server settings to file: {}", e); + return; + } + + context.latest_error_message = None; *state = GuiState::MainMenu; } }); diff --git a/src/ui/state.rs b/src/ui/state.rs index 49184bc..c165193 100644 --- a/src/ui/state.rs +++ b/src/ui/state.rs @@ -36,6 +36,8 @@ pub struct GameContext { pub difficulty: BotDificulty, pub gamemode: GameMode, pub server_url_buffer: String, + + pub latest_error_message: Option, } impl Default for GameContext { @@ -43,7 +45,8 @@ impl Default for GameContext { Self { difficulty: BotDificulty::default(), gamemode: GameMode::default(), - server_url_buffer: "127.0.0.1".to_string(), + server_url_buffer: "127.0.0.1:6767".to_string(), + latest_error_message: None, } } }