feat: initial game screen

This commit is contained in:
Muhammad Nauman Raza 2025-02-21 12:46:52 +00:00
parent 400852f7dc
commit e8d99eac55
Signed by untrusted user: devraza
GPG key ID: 91EAD6081011574B
5 changed files with 45 additions and 18 deletions

13
client/src/game.rs Normal file
View file

@ -0,0 +1,13 @@
use ratatui::{
buffer::Buffer,
layout::Rect,
widgets::{Block, Borders, Padding, Paragraph, Widget},
};
pub fn render(area: Rect, buf: &mut Buffer) {
let block = Block::new()
.padding(Padding::symmetric(2, 1))
.borders(Borders::ALL);
Paragraph::new("").block(block).render(area, buf);
}

View file

@ -1,7 +1,8 @@
use color_eyre::Result; use color_eyre::Result;
mod tui; mod game;
mod menu; mod menu;
mod tui;
mod util; mod util;
fn main() -> Result<()> { fn main() -> Result<()> {

View file

@ -2,12 +2,12 @@
use ratatui::{ use ratatui::{
buffer::Buffer, buffer::Buffer,
crossterm::event::{self, KeyCode, KeyEvent}, crossterm::event::{self, KeyCode, KeyEvent},
layout::Rect, layout::{Constraint, Layout, Rect},
text::{Line, Span},
style::{Modifier, Style, Stylize, palette::tailwind::*}, style::{Modifier, Style, Stylize, palette::tailwind::*},
text::{Line, Span},
widgets::{ widgets::{
Block, Borders, HighlightSpacing, List, Block, Borders, HighlightSpacing, List, ListState, Padding, Paragraph, StatefulWidget,
ListState, Padding, StatefulWidget, Paragraph, Widget Widget,
}, },
}; };
@ -113,6 +113,12 @@ impl OptionList {
tui::Mode::MainMenu(self) tui::Mode::MainMenu(self)
} }
} }
KeyCode::Enter => match self.items.get(self.state.selected().unwrap_or_default()) {
Some(&"Blitz") => tui::Mode::Blitz,
Some(&"40L") => tui::Mode::FortyL,
Some(&"txLadder") => tui::Mode::TxLadder,
_ => tui::Mode::Exit,
},
_ => tui::Mode::MainMenu(self), _ => tui::Mode::MainMenu(self),
} }
} }
@ -142,3 +148,12 @@ impl OptionList {
StatefulWidget::render(list, area, buf, &mut self.state); StatefulWidget::render(list, area, buf, &mut self.state);
} }
} }
pub fn render_menu(area: Rect, menu_list: &mut OptionList, buf: &mut Buffer) {
let [profile_area, list_outer_area] =
Layout::vertical([Constraint::Percentage(50), Constraint::Percentage(50)]).areas(area);
render_profile(profile_area, buf);
menu_list.render(list_outer_area, buf);
}

View file

@ -7,6 +7,7 @@ use ratatui::{
widgets::Widget, widgets::Widget,
}; };
use crate::game;
use crate::menu; use crate::menu;
use crate::util::*; use crate::util::*;
@ -22,7 +23,9 @@ pub enum Mode {
impl Default for Mode { impl Default for Mode {
fn default() -> Self { fn default() -> Self {
Mode::MainMenu(menu::OptionList::from_iter(["40L", "Blitz", "txLadder", "Config"])) Mode::MainMenu(menu::OptionList::from_iter([
"40L", "Blitz", "txLadder", "Config",
]))
} }
} }
@ -30,9 +33,7 @@ impl Mode {
pub fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> { pub fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> {
loop { loop {
match self { match self {
Mode::Exit => { Mode::Exit => break,
break
}
_ => { _ => {
terminal.draw(|frame| frame.render_widget(&mut self, frame.area()))?; terminal.draw(|frame| frame.render_widget(&mut self, frame.area()))?;
if let Event::Key(key) = event::read()? { if let Event::Key(key) = event::read()? {
@ -46,7 +47,7 @@ impl Mode {
fn handle_key(self, key: KeyEvent) -> Mode { fn handle_key(self, key: KeyEvent) -> Mode {
if key.kind != KeyEventKind::Press { if key.kind != KeyEventKind::Press {
return self return self;
} }
match self { match self {
@ -71,18 +72,15 @@ impl Widget for &mut Mode {
Constraint::Percentage(60), Constraint::Percentage(60),
); );
let [profile_area, list_outer_area] =
Layout::vertical([Constraint::Percentage(50), Constraint::Percentage(50)])
.areas(center_area);
menu::render_header(header_area, buf); menu::render_header(header_area, buf);
match self { match self {
Mode::MainMenu(menu_list) => { Mode::MainMenu(menu_list) => {
menu::render_profile(profile_area, buf); menu::render_menu(center_area, menu_list, buf);
menu_list.render(list_outer_area, buf); }
_ => {
game::render(center_area, buf);
} }
_ => {},
} }
menu::render_footer(footer_area, buf); menu::render_footer(footer_area, buf);
} }

View file

@ -1,4 +1,4 @@
use ratatui::layout::{Layout, Flex, Constraint, Rect}; use ratatui::layout::{Constraint, Flex, Layout, Rect};
pub fn center(area: Rect, horizontal: Constraint, vertical: Constraint) -> Rect { pub fn center(area: Rect, horizontal: Constraint, vertical: Constraint) -> Rect {
let [area] = Layout::horizontal([horizontal]) let [area] = Layout::horizontal([horizontal])