mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 04:06:45 +01:00
wip: ratatui
This commit is contained in:
parent
edc363c55b
commit
fc7f6f5407
16 changed files with 485 additions and 243 deletions
|
|
@ -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()?;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue