use std::io;
use ratatui::text::{Line, Span};
use crate::{buffer::Buffer, keymap::KeyEvent, styling::Style, window::WindowTree};
pub struct StateSnapshot<'a> {
pub bufs: &'a [Buffer],
pub windows: &'a WindowTree,
pub minibuffer: &'a Buffer,
pub focus_minibuffer: bool,
pub bufno: usize,
pub keyevent: Option<KeyEvent>,
pub cursor_style: CursorStyle,
}
impl StateSnapshot<'_> {
pub fn focused(&self) -> &Buffer {
if self.focus_minibuffer {
self.minibuffer
} else {
&self.bufs[self.windows.focused_bufno()]
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CursorStyle {
Bar,
Block,
}
pub struct RenderedFrame {
pub status_left: Vec<Span<'static>>,
pub status_right: Vec<Span<'static>>,
pub bottom_extra: Vec<RenderedBottom>,
pub per_buf: Vec<RenderedBuffer>,
}
pub struct RenderedBottom {
pub lines: Vec<Vec<Span<'static>>>,
}
#[derive(Default)]
pub struct RenderedBuffer {
pub gutters: Vec<RenderedGutter>,
pub decorators: Vec<DecoratorRanges>,
}
pub struct RenderedGutter {
pub width: u16,
pub rows: Vec<Line<'static>>,
}
#[derive(Default)]
pub struct DecoratorRanges {
pub ranges: Vec<StyledRange>,
}
#[derive(Clone, Debug)]
pub struct StyledRange {
pub row: usize,
pub col: usize,
pub len: usize,
pub style: Style,
pub pad_to_width: bool,
}
pub trait Renderer {
fn render(&mut self, snap: StateSnapshot<'_>, frame: &RenderedFrame) -> io::Result<()>;
}