diff --git a/engine/src/tui.rs b/engine/src/tui.rs index ff09a43e..cfa2e76e 100644 --- a/engine/src/tui.rs +++ b/engine/src/tui.rs @@ -1,3 +1,6 @@ +mod tui_output; pub use self::tui_output::*; +mod tui_input; pub use self::tui_input::*; + use crate::*; use std::sync::{Arc, RwLock, atomic::{AtomicBool, Ordering::*}}; use std::io::{stdout, Stdout}; @@ -159,268 +162,3 @@ impl + Handle + Sized + 'static> TuiRun for Arc, - pub(crate) event: crossterm::event::Event, -} - -impl Input for TuiInput { - type Event = crossterm::event::Event; - fn event (&self) -> &crossterm::event::Event { - &self.event - } - fn is_done (&self) -> bool { - self.exited.fetch_and(true, Relaxed) - } - fn done (&self) { - self.exited.store(true, Relaxed); - } -} - -#[macro_export] macro_rules! key_pat { - (Ctrl-Alt-$code:pat) => { key_event_pat!($code, KeyModifiers::CONTROL | KeyModifiers::ALT) }; - (Ctrl-$code:pat) => { key_event_pat!($code, KeyModifiers::CONTROL) }; - (Alt-$code:pat) => { key_event_pat!($code, KeyModifiers::ALT) }; - (Shift-$code:pat) => { key_event_pat!($code, KeyModifiers::SHIFT) }; - ($code:pat) => { crossterm::event::Event::Key(KeyEvent { - code: $code, - modifiers: KeyModifiers::NONE, - kind: KeyEventKind::Press, - state: KeyEventState::NONE - }) }; -} - -#[macro_export] macro_rules! key_event_pat { - ($code:pat) => { - crossterm::event::Event::Key(KeyEvent { - code: $code, - modifiers: KeyModifiers::NONE, - kind: KeyEventKind::Press, - state: KeyEventState::NONE - }) - }; - ($code:pat, $modifiers: pat) => { - crossterm::event::Event::Key(KeyEvent { - code: $code, - modifiers: $modifiers, - kind: KeyEventKind::Press, - state: KeyEventState::NONE - }) - }; -} - -#[macro_export] macro_rules! kexp { - (Ctrl-Alt-$code:ident) => { key_event_expr!($code, KeyModifiers::from_bits(0b0000_0110).unwrap()) }; - (Ctrl-$code:ident) => { key_event_expr!($code, KeyModifiers::CONTROL) }; - (Alt-$code:ident) => { key_event_expr!($code, KeyModifiers::ALT) }; - (Shift-$code:ident) => { key_event_expr!($code, KeyModifiers::SHIFT) }; - ($code:ident) => { key_event_expr!($code) }; - ($code:expr) => { key_event_expr!($code) }; -} - -#[macro_export] macro_rules! key_expr { - (Ctrl-Alt-$code:ident) => { key_event_expr!($code, KeyModifiers::CONTROL | KeyModifiers::ALT) }; - (Ctrl-$code:ident) => { key_event_expr!($code, KeyModifiers::CONTROL) }; - (Alt-$code:ident) => { key_event_expr!($code, KeyModifiers::ALT) }; - (Shift-$code:ident) => { key_event_expr!($code, KeyModifiers::SHIFT) }; - ($code:ident) => { key_event_expr!($code) }; -} - -#[macro_export] macro_rules! key_event_expr { - ($code:expr, $modifiers: expr) => { - crossterm::event::Event::Key(KeyEvent { - code: $code, - modifiers: $modifiers, - kind: KeyEventKind::Press, - state: KeyEventState::NONE - }) - }; - ($code:expr) => { - crossterm::event::Event::Key(KeyEvent { - code: $code, - modifiers: KeyModifiers::NONE, - kind: KeyEventKind::Press, - state: KeyEventState::NONE - }) - }; -} - -pub struct TuiOutput { - pub buffer: Buffer, - pub area: [u16;4] -} - -impl Output for TuiOutput { - #[inline] fn area (&self) -> [u16;4] { self.area } - #[inline] fn area_mut (&mut self) -> &mut [u16;4] { &mut self.area } - #[inline] fn place (&mut self, area: [u16;4], content: &impl Content) { - let last = self.area().xywh().clone(); - //panic!("a {last:?} {area:?} {:?}", self.area); - *self.area_mut() = area.xywh().clone(); - //panic!("b {last:?} {area:?} {:?}", self.area); - content.render(self); - //panic!("c {last:?} {area:?} {:?}", self.area); - *self.area_mut() = last; - //panic!("placed"); - } -} - -impl TuiOutput { - pub fn buffer_update (&mut self, area: [u16;4], callback: &impl Fn(&mut Cell, u16, u16)) { - buffer_update(&mut self.buffer, area, callback); - } - pub fn fill_bold (&mut self, area: [u16;4], on: bool) { - if on { - self.buffer_update(area, &|cell,_,_|cell.modifier.insert(Modifier::BOLD)) - } else { - self.buffer_update(area, &|cell,_,_|cell.modifier.remove(Modifier::BOLD)) - } - } - pub fn fill_bg (&mut self, area: [u16;4], color: Color) { - self.buffer_update(area, &|cell,_,_|{cell.set_bg(color);}) - } - pub fn fill_fg (&mut self, area: [u16;4], color: Color) { - self.buffer_update(area, &|cell,_,_|{cell.set_fg(color);}) - } - pub fn fill_ul (&mut self, area: [u16;4], color: Color) { - self.buffer_update(area, &|cell,_,_|{ - cell.modifier = ratatui::prelude::Modifier::UNDERLINED; - cell.underline_color = color; - }) - } - pub fn fill_char (&mut self, area: [u16;4], c: char) { - self.buffer_update(area, &|cell,_,_|{cell.set_char(c);}) - } - pub fn make_dim (&mut self) { - for cell in self.buffer.content.iter_mut() { - cell.bg = ratatui::style::Color::Rgb(30,30,30); - cell.fg = ratatui::style::Color::Rgb(100,100,100); - cell.modifier = ratatui::style::Modifier::DIM; - } - } - pub fn blit ( - &mut self, text: &impl AsRef, x: u16, y: u16, style: Option