1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
use {Color, Colorable, Dimensions, Point, Rect, Sizeable, Widget};
use super::Style as Style;
use widget;
use widget::triangles::Triangle;
#[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)
}