use ratatui::{crossterm::event::KeyEvent, style::{Color, Style}, text::ToSpan, widgets::{Widget, Paragraph}}; use crate::lua::iobuffer::{iobuffer, BufferChunk}; use crate::config::GlobalConfig; use crate::lua; use super::statusbar::StatusBar; #[derive(Default)] pub struct LogView { bar: StatusBar, } impl LogView { pub fn new() -> Self { Self { bar: StatusBar::new(), } } pub fn handle_key_event(&mut self, _event: KeyEvent) {} } impl Widget for &mut LogView { fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer) where Self: Sized, { let theme = GlobalConfig::get().theme.view.clone(); self.bar.render(area, buf); let inner_area = self.bar.area(area); let chunks = { let buffer = iobuffer().read().unwrap(); buffer.get() }; let mut line_area = inner_area; line_area.height = 1; line_area.y = inner_area.y + inner_area.height - 1; theme .background .get((), lua::get()) .unwrap_or_default() .apply(Paragraph::default()) .render(inner_area, buf); for chunk in chunks.into_iter().rev() { if line_area.y < inner_area.y { break; } let (lines, color) = match chunk { BufferChunk::StdOut(s) => (s, Color::White), BufferChunk::StdErr(s) => (s, Color::Red), }; for line in lines.lines().rev() { if line_area.y < inner_area.y { break; } let line = line.to_span().style(Style::default().fg(color)); line.render(line_area, buf); line_area.y -= 1; } } } }