use ratatui::{text::ToSpan, widgets::{block::BlockExt, Block, Widget}}; use crate::lua::iobuffer::iobuffer; pub struct LogView<'a> { block: Option> } impl<'a> LogView<'a> { pub fn new() -> Self { Self { block: None } } pub fn block(mut self, block: Block<'a>) -> Self { self.block = Some(block); self } } impl Widget for &mut LogView<'_> { fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer) where Self: Sized { self.block.render(area, buf); let inner_area = self.block.inner_if_some(area); let lines = { let buffer = iobuffer().read().unwrap(); buffer.get() }; let mut line_area = inner_area.clone(); line_area.height = 1; line_area.y = inner_area.y + inner_area.height - 1; for line in lines.lines().rev() { let line = line.to_span(); line.render(line_area, buf); line_area.y -= 1; if !inner_area.contains(line_area.into()) { break; } } } }