wip: ratatui

This commit is contained in:
🪞👃🪞 2024-06-05 15:40:26 +03:00
parent edc363c55b
commit fc7f6f5407
16 changed files with 485 additions and 243 deletions

View file

@ -10,6 +10,10 @@ pub trait Exitable {
fn exited (&self) -> bool;
}
pub trait HandleInput {
fn handle (&mut self, event: &Event) -> Result<(), Box<dyn Error>>;
}
#[derive(Debug)]
pub enum Event {
/// An input event that must be handled.
@ -87,36 +91,32 @@ impl Engine {
})
}
pub fn run <T: Exitable> (
&mut self,
state: &mut T,
mut render: impl FnMut(&mut T, &mut Stdout, (u16, u16)) -> Result<(), Box<dyn Error>>,
mut handle: impl FnMut(&mut T, &Event) -> Result<(), Box<dyn Error>>,
pub fn run <T: Exitable + WidgetRef + HandleInput> (
&mut self, mut state: T,
) -> Result<(), Box<dyn Error>> {
// JACK thread:
// Input thread:
// Render (main) thread:
crossterm::terminal::enable_raw_mode()?;
let stdout = &mut self.stdout;
stdout
.queue(crossterm::terminal::EnterAlternateScreen)?
.flush()?;
stdout().queue(EnterAlternateScreen)?.flush();
enable_raw_mode()?;
let mut terminal = ratatui::Terminal::new(CrosstermBackend::new(stdout()))?;
let sleep = std::time::Duration::from_millis(20);
loop {
stdout
.queue(crossterm::terminal::BeginSynchronizedUpdate)?
.queue(Clear(ClearType::All))?;
render(state, stdout, (0, 0))?;
stdout
.queue(crossterm::terminal::EndSynchronizedUpdate)?
.flush()?;
//stdout()
//.queue(crossterm::terminal::BeginSynchronizedUpdate)?
//.queue(Clear(ClearType::All))?;
terminal.draw(|frame|{
let area = frame.size();
frame.render_widget(&state, area);
});
//render(state, stdout, (0, 0))?;
//stdout()
//.queue(crossterm::terminal::EndSynchronizedUpdate)?
//.flush()?;
// Handle event if present (`None` redraws)
if let event = self.receiver.recv()? {
handle(state, &event)?;
state.handle(&event)?;
}
if state.exited() {
self.exited.store(true, Ordering::Relaxed);
stdout
stdout()
.queue(crossterm::terminal::LeaveAlternateScreen)?
.flush()?;
crossterm::terminal::disable_raw_mode()?;