1use rui::*;
2
3fn anim_to(current: &mut LocalOffset, target: LocalOffset) -> bool {
4 if *current != target {
5 if (*current - target).length() < 0.01 {
6 *current = target;
7 } else {
8 *current = current.lerp(target, 0.05);
9 }
10 true
11 } else {
12 false
13 }
14}
15
16fn main() {
17 rui(hstack((
18 circle()
19 .color(RED_HIGHLIGHT.alpha(0.8))
20 .tap(|_cx| println!("tapped circle"))
21 .padding(Auto),
22 state(LocalOffset::zero, move |off, _| {
23 state(LocalOffset::zero, move |anim_off, cx| {
25 rectangle()
27 .corner_radius(5.0)
28 .color(AZURE_HIGHLIGHT.alpha(0.8))
29 .offset(cx[anim_off])
30 .drag(move |cx, delta, state, _| {
31 cx[off] += delta;
32 cx[anim_off] = cx[off];
33 if state == GestureState::Ended {
34 cx[off] = LocalOffset::zero();
35 }
36 })
37 .anim(move |cx, _dt| {
38 let mut v = cx[anim_off];
39 if anim_to(&mut v, cx[off]) {
40 cx[anim_off] = v;
41 }
42 })
43 .padding(Auto)
44 })
45 }),
46 )));
47}