use std::cell::Cell;
use crossterm::cursor::MoveToColumn;
use crossterm::cursor::MoveUp;
use crossterm::terminal::Clear;
use crossterm::terminal::ClearType;
use crossterm::QueueableCommand;
use crate::components::Dimensions;
use crate::components::DrawMode;
use crate::Component;
use crate::Lines;
#[derive(Debug, Default)]
pub(crate) struct Canvas {
last_lines: Cell<u16>,
}
impl Canvas {
pub(crate) fn draw(
&self,
root: &dyn Component,
dimensions: Dimensions,
mode: DrawMode,
) -> anyhow::Result<Lines> {
let mut output = root.draw(dimensions, mode)?;
output.shrink_lines_to_dimensions(dimensions);
self.last_lines.set(output.len().try_into()?);
Ok(output)
}
}
impl Canvas {
pub(crate) fn new() -> Self {
Self {
..Default::default()
}
}
pub(crate) fn move_up(&self, writer: &mut Vec<u8>) -> anyhow::Result<()> {
let len = self.last_lines.take();
writer.queue(MoveUp(len))?;
writer.queue(MoveToColumn(0))?;
Ok(())
}
pub fn clear(&self, writer: &mut Vec<u8>) -> anyhow::Result<()> {
self.move_up(writer)?;
writer.queue(Clear(ClearType::FromCursorDown))?;
Ok(())
}
}