blob: d5408a0fcc2ca2d5b5c9fb9e3db9638a9f9c1a0c (
plain)
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
|
# A stopwatch. Time is an input: a timer ticks while a surface runs the app,
# and each tick sees the time it happened (now); the views only show states.
use vega
record Lap {
at = 0
}
state running = false
state started = 0
state elapsed = 0
state laps: list of Lap
state at: index of laps
input toggle = key Space
input lap = key KeyL
input reset = key KeyR
input tick = every 100 ms
fn two(n) = if n < 10 { "0{n}" } else { "{n}" }
fn tenths(ms) = "{floor(ms / 60000)}:{two(floor(ms / 1000) % 60)}.{floor(ms / 100) % 10}"
on toggle.down {
if running { elapsed = now - started }
running = !running
if running { started = now - elapsed }
}
on tick { if running { elapsed = now - started } }
on lap.down {
laps.append(Lap { at: elapsed })
at = laps.last
}
on reset.down { if !running { elapsed = 0 } }
view title = "Stopwatch"
view time = tenths(elapsed)
view status = if running { "running" } else { "stopped" }
view laps_list = each l in laps {
label = tenths(l.at)
tone = vega.when(l.position == laps.count - 1, vega.accent)
}
view laps_list_focus = at.position
|