use crate::buffer::Buffer;
use crate::layout::{Position, Rect};
use crate::widgets::{StatefulWidget, Widget};
#[derive(Debug, Hash)]
pub struct Frame<'a> {
pub(crate) cursor_position: Option<Position>,
pub(crate) viewport_area: Rect,
pub(crate) buffer: &'a mut Buffer,
pub(crate) count: usize,
}
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub struct CompletedFrame<'a> {
pub buffer: &'a Buffer,
pub area: Rect,
pub count: usize,
}
impl Frame<'_> {
pub const fn area(&self) -> Rect {
self.viewport_area
}
#[deprecated = "use `area()` instead"]
pub const fn size(&self) -> Rect {
self.viewport_area
}
pub fn render_widget<W: Widget>(&mut self, widget: W, area: Rect) {
widget.render(area, self.buffer);
}
pub fn render_stateful_widget<W>(&mut self, widget: W, area: Rect, state: &mut W::State)
where
W: StatefulWidget,
{
widget.render(area, self.buffer, state);
}
pub fn set_cursor_position<P: Into<Position>>(&mut self, position: P) {
self.cursor_position = Some(position.into());
}
#[deprecated = "use `set_cursor_position((x, y))` instead which takes `impl Into<Position>`"]
pub fn set_cursor(&mut self, x: u16, y: u16) {
self.set_cursor_position(Position { x, y });
}
pub const fn buffer_mut(&mut self) -> &mut Buffer {
self.buffer
}
pub const fn count(&self) -> usize {
self.count
}
}