mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-07 12:16:42 +01:00
wip: render: remove render! macro
This commit is contained in:
parent
bf165c6be1
commit
1d4db3c629
13 changed files with 337 additions and 304 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue