use super::Style;
use widget;
use widget::triangles::Triangle;
use {Color, Colorable, Dimensions, Point, Rect, Sizeable, Widget};
#[derive(Copy, Clone, Debug, WidgetCommon_)]
pub struct Rectangle {
#[conrod(common_builder)]
pub common: widget::CommonBuilder,
pub style: Style,
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct State {
kind: Kind,
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum Kind {
Outline,
Fill,
}
impl Rectangle {
pub fn styled(dim: Dimensions, style: Style) -> Self {
Rectangle {
common: widget::CommonBuilder::default(),
style: style,
}
.wh(dim)
}
pub fn fill(dim: Dimensions) -> Self {
Rectangle::styled(dim, Style::fill())
}
pub fn fill_with(dim: Dimensions, color: Color) -> Self {
Rectangle::styled(dim, Style::fill_with(color))
}
pub fn outline(dim: Dimensions) -> Self {
Rectangle::styled(dim, Style::outline())
}
pub fn outline_styled(dim: Dimensions, line_style: widget::line::Style) -> Self {
Rectangle::styled(dim, Style::outline_styled(line_style))
}
}
impl Widget for Rectangle {
type State = State;
type Style = Style;
type Event = ();
fn init_state(&self, _: widget::id::Generator) -> Self::State {
State { kind: Kind::Fill }
}
fn style(&self) -> Self::Style {
self.style.clone()
}
fn update(self, args: widget::UpdateArgs<Self>) -> Self::Event {
let widget::UpdateArgs { state, style, .. } = args;
let kind = match *style {
Style::Fill(_) => Kind::Fill,
Style::Outline(_) => Kind::Outline,
};
if state.kind != kind {
state.update(|state| state.kind = kind);
}
}
}
impl Colorable for Rectangle {
fn color(mut self, color: Color) -> Self {
self.style.set_color(color);
self
}
}
pub fn triangles(rect: Rect) -> (Triangle<Point>, Triangle<Point>) {
let (l, r, b, t) = rect.l_r_b_t();
let quad = [[l, t], [r, t], [r, b], [l, b]];
widget::triangles::from_quad(quad)
}