use ascii_assets::TerminalChar;
use common_stdx::{Point, Rect};
use crate::{
DrawError, SpriteRegistry, error,
terminal_buffer::{self, BasicDrawCreator, Drawable, drawable::DoublePointed},
update_interval_handler::UpdateIntervalCreator,
};
#[derive(Clone, Debug)]
pub struct LineDrawable {
pub start: Point<i32>,
pub end: Point<i32>,
pub chr: TerminalChar,
}
impl DoublePointed for LineDrawable {
fn start(&self) -> Point<i32> {
self.start
}
fn end(&self) -> Point<i32> {
self.end
}
fn set_start(&mut self, p: Point<i32>) {
self.start = p;
}
fn set_end(&mut self, p: Point<i32>) {
self.end = p;
}
}
impl Drawable for LineDrawable {
fn size(&self, _sprites: &SpriteRegistry) -> Result<(u16, u16), DrawError> {
let min_x = self.start.x.min(self.end.x);
let max_x = self.start.x.max(self.end.x);
let min_y = self.start.y.min(self.end.y);
let max_y = self.start.y.max(self.end.y);
let width = max_x - min_x + 1;
let height = max_y - min_y + 1;
Ok((width as u16, height as u16))
}
fn as_double_pointed_mut(&mut self) -> Option<&mut dyn DoublePointed> {
Some(self)
}
fn draw(
&mut self,
_sprites: &SpriteRegistry,
) -> std::result::Result<terminal_buffer::basic_draw_creator::BasicDrawCreator, error::DrawError>
{
let mut bd_creator = BasicDrawCreator::new();
bd_creator.draw_line(self.start, self.end, self.chr);
Ok(bd_creator)
}
fn bounding_iv(&self, _sprites: &SpriteRegistry) -> Option<UpdateIntervalCreator> {
let mut c = UpdateIntervalCreator::new();
let min_x = self.start.x.min(self.end.x);
let max_x = self.start.x.max(self.end.x);
let min_y = self.start.y.min(self.end.y);
let max_y = self.start.y.max(self.end.y);
c.register_redraw_region(Rect {
p1: Point { x: min_x, y: min_y },
p2: Point {
x: max_x.saturating_add(1),
y: max_y.saturating_add(1),
},
});
Some(c)
}
}