module Buttons where import Dict import Html exposing (..) import Html.Attributes exposing (..) import Effects import Material.Button as Button exposing (Appearance(..), Coloring(..)) import Material.Grid as Grid import Material.Icon as Icon -- MODEL type alias Index = (Int, Int) tabulate' : Int -> List a -> List (Int, a) tabulate' i ys = case ys of [] -> [] y :: ys -> (i, y) :: tabulate' (i+1) ys tabulate : List a -> List (Int, a) tabulate = tabulate' 0 row : Appearance -> Bool -> List (Int, (Bool, Button.Config)) row appearance ripple = [ Plain, Colored, Primary, Accent ] |> List.map (\c -> (ripple, { coloring = c, appearance = appearance })) |> tabulate buttons : List (List (Index, (Bool, Button.Config))) buttons = [Flat, Raised, FAB, MiniFAB, Icon] |> List.concatMap (\a -> [row a False, row a True]) |> tabulate |> List.map (\(i, row) -> List.map (\(j, x) -> ((i,j), x)) row) model : Model model = { clicked = "" , buttons = buttons |> List.concatMap (List.map <| \(idx, (ripple, _)) -> (idx, Button.model ripple)) |> Dict.fromList } -- ACTION, UPDATE type Action = Action Index Button.Action type alias Model = { clicked : String , buttons : Dict.Dict Index Button.Model } update : Action -> Model -> (Model, Effects.Effects Action) update (Action idx action) model = 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) -- VIEW describe : Bool -> Button.Config -> String describe ripple config = let appearance = case config.appearance of Flat -> "flat" Raised -> "raised" FAB -> "FAB" MiniFAB -> "mini-FAB" Icon -> "icon" coloring = case config.coloring of Plain -> "plain" Colored -> "colored" Primary -> "primary" Accent -> "accent" in appearance ++ ", " ++ coloring ++ if ripple then " w/ripple" else "" view : Signal.Address Action -> Model -> Html view addr model = buttons |> List.concatMap (\row -> row |> List.map (\(idx, (ripple, config)) -> let model' = Dict.get idx model.buttons |> Maybe.withDefault (Button.model False) in Grid.cell [ Grid.col Grid.All 3] [ div [ style [ ("text-align", "center") , ("margin-top", "1em") , ("margin-bottom", "1em") ] ] [ Button.view (Signal.forwardTo addr (Action idx)) config model' [] [ case config.appearance of Flat -> text <| "Flat Button" Raised -> text <| "Raised Button" FAB -> Icon.i "add" MiniFAB -> Icon.i "zoom_in" Icon -> Icon.i "flight_land" ] , div [ style [ ("font-size", "9pt") , ("margin-top", "1em") ] ] [ text <| describe ripple config ] ] ] ) ) |> Grid.grid