use view::{SizeRequest, View, ViewWrapper}; use printer::Printer; use vec::Vec2; use theme::ColorStyle; /// Wrapper view that adds a shadow. /// /// It reserves a 1 pixel border on each side. pub struct ShadowView { view: T, } impl ShadowView { /// Wraps the given view. pub fn new(view: T) -> Self { ShadowView { view: view } } } impl ViewWrapper for ShadowView { wrap_impl!(&self.view); fn wrap_get_min_size(&self, req: SizeRequest) -> Vec2 { self.view.get_min_size(req.reduced((2, 2))) + (2, 2) } fn wrap_layout(&mut self, size: Vec2) { self.view.layout(size - (2, 2)); } fn wrap_draw(&mut self, printer: &Printer) { // Draw the view background for y in 1..printer.size.y - 1 { printer.print_hline((1, y), printer.size.x - 2, " "); } self.view.draw(&printer.sub_printer(Vec2::new(1, 1), printer.size - (2, 2), true)); let h = printer.size.y - 1; let w = printer.size.x - 1; printer.with_color(ColorStyle::Shadow, |printer| { printer.print_hline((2, h), w - 1, " "); printer.print_vline((w, 2), h - 1, " "); }); } }