use crate::{
DrawError, SpriteRegistry, drawable_traits::basic_draw_creator::BasicDrawCreator,
input_handler::manager::TargetScreen, update_interval_handler::UpdateIntervalCreator,
};
use ascii_assets::TerminalChar;
use common_stdx::{Point, Rect};
use log::warn;
pub mod basic_draw_creator;
#[derive(Debug, Clone, Copy)]
pub struct BasicDraw {
pub pos: Point<i32>,
pub chr: TerminalChar,
}
pub trait Drawable: std::fmt::Debug + Send {
fn draw(&mut self, sprites: &SpriteRegistry) -> Result<BasicDrawCreator, DrawError>;
fn bounding_iv(&self, _sprites: &SpriteRegistry) -> Option<UpdateIntervalCreator> {
None
}
fn size(&self, sprites: &SpriteRegistry) -> Result<(u16, u16), DrawError>;
fn on_screen_select(&mut self, selected_screen: TargetScreen) -> Result<(), DrawError> {
let _ = selected_screen;
Ok(())
}
fn get_top_left(&mut self) -> Option<Point<i32>> {
if self.as_double_pointed_mut().is_some() {
Some(self.as_double_pointed_mut().unwrap().start())
} else if self.as_single_pointed_mut().is_some() {
Some(self.as_single_pointed_mut().unwrap().position())
} else {
warn!("drawable has not been given an explicit top left corner");
warn!("to fix, implement get_top_left");
None
}
}
fn as_double_pointed_mut(&mut self) -> Option<&mut dyn DoublePointed> {
None
}
fn as_single_pointed_mut(&mut self) -> Option<&mut dyn SinglePointed> {
None
}
fn as_multi_pointed_mut(&mut self) -> Option<&mut dyn MultiPointed> {
None
}
fn as_screen_fitting_mut(&mut self) -> Option<&mut dyn ScreenFitting> {
None
}
}
pub trait SinglePointed {
fn position(&self) -> Point<i32>;
fn set_position(&mut self, p: Point<i32>);
}
pub trait DoublePointed {
fn start(&self) -> Point<i32>;
fn end(&self) -> Point<i32>;
fn set_start(&mut self, p: Point<i32>);
fn set_end(&mut self, p: Point<i32>);
}
pub trait MultiPointed {
fn get_point(&self, idx: usize) -> Option<Point<i32>>;
fn set_point(&mut self, idx: usize, p: Point<i32>);
fn points(&self) -> &[Point<i32>];
fn set_points(&mut self, points: Vec<Point<i32>>);
}
pub trait ScreenFitting {
fn fit_to_screen(&mut self, rect: Rect<i32>);
}