wip: render: remove render! macro

This commit is contained in:
🪞👃🪞 2024-09-04 03:20:58 +03:00
parent bf165c6be1
commit 1d4db3c629
13 changed files with 337 additions and 304 deletions

View file

@ -106,8 +106,8 @@ pub trait ExitableComponent<T, U>: Exit + Component<T, U> {
impl<E: Exit + Component<T, U>, T, U> ExitableComponent<T, U> for E {}
/// Run the main loop.
pub fn run <'a, R> (state: Arc<RwLock<R>>) -> Usually<Arc<RwLock<R>>>
where R: Render<TuiOutput<'a>, Rect> + Handle + Sized + 'static
pub fn run <R> (state: Arc<RwLock<R>>) -> Usually<Arc<RwLock<R>>>
where R: for <'a> Render<TuiOutput<'a>, Rect> + Handle + Sized + 'static
{
let exited = Arc::new(AtomicBool::new(false));
let _input_thread = input_thread(&exited, &state);

View file

@ -56,7 +56,7 @@ impl<'a, T, U> Collect<'a, T, U> for Split<'a, T, U> {
impl<'a> Render<TuiOutput<'a>, Rect> for Split<'a, TuiOutput<'a>, Rect> {
fn render (&self, to: &mut TuiOutput<'a>) -> Perhaps<Rect> {
Ok(Some(self.render_areas(to)?.0))
Ok(None)//Rect::default())//Some(self.render_areas(to)?.0))
}
}

View file

@ -1,6 +1,7 @@
use crate::*;
pub(crate) use ratatui::buffer::Cell;
use ratatui::backend::Backend;
pub struct TuiOutput<'a> {
pub buffer: &'a mut Buffer,
@ -8,24 +9,29 @@ pub struct TuiOutput<'a> {
}
/// Main thread render loop
pub fn tui_render_thread <'a: 'static, T> (
exited: &Arc<AtomicBool>, device: &Arc<RwLock<T>>,
) -> Usually<JoinHandle<()>> where
T: Render<TuiOutput<'a>, Rect> + 'static
pub fn tui_render_thread <T> (exited: &Arc<AtomicBool>, device: &Arc<RwLock<T>>)
-> Usually<JoinHandle<()>>
where
T: for <'a> Render<TuiOutput<'a>, Rect> + 'static
{
let exited = exited.clone();
let device = device.clone();
let mut terminal = ratatui::Terminal::new(CrosstermBackend::new(stdout()))?;
let sleep = Duration::from_millis(20);
let exited = exited.clone();
let device = device.clone();
let mut backend = CrosstermBackend::new(stdout());
let area = backend.size()?;
let mut buffers = [Buffer::empty(area), Buffer::empty(area)];
let mut index = 0;
let sleep = Duration::from_millis(20);
Ok(spawn(move || {
let draw = |frame: &'a mut ratatui::Frame|{
let area = frame.size();
let buffer = frame.buffer_mut();
device.render(&mut TuiOutput { buffer, area }).expect("Failed to render content");
};
loop {
if let Ok(_) = device.try_read() {
terminal.draw(draw).expect("Failed to render frame");
if let Ok(device) = device.try_read() {
let mut target = TuiOutput { buffer: &mut buffers[index], area };
device.render(&mut target).expect("render failed");
let previous_buffer = &buffers[1 - index];
let current_buffer = &buffers[index];
let updates = previous_buffer.diff(current_buffer);
backend.draw(updates.into_iter());
buffers[1 - index].reset();
index = 1 - index;
}
if exited.fetch_and(true, Ordering::Relaxed) {
break