This commit is contained in:
2026-03-02 17:46:35 +01:00
parent 1575ff81c1
commit 17e00610a7
8 changed files with 1996 additions and 64 deletions
+69
View File
@@ -0,0 +1,69 @@
use crossterm::event::{self, KeyCode, KeyEvent, KeyEventKind};
use ratatui::{DefaultTerminal, Frame, buffer::Buffer, layout::Rect, widgets::Widget};
use std::{
io::Result,
sync::mpsc::{self, Receiver},
};
pub struct App {
pub exit: bool,
}
pub enum Event {
Input(KeyEvent),
}
impl App {
pub fn run(&mut self, terminal: &mut DefaultTerminal, rx: Receiver<Event>) -> Result<()> {
while !self.exit {
terminal.draw(|frame: &mut Frame<'_>| self.draw(frame))?;
let event: Event = match rx.recv() {
Ok(ev) => ev,
Err(_) => break,
};
match event {
Event::Input(key_event) => self.handle_key_event(key_event)?,
}
}
Ok(())
}
fn draw(&self, frame: &mut Frame<'_>) {
frame.render_widget(self, frame.area());
}
fn handle_key_event(&mut self, key_event: KeyEvent) -> Result<()> {
if key_event.kind == KeyEventKind::Press && key_event.code == KeyCode::Char('q') {
self.exit = true;
}
Ok(())
}
}
impl Widget for &App {
fn render(self, area: Rect, buf: &mut Buffer)
where
Self: Sized,
{
}
}
pub fn handle_input_events(tx: mpsc::Sender<Event>) {
loop {
match event::read() {
Ok(ev) => {
if let event::Event::Key(key_event) = ev {
if tx.send(Event::Input(key_event)).is_err() {
break;
}
}
}
Err(_) => {
continue;
}
}
}
}
+9
View File
@@ -0,0 +1,9 @@
use clap::Parser;
#[derive(Parser, Debug)]
#[command(version, about = "War in Tunnels", long_about = "War in Tunnels")]
pub struct Cli {}
pub fn get_args() -> Cli {
Cli::parse()
}
+2
View File
@@ -0,0 +1,2 @@
pub mod app;
// pub mod cli;
+26 -2
View File
@@ -1,3 +1,27 @@
fn main() {
println!("Hello, world!");
use ratatui::{Terminal, prelude::CrosstermBackend};
use std::{
io::{Result, Stdout},
sync::mpsc::{self, Sender},
thread,
};
use war_in_tunnels::{
app::{App, Event, handle_input_events},
// cli::{Cli, get_args},
};
fn main() -> Result<()> {
// let args: Cli = get_args();
let mut terminal: Terminal<CrosstermBackend<Stdout>> = ratatui::init();
let mut app: App = App { exit: false };
let (event_tx, event_rx) = mpsc::channel::<Event>();
let tx_to_input_events: Sender<Event> = event_tx.clone();
thread::spawn(move || {
handle_input_events(tx_to_input_events);
});
let app_result: Result<()> = app.run(&mut terminal, event_rx);
ratatui::restore();
app_result
}