Skip to content

Commit 7e1e6bc

Browse files
committed
Add a rotate and a shuffle button
1 parent f01855d commit 7e1e6bc

File tree

5 files changed

+95
-5
lines changed

5 files changed

+95
-5
lines changed

src/elm/Lib/Icons.elm

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ import Ionicon
66
import Ionicon.Android
77
import Svg exposing (Svg)
88

9+
rotate : Svg msg
10+
rotate =
11+
display Ionicon.refresh
12+
13+
shuffle : Svg msg
14+
shuffle =
15+
display Ionicon.shuffle
16+
917
plus : Svg msg
1018
plus =
1119
display Ionicon.plus

src/elm/Main.elm

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ port module Main exposing (..)
33
import Browser
44
import Browser.Navigation as Nav
55
import Html exposing (..)
6-
import Html.Attributes exposing (class, id, type_, value)
6+
import Html.Attributes exposing (class, disabled, hidden, id, type_, value)
77
import Html.Events exposing (onClick, onInput, onSubmit)
88
import Js.Commands
99
import Js.Events
@@ -14,6 +14,7 @@ import Lib.Icons as Icons
1414
import Lib.ListExtras exposing (assign, rotate, uncons)
1515
import Mobbers exposing (Mobber, Mobbers)
1616
import Random
17+
import Random.List
1718
import SharedEvents
1819
import Sound.Library
1920
import Svg exposing (Svg, svg)
@@ -100,6 +101,7 @@ type Msg
100101
| UnknownEvent
101102
| MobberNameChanged String
102103
| AddMobber
104+
| ShuffleMobbers
103105

104106

105107
update : Msg -> Model -> ( Model, Cmd Msg )
@@ -176,6 +178,9 @@ update msg model =
176178
|> sendEvent
177179
)
178180

181+
ShuffleMobbers ->
182+
( model, Random.generate (ShareEvent << SharedEvents.ShuffledMobbers) <| Random.List.shuffle model.mobbers )
183+
179184

180185
hasTurnEnded : Model -> Bool
181186
hasTurnEnded model =
@@ -186,6 +191,7 @@ hasTurnEnded model =
186191
_ ->
187192
False
188193

194+
189195
end : ClockState -> ClockState
190196
end clockState =
191197
case clockState of
@@ -237,6 +243,12 @@ applyTo state event =
237243
( SharedEvents.DeletedMobber mobber, _ ) ->
238244
( { state | mobbers = List.filter (\m -> m /= mobber) state.mobbers }, Cmd.none )
239245

246+
( SharedEvents.RotatedMobbers, _ ) ->
247+
( { state | mobbers = rotate state.mobbers }, Cmd.none )
248+
249+
( SharedEvents.ShuffledMobbers mobbers, _ ) ->
250+
( { state | mobbers = mobbers }, Cmd.none )
251+
240252
_ ->
241253
( state, Cmd.none )
242254

@@ -301,6 +313,24 @@ view model =
301313
[ input [ type_ "text", onInput MobberNameChanged, value model.mobberName ] []
302314
, button [ type_ "submit" ] [ Icons.plus ]
303315
]
316+
, div [ class "button-row" ]
317+
[ button
318+
[ class "labelled-icon-button"
319+
, disabled (List.length model.mobbers < 2)
320+
, onClick <| ShareEvent <| SharedEvents.RotatedMobbers
321+
]
322+
[ Icons.rotate
323+
, text "Rotate"
324+
]
325+
, button
326+
[ class "labelled-icon-button"
327+
, disabled (List.length model.mobbers < 3)
328+
, onClick ShuffleMobbers
329+
]
330+
[ Icons.shuffle
331+
, text "Shuffle"
332+
]
333+
]
304334
, ul []
305335
(model.mobbers
306336
|> assign [ "Driver", "Navigator" ]

src/elm/SharedEvents.elm

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module SharedEvents exposing (..)
22

33
import Json.Decode
44
import Json.Encode
5-
import Mobbers exposing (Mobber)
5+
import Mobbers exposing (Mobber, Mobbers)
66
import Sound.Library
77
import Time
88

@@ -12,6 +12,8 @@ type Event
1212
| Stopped
1313
| AddedMobber Mobber
1414
| DeletedMobber Mobber
15+
| RotatedMobbers
16+
| ShuffledMobbers Mobbers
1517

1618

1719

@@ -44,6 +46,12 @@ decoderFromName eventName =
4446
"DeletedMobber" ->
4547
Json.Decode.map DeletedMobber (Json.Decode.field "mobber" Mobbers.jsonDecoder)
4648

49+
"ShuffledMobbers" ->
50+
Json.Decode.map ShuffledMobbers (Json.Decode.field "mobbers" (Json.Decode.list Mobbers.jsonDecoder))
51+
52+
"RotatedMobbers" ->
53+
Json.Decode.succeed RotatedMobbers
54+
4755
_ ->
4856
Json.Decode.fail <| "I don't know this event " ++ eventName
4957

@@ -87,3 +95,13 @@ toJson event =
8795
[ ( "name", Json.Encode.string "DeletedMobber" )
8896
, ( "mobber", Mobbers.toJson mobber )
8997
]
98+
99+
ShuffledMobbers mobbers ->
100+
[ ( "name", Json.Encode.string "ShuffledMobbers" )
101+
, ( "mobbers", Json.Encode.list Mobbers.toJson mobbers )
102+
]
103+
104+
RotatedMobbers ->
105+
[ ( "name", Json.Encode.string "RotatedMobbers" ) ]
106+
107+

src/sass/_header.scss

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,9 @@ nav {
139139
button {
140140
flex: 1 1;
141141
display: inline-block;
142-
font-size: 1.2em;
142+
font-size: 1.4em;
143143
text-align: center;
144-
padding: 4px 0;
144+
padding: $padding-space 0;
145145
text-shadow: 1px 1px 1px #666;
146146
border-right: 1px solid $border-color;
147147
color: white;

src/sass/main.scss

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,48 @@ button {
6262
border: none;
6363
background: $dark-button-color;
6464
color: white;
65-
padding: 0 20px;
6665
outline: none;
6766
cursor: pointer;
6867
font-size: .9em;
68+
@include icon(1.3em, white);
69+
display: inline-flex;
70+
align-items: center;
71+
padding: $padding-space;
6972

7073
&:hover {
7174
background: $light-button-color;
7275
}
76+
77+
&[disabled] {
78+
opacity: .6;
79+
cursor: auto;
80+
&:hover {
81+
background: $dark-button-color;
82+
}
83+
}
84+
}
85+
86+
.labelled-icon-button {
87+
.icon {
88+
padding-right: .4em;
89+
margin-right: .4em;
90+
border-right: 1px solid white;
91+
}
92+
}
93+
94+
.button-row {
95+
display: flex;
96+
margin: $margin-space 0;
97+
98+
button {
99+
flex: auto;
100+
justify-content: center;
101+
margin-left: .2em;
102+
103+
&:first-child {
104+
margin-left: 0;
105+
}
106+
}
73107
}
74108

75109
.form-field {

0 commit comments

Comments
 (0)