elm-mdl/examples/Demo/Buttons.elm

173 lines
4.3 KiB
Elm
Raw Normal View History

2016-03-14 10:00:58 +00:00
module Demo.Buttons where
import Dict
import Html exposing (..)
import Html.Attributes exposing (..)
import Effects
import Material.Button as Button exposing (..)
import Material.Grid as Grid
import Material.Icon as Icon
2016-03-19 22:47:21 +00:00
import Material.Style exposing (Style)
2016-03-14 10:00:58 +00:00
2016-03-31 19:58:30 +00:00
import Material.Textfield as Textfield
import Material.Component as Component
import Material.Component.All as Setup
2016-03-31 19:58:30 +00:00
2016-03-14 10:00:58 +00:00
-- MODEL
type alias Index = (Int, Int)
2016-03-14 10:00:58 +00:00
type alias View =
2016-03-19 22:47:21 +00:00
Signal.Address Button.Action -> Button.Model -> List Style -> List Html -> Html
2016-03-14 10:00:58 +00:00
2016-03-14 10:00:58 +00:00
type alias View' =
Signal.Address Button.Action -> Button.Model -> Html
2016-03-19 22:47:21 +00:00
view' : View -> List Style -> Html -> Signal.Address Button.Action -> Button.Model -> Html
2016-03-14 10:00:58 +00:00
view' view coloring elem addr model =
view addr model coloring [elem]
2016-03-19 22:47:21 +00:00
describe : String -> Bool -> String -> String
describe kind ripple c =
2016-03-14 10:00:58 +00:00
kind ++ ", " ++ c ++ if ripple then " w/ripple" else ""
row : (String, Html, View) -> Bool -> List (Int, (Bool, String, View'))
row (kind, elem, v) ripple =
2016-03-19 22:47:21 +00:00
[ ("plain", [])
, ("colored", [Button.colored])
, ("primary", [Button.primary])
, ("accent", [Button.accent])
]
|> List.map (\(d,c) -> (ripple, describe kind ripple d, view' v c elem))
|> List.indexedMap (,)
2016-03-14 10:00:58 +00:00
buttons : List (List (Index, (Bool, String, View')))
buttons =
[ ("flat", text "Flat Button", Button.flat)
, ("raised", text "Raised Button", Button.raised)
, ("FAB", Icon.i "add", Button.fab)
, ("mini-FAB", Icon.i "zoom_in", Button.minifab)
, ("icon", Icon.i "flight_land", Button.icon)
]
|> List.concatMap (\a -> [row a False, row a True])
2016-03-19 22:47:21 +00:00
|> List.indexedMap (\i r -> List.map (\(j, x) -> ((i,j), x)) r)
2016-03-14 10:00:58 +00:00
model : Model
model =
{ clicked = ""
, buttons =
buttons
|> List.concatMap (List.map <| \(idx, (ripple, _, _)) -> (idx, Button.model ripple))
|> Dict.fromList
, componentState = Setup.state
2016-03-14 10:00:58 +00:00
}
-- ACTION, UPDATE
2016-03-31 19:58:30 +00:00
type Action
= Action Index Button.Action
| State (Setup.Action Action)
2016-03-31 19:58:30 +00:00
| Click
| Input String
2016-03-14 10:00:58 +00:00
type alias Model =
{ clicked : String
, buttons : Dict.Dict Index Button.Model
, componentState : Setup.State
2016-03-14 10:00:58 +00:00
}
update : Action -> Model -> (Model, Effects.Effects Action)
2016-03-31 19:58:30 +00:00
update action model =
case action of
Action idx action ->
Dict.get idx model.buttons
|> Maybe.map (\m0 ->
let
(m1, e) = Button.update action m0
in
({ model | buttons = Dict.insert idx m1 model.buttons }, Effects.map (Action idx) e)
)
|> Maybe.withDefault (model, Effects.none)
State action' ->
Component.update State update action' model
2016-03-31 19:58:30 +00:00
Click ->
( tf.map (\m -> { m | value = "You clicked!" }) model, Effects.none )
Input str ->
( tf.map (\m -> { m | value = "You wrote '" ++ str ++ "' in the other guy."}) model
, Effects.none
)
instance = Component.instance State
instance' = Component.instance' State
2016-03-31 19:58:30 +00:00
tf = instance <| Textfield.component Textfield.model 4
2016-03-31 19:58:30 +00:00
2016-03-14 10:00:58 +00:00
-- VIEW
2016-03-31 19:58:30 +00:00
2016-03-14 10:00:58 +00:00
view : Signal.Address Action -> Model -> Html
view addr model =
buttons |> List.concatMap (\row ->
row |> List.concatMap (\(idx, (ripple, description, view)) ->
let model' =
Dict.get idx model.buttons |> Maybe.withDefault (Button.model False)
in
[ Grid.cell
[ Grid.size Grid.All 3]
[ div
[ style
[ ("text-align", "center")
, ("margin-top", "1em")
, ("margin-bottom", "1em")
]
]
[ view
(Signal.forwardTo addr (Action idx))
model'
, div
[ style
[ ("font-size", "9pt")
, ("margin-top", "1em")
]
]
[ text description
]
]
]
]
)
)
2016-03-31 19:58:30 +00:00
|> (\contents ->
div []
[ instance' (Button.component Button.flat (Button.model True) 1 |> onClick Click) addr model [] [ text "Click me (1)" ]
, instance' (Button.component Button.raised (Button.model False) 2) addr model [] [ text "Click me (2)" ]
, instance' (Textfield.component Textfield.model 3 |> Textfield.onInput Input) addr model
2016-03-31 19:58:30 +00:00
, tf.view addr model
, Grid.grid [] contents
]
)
--i = instance' State (buttonWidget (Button.model True) 1) -- addr model.componentState [] [ text "Click me (1)" ]