use crate::color::Color;
use crate::graphics::*;
use crate::input::*;
use crate::widget::*;
use std::io;
pub struct Canvas {
pub background: Option<Color>,
pub foreground: Option<Color>,
pub drawings: Vec<Drawing>,
pub elements: ElementaryWidget,
}
impl Canvas {
pub fn new() -> Canvas {
Default::default()
}
pub fn set_layout<L: Layout + 'static>(mut self, layout: L) -> Self {
self.elements.set_layout(layout);
self
}
pub fn add_element<E: LayoutElement + 'static, I: IntoLayoutElement<E>>(
mut self,
item: I,
) -> Self {
self.elements.add_element(item);
self
}
pub fn set_color(mut self, foreground: Option<Color>, background: Option<Color>) -> Self {
self.foreground = foreground;
self.background = background;
self
}
pub fn add_drawing(mut self, drawing: Drawing) -> Self {
self.drawings.push(drawing);
self
}
}
impl Default for Canvas {
fn default() -> Canvas {
Canvas {
background: None,
foreground: None,
elements: ElementaryWidget::new(),
drawings: vec![],
}
}
}
impl Widget for Canvas {
fn render(&self, painter: &mut Painter) -> io::Result<()> {
trace!("Drawing into {:?}", painter.get_area());
if let Some(c) = self.background {
painter.fill(c)?;
}
let mystyle = Style {
foreground: self.foreground,
background: self.background,
..Default::default()
};
let scope = painter.get_area();
let painter = &mut PainterScope::new(painter, scope, mystyle);
for ref mut drawing in self.drawings.iter() {
painter.paint(drawing.clone())?;
}
self.elements.render(painter)
}
fn arrange(&mut self, window: Window) {
self.elements.arrange(window)
}
fn consume(&mut self, input: Vec<GrinInput>) -> Vec<GrinInput> {
self.elements.consume(input)
}
}