forked from atiran/txtris
feat: initial game screen
This commit is contained in:
parent
400852f7dc
commit
e8d99eac55
5 changed files with 45 additions and 18 deletions
13
client/src/game.rs
Normal file
13
client/src/game.rs
Normal 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);
|
||||||
|
}
|
|
@ -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<()> {
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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])
|
||||||
|
|
Loading…
Reference in a new issue