From 16056d0eb514527bb37493abfafd55db436de5c3 Mon Sep 17 00:00:00 2001 From: szymon Date: Sat, 22 Aug 2026 16:27:12 +0200 Subject: [PATCH] feat: add chat window and sending messages --- src/ui/macroquad/game.rs | 90 ++++++++++++++++++++++++++++++++-------- 1 file changed, 72 insertions(+), 18 deletions(-) diff --git a/src/ui/macroquad/game.rs b/src/ui/macroquad/game.rs index 3ec2332..6f13d10 100644 --- a/src/ui/macroquad/game.rs +++ b/src/ui/macroquad/game.rs @@ -1,11 +1,15 @@ use tokio::sync::mpsc::{self, Sender}; -use log::{error, info}; +use log::{debug, error, info}; use macroquad::{ - color::GRAY, + color::{BLACK, GRAY, WHITE}, + input::{KeyCode, get_keys_pressed}, math::{Rect, Vec2, vec2}, - shapes::draw_rectangle, - ui::{Ui, hash, root_ui, widgets::Checkbox}, + shapes::{draw_rectangle, draw_rectangle_lines}, + ui::{ + Ui, hash, root_ui, + widgets::{Checkbox, InputText}, + }, window::{screen_height, screen_width}, }; use tokio::sync::mpsc::{Receiver, error::TryRecvError::Disconnected}; @@ -35,8 +39,7 @@ pub struct GameClient { game_padding: f32, lobby: Lobby, - - chat_area: Rect, + chat: Chat, } #[derive(Default)] @@ -46,6 +49,18 @@ struct Lobby { checkbox_size: Vec2, } +struct Message { + sender: String, + content: String, +} + +#[derive(Default)] +struct Chat { + chat_area: Rect, + messages: Vec, + message_buffer: String, +} + enum GuiCommands { Send(String), @@ -109,12 +124,7 @@ impl GameClient { }; let game_padding = 25.0; - let chat_area = Rect { - x: game_area.w, - y: 0.0, - w: screen_width() * 0.2, - h: screen_height(), - }; + let chat = Chat::default(); Some(Self { cmd_sender, @@ -132,7 +142,7 @@ impl GameClient { game_area, game_padding, - chat_area, + chat, }) } @@ -150,7 +160,7 @@ impl GameClient { self.draw_summary_screen(); } } - //self.draw_chat(); // TODO! uncomment this + self.draw_chat(); } fn draw_lobby(&mut self) { @@ -192,8 +202,33 @@ impl GameClient { todo!(); } - fn draw_chat(&self) { - 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 ==== */ @@ -207,6 +242,21 @@ impl GameClient { ServerStage::Game => todo!(), ServerStage::End => todo!(), } + + for key in get_keys_pressed() { + match key { + KeyCode::Enter => { + if !self.chat.message_buffer.is_empty() { + let _ = self // TODO! Check the message before sending + .cmd_sender + .try_send(GuiCommands::Send(self.chat.message_buffer.clone())); + self.chat.message_buffer.clear(); + } + } + + _ => {} + } + } } fn update_network(&mut self) { @@ -221,7 +271,11 @@ impl GameClient { ServerMessage::AvailableMoves { moves } => todo!(), ServerMessage::BroadcastBoardState { board } => todo!(), ServerMessage::BroadcastCurrentTurn { active_player } => todo!(), - ServerMessage::BroadCastTextMessage { sender, content } => todo!(), + ServerMessage::BroadCastTextMessage { sender, content } => { + debug!("Got message from: {} with content: {}", sender, content); + self.chat.messages.push(Message { sender, content }); + } + ServerMessage::GameEnd { result } => todo!(), _ => {} // ignore things that network client handled by itself @@ -250,7 +304,7 @@ impl GameClient { h: screen_height(), }; - self.chat_area = Rect { + self.chat.chat_area = Rect { x: self.game_area.w, y: 0.0, w: screen_width() * 0.2,