refactor: split chat from game.rs

This commit is contained in:
2026-08-22 16:45:23 +02:00
parent 16056d0eb5
commit d07cb8328c
5 changed files with 74 additions and 75 deletions

View File

@@ -1,6 +1,6 @@
use checkers::ui::{ use checkers::ui::{
macroquad::{ macroquad::{
difficulty_selection::draw_dificulty_selection, game::GameClient, difficulty_selection::draw_dificulty_selection, game::game::GameClient,
main_menu::draw_main_menu, mode_selection::draw_mode_selection, main_menu::draw_main_menu, mode_selection::draw_mode_selection,
server_selection::draw_server_selection, server_selection::draw_server_selection,
}, },

View File

@@ -0,0 +1,58 @@
use macroquad::{
color::WHITE,
math::{Rect, vec2},
shapes::draw_rectangle,
ui::{hash, root_ui, widgets::InputText},
window::{screen_height, screen_width},
};
use tokio::sync::mpsc::Sender;
use crate::ui::macroquad::game::game::GuiCommands;
struct Message {
sender: String,
content: String,
}
#[derive(Default)]
pub struct Chat {
area: Rect,
messages: Vec<Message>,
message_buffer: String,
}
impl Chat {
pub fn update(&mut self, game_area: &Rect) {
self.area = Rect {
x: game_area.w,
y: 0.0,
w: screen_width() * 0.2,
h: screen_height(),
};
}
pub fn push_message(&mut self, sender: String, content: String) {
self.messages.push(Message { sender, content });
}
pub fn send_message(&mut self, cmd_sender: Sender<GuiCommands>) {
if !self.message_buffer.is_empty() {
let _ = // TODO! Check the message before sending
cmd_sender
.try_send(GuiCommands::Send(self.message_buffer.clone()));
self.message_buffer.clear();
}
}
pub fn draw(&mut self) {
draw_rectangle(self.area.x, self.area.y, self.area.w, self.area.h, WHITE);
let input_size = vec2(self.area.w, self.area.h * 0.1);
let input_pos = vec2(self.area.x, self.area.h - input_size.y);
InputText::new(hash!())
.position(input_pos)
.size(input_size)
.ui(&mut root_ui(), &mut self.message_buffer);
}
}

View File

@@ -2,14 +2,11 @@ use tokio::sync::mpsc::{self, Sender};
use log::{debug, error, info}; use log::{debug, error, info};
use macroquad::{ use macroquad::{
color::{BLACK, GRAY, WHITE}, color::GRAY,
input::{KeyCode, get_keys_pressed}, input::{KeyCode, get_keys_pressed},
math::{Rect, Vec2, vec2}, math::{Rect, Vec2, vec2},
shapes::{draw_rectangle, draw_rectangle_lines}, shapes::draw_rectangle,
ui::{ ui::{hash, root_ui, widgets::Checkbox},
Ui, hash, root_ui,
widgets::{Checkbox, InputText},
},
window::{screen_height, screen_width}, window::{screen_height, screen_width},
}; };
use tokio::sync::mpsc::{Receiver, error::TryRecvError::Disconnected}; use tokio::sync::mpsc::{Receiver, error::TryRecvError::Disconnected};
@@ -20,7 +17,7 @@ use crate::{
client::Client, message::ServerMessage, network_identity::NetworkIdentity, client::Client, message::ServerMessage, network_identity::NetworkIdentity,
server::ServerStage, server::ServerStage,
}, },
ui::state::GameContext, ui::{macroquad::game::chat::Chat, state::GameContext},
}; };
pub struct GameClient { pub struct GameClient {
@@ -49,19 +46,7 @@ struct Lobby {
checkbox_size: Vec2, checkbox_size: Vec2,
} }
struct Message { pub enum GuiCommands {
sender: String,
content: String,
}
#[derive(Default)]
struct Chat {
chat_area: Rect,
messages: Vec<Message>,
message_buffer: String,
}
enum GuiCommands {
Send(String), Send(String),
Ready, Ready,
@@ -160,7 +145,7 @@ impl GameClient {
self.draw_summary_screen(); self.draw_summary_screen();
} }
} }
self.draw_chat(); self.chat.draw();
} }
fn draw_lobby(&mut self) { fn draw_lobby(&mut self) {
@@ -202,35 +187,6 @@ impl GameClient {
todo!(); todo!();
} }
fn draw_chat(&mut self) {
draw_rectangle(
self.chat.chat_area.x,
self.chat.chat_area.y,
self.chat.chat_area.w,
self.chat.chat_area.h,
WHITE,
);
let input_size = vec2(self.chat.chat_area.w, self.chat.chat_area.h * 0.1);
let input_pos = vec2(self.chat.chat_area.x, self.chat.chat_area.h - input_size.y);
InputText::new(hash!())
.position(input_pos)
.size(input_size)
.ui(&mut root_ui(), &mut self.chat.message_buffer);
/*
draw_rectangle_lines(
input_pos.x,
input_pos.y,
input_size.x,
input_size.y,
1.5,
BLACK,
);
*/
}
/* === UPDATING STUFF ==== */ /* === UPDATING STUFF ==== */
pub fn update(&mut self) { pub fn update(&mut self) {
@@ -246,12 +202,10 @@ impl GameClient {
for key in get_keys_pressed() { for key in get_keys_pressed() {
match key { match key {
KeyCode::Enter => { KeyCode::Enter => {
if !self.chat.message_buffer.is_empty() { self.chat.send_message(self.cmd_sender.clone()); // not sure about cloning this
let _ = self // TODO! Check the message before sending // every message sent. Maybe
.cmd_sender // Chat should have it's own
.try_send(GuiCommands::Send(self.chat.message_buffer.clone())); // clone?
self.chat.message_buffer.clear();
}
} }
_ => {} _ => {}
@@ -273,7 +227,7 @@ impl GameClient {
ServerMessage::BroadcastCurrentTurn { active_player } => todo!(), ServerMessage::BroadcastCurrentTurn { active_player } => todo!(),
ServerMessage::BroadCastTextMessage { sender, content } => { ServerMessage::BroadCastTextMessage { sender, content } => {
debug!("Got message from: {} with content: {}", sender, content); debug!("Got message from: {} with content: {}", sender, content);
self.chat.messages.push(Message { sender, content }); self.chat.push_message(sender, content);
} }
ServerMessage::GameEnd { result } => todo!(), ServerMessage::GameEnd { result } => todo!(),
@@ -304,11 +258,6 @@ impl GameClient {
h: screen_height(), h: screen_height(),
}; };
self.chat.chat_area = Rect { self.chat.update(&self.game_area);
x: self.game_area.w,
y: 0.0,
w: screen_width() * 0.2,
h: screen_height(),
};
} }
} }

View File

@@ -0,0 +1,2 @@
mod chat;
pub mod game;

View File

@@ -1,7 +1,7 @@
use std::sync::mpsc::{self, Receiver, Sender}; use std::sync::mpsc::{self, Receiver, Sender};
use crate::{ use crate::{
network::client::Client, super_advanced_ai::BotDificulty, ui::macroquad::game::GameClient, network::client::Client, super_advanced_ai::BotDificulty, ui::macroquad::game::game::GameClient,
}; };
#[derive(Default)] #[derive(Default)]
@@ -36,16 +36,6 @@ pub struct GameContext {
pub server_url_buffer: String, pub server_url_buffer: String,
} }
enum CliCommands {
Send,
Ready,
Unready,
Capture,
Move,
}
// TODO! Move this // TODO! Move this
pub fn connect_to_server() -> Receiver<Option<Client>> { pub fn connect_to_server() -> Receiver<Option<Client>> {
let (tx, rc) = mpsc::channel::<Option<Client>>(); let (tx, rc) = mpsc::channel::<Option<Client>>();