mirror of
https://github.com/szymon-jozef/checkers.git
synced 2026-10-27 11:10:48 +01:00
feat: add chat window and sending messages
This commit is contained in:
@@ -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>,
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user