From 8b7c56df1940d2ac6e3ece3385464009e46382fa Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Thu, 25 Jul 2024 17:44:27 +0200 Subject: implement simple log view --- src/widgets/logview.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/widgets/mod.rs | 1 + 2 files changed, 49 insertions(+) create mode 100644 src/widgets/logview.rs (limited to 'src/widgets') diff --git a/src/widgets/logview.rs b/src/widgets/logview.rs new file mode 100644 index 0000000..4259e35 --- /dev/null +++ b/src/widgets/logview.rs @@ -0,0 +1,48 @@ +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; + } + } + } +} diff --git a/src/widgets/mod.rs b/src/widgets/mod.rs index 8a9b1a0..48e6854 100644 --- a/src/widgets/mod.rs +++ b/src/widgets/mod.rs @@ -1,2 +1,3 @@ pub mod sheetview; pub mod luaeditor; +pub mod logview; -- cgit v1.2.3-70-g09d2