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
use super::*;
#[derive(Default)]
pub struct Button {
offset: Vec2,
size: Vec2,
scale: f32,
text: String,
easing: f32,
pub pressed: bool,
pub hovered: bool,
}
impl Button {
pub fn draw<'s>(&'s mut self, r: &mut RenderLock<'s>, t: &'s Theme, pos: Vec2, size: Vec2, text: &str) -> bool {
if self.text != text || self.size != size {
let (offset, scale) = util::fit_text(text, t, size);
*self = Self {
offset,
size,
scale,
text: text.into(),
..*self
};
}
let Self { easing, pressed, hovered, .. } = self;
let delta = 1. / (t.easing * (*easing - 2.).abs());
*easing = (*easing + if *hovered { delta } else { -delta }).clamp(0., 1.);
let color = t.fg.mix(*easing, t.fg_focus).mix(*pressed, t.highlight);
*pressed &= *hovered;
let p = *pressed;
r.draw_with_logic(
Rect { pos, size, color },
move |e, _, _| {
let mut pass = |s: &Mod| *pressed = s.pressed();
match e {
OfferFocus => return DropFocus,
MouseButton { state, .. } => pass(state),
Keyboard { key, state } if *key == Key::Space => pass(state),
_ => (),
}
Reject
},
0,
);
*hovered = r.hovered();
r.draw(Text {
pos: pos.sum(self.offset),
color: t.text.mix(*hovered, t.text_focus).mix(p, t.text_highlight),
scale: self.scale,
text,
font: &t.font,
});
p
}
}