#![warn(missing_docs)]
use tui::{
buffer::Buffer,
layout::Rect,
widgets::{Block, Widget},
};
pub mod chunkmap;
pub mod screen_character;
use super::charview::{chunkmap::ChunkMap, screen_character::ScreenCharacter};
pub type CharChunkMap = ChunkMap<ScreenCharacter>;
#[derive(Debug, Clone, Copy)]
pub struct ViewportLocation {
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone)]
pub struct CharView<'a> {
data: &'a CharChunkMap,
block: Option<Block<'a>>,
viewport: ViewportLocation,
}
impl<'a> CharView<'a> {
pub fn new(data: &'a CharChunkMap) -> CharView<'a> {
CharView {
block: None,
viewport: ViewportLocation { x: 0, y: 0 },
data,
}
}
pub fn block(mut self, block: Block<'a>) -> CharView<'a> {
self.block = Some(block);
self
}
pub fn viewport(mut self, viewport: ViewportLocation) -> CharView<'a> {
self.viewport = viewport;
self
}
}
impl<'a> Widget for CharView<'a> {
fn render(mut self, area: Rect, buf: &mut Buffer) {
let charview_area = match self.block.take() {
Some(b) => {
let inner_area = b.inner(area);
b.render(area, buf);
inner_area
}
None => area,
};
if charview_area.height < 1 {
return;
}
for y in charview_area.top()..charview_area.bottom() {
for x in charview_area.left()..charview_area.right() {
let shifted_x: i32 = (x - charview_area.left()) as i32 + self.viewport.x;
let shifted_y: i32 = (y - charview_area.top()) as i32 + self.viewport.y;
if let Some(screen_character) = self.data.get(shifted_x, shifted_y) {
buf.get_mut(x, y)
.set_char(screen_character.c)
.set_style((*screen_character).style.unwrap_or_default());
}
}
}
}
}