Files
checkers/src/ui/macroquad/settings.rs
2026-09-05 15:47:13 +02:00

86 lines
2.7 KiB
Rust

use log::error;
use macroquad::{
color::GRAY,
math::vec2,
shapes::draw_rectangle,
ui::{hash, root_ui, widgets::Group},
window::{screen_height, screen_width},
};
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,
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,
screen_height() / 2.0 - menu_size.y / 2.0,
);
let mut menu_builder = MenuBuilder::new(menu_size.x, menu_size.y * 0.1);
draw_rectangle(menu_pos.x, menu_pos.y, menu_size.x, menu_size.y, GRAY);
Group::new(hash!(), menu_size)
.position(menu_pos)
.ui(&mut root_ui(), |ui| {
// Client
menu_builder.label(ui, "Game settings");
menu_builder.label(ui, "Name");
menu_builder.text_input(ui, "name input", &mut client_settings.name);
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(e.to_string());
return;
}
};
if let Err(e) = client_settings.save_to_file() {
context.latest_error_message = Some(e.to_string());
error!("Error while saving client settings to file: {}", e);
return;
}
if let Err(e) = server_settings.save_to_file() {
context.latest_error_message = Some(e.to_string());
error!("Error while saving server settings to file: {}", e);
return;
}
context.latest_error_message = None;
*state = GuiState::MainMenu;
}
});
}