use {
Color,
Colorable,
Dimensions,
Borderable,
Positionable,
Scalar,
Sizeable,
Widget,
};
use widget;
#[derive(Copy, Clone, Debug)]
pub struct BorderedRectangle {
pub common: widget::CommonBuilder,
pub style: Style,
}
widget_ids! {
struct Ids {
border,
rectangle,
}
}
widget_style!{
style Style {
- color: Color { theme.shape_color }
- border: Scalar { theme.border_width }
- border_color: Color { theme.border_color }
}
}
pub struct State {
ids: Ids,
}
impl BorderedRectangle {
pub fn new(dim: Dimensions) -> Self {
BorderedRectangle {
common: widget::CommonBuilder::new(),
style: Style::new(),
}.wh(dim)
}
builder_method!(pub with_style { style = Style });
}
impl Widget for BorderedRectangle {
type State = State;
type Style = Style;
type Event = ();
fn common(&self) -> &widget::CommonBuilder {
&self.common
}
fn common_mut(&mut self) -> &mut widget::CommonBuilder {
&mut self.common
}
fn init_state(&self, id_gen: widget::id::Generator) -> Self::State {
State {
ids: Ids::new(id_gen),
}
}
fn style(&self) -> Self::Style {
self.style.clone()
}
fn update(self, args: widget::UpdateArgs<Self>) -> Self::Event {
let widget::UpdateArgs { id, state, style, rect, ui, .. } = args;
let border = style.border(&ui.theme);
if border > 0.0 {
let border_color = style.border_color(&ui.theme);
widget::Rectangle::fill(rect.dim())
.xy(rect.xy())
.color(border_color)
.parent(id)
.graphics_for(id)
.set(state.ids.border, ui);
}
let color = style.color(&ui.theme);
widget::Rectangle::fill(rect.pad(border).dim())
.xy(rect.xy())
.color(color)
.parent(id)
.graphics_for(id)
.set(state.ids.rectangle, ui);
}
}
impl Colorable for BorderedRectangle {
builder_method!(color { style.color = Some(Color) });
}
impl Borderable for BorderedRectangle {
builder_methods!{
border { style.border = Some(Scalar) }
border_color { style.border_color = Some(Color) }
}
}