gestures/
gestures.rs

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            // target offset
24            state(LocalOffset::zero, move |anim_off, cx| {
25                // animated offset
26                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}