-
Notifications
You must be signed in to change notification settings - Fork 3
/
Main.elm
116 lines (92 loc) · 2.5 KB
/
Main.elm
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
module Main exposing (main)
import Browser
import Browser.Events exposing (onAnimationFrameDelta)
import Html exposing (..)
import Html.Attributes as Attributes exposing (..)
import Html.Events exposing (..)
import Round exposing (round)
import Ui exposing (..)
main : Program () Model Msg
main =
Browser.element
{ init = init
, update = update
, view = view
, subscriptions = subscriptions
}
type alias Model =
{ elapsed : Float, total : Float }
type Msg
= Tick Float
| SizeInput Float
| Reset
init () =
( { elapsed = 0, total = 15 * 1000 }, Cmd.none )
subscriptions { elapsed, total } =
if elapsed < total then
onAnimationFrameDelta Tick
else
Sub.none
update msg model =
case msg of
Tick delta ->
( { model | elapsed = model.elapsed + delta }, Cmd.none )
SizeInput total ->
( { model | total = total }, Cmd.none )
Reset ->
init ()
view : Model -> Html Msg
view ({ elapsed, total } as model) =
let
progress =
elapsed * 100 / total
in
div
[ style "display" "flex"
, style "flex-direction" "column"
]
[ box
[ style "display" "flex"
, style "align-items" "center"
]
[ span [ style "margin-right" "0.5rem" ] [ text "Elapsed time:" ]
, progressBar [ style "flex" "1" ] progress
]
, box [] [ text <| round 1 (elapsed / 1000) ++ "s" ]
, box
[ style "display" "flex"
, style "align-items" "center"
]
[ span [ style "margin-right" "0.5rem" ] [ text "Duration:" ]
, duration [ style "flex" "1" ] total
]
, box [] [ button [ style "width" "100%", onClick Reset ] [ text "Reset" ] ]
]
progressBar attrs val =
progress
([ Attributes.max "100"
, value <|
if isInfinite val then
"100"
else
String.fromFloat val
]
++ attrs
)
[]
duration attrs total =
input
([ type_ "range"
, Attributes.min "0"
, Attributes.max "30000"
, value <|
if isInfinite total then
"30000"
else
String.fromFloat total
, step "100"
, onInput <| SizeInput << (\s -> String.toFloat s |> Maybe.withDefault 0)
]
++ attrs
)
[]