diff options
Diffstat (limited to 'src/Main.elm')
-rw-r--r-- | src/Main.elm | 101 |
1 files changed, 0 insertions, 101 deletions
diff --git a/src/Main.elm b/src/Main.elm deleted file mode 100644 index 5066ad6..0000000 --- a/src/Main.elm +++ /dev/null @@ -1,101 +0,0 @@ -port module Main exposing (..) - -import Browser -import Html exposing (Html, button, div, text, br, input, img) -import Html.Attributes exposing (style, class, value, placeholder, src) -import Html.Events exposing (onInput, onClick) -import Html.Lazy exposing (lazy) -import List exposing (foldr) - -import Protocol exposing (decodeState, encodeState) -import Json.Decode as D - - -main = Browser.document - { init = init - , update = update - , view = view - , subscriptions = subscriptions - } - - -- subscribe to messages from the websocket -subscriptions : Model -> Sub Msg -subscriptions model = recvPort GotMessage - - -- corresponding ports for the subscriptions -port recvPort : (String -> msg) -> Sub msg -port sendPort : String -> Cmd msg - - -{- STATE AND STATE TRANSITIONS -} - - -- the main client state -type alias Model = { slide : Int, max : Int } - - -- start at the first slide, for now just assume that we have ten slides -init : () -> (Model, Cmd Msg) -init f = ( { slide = 0, max = 10 }, Cmd.none) - - -- possible state transitions: -type Msg = GotMessage String - | NextSlide - | PrevSlide - - -- update stuff -update : Msg -> Model -> (Model, Cmd Msg) -update msg model = case msg of - NextSlide -> updateSlide ((+) 1) model - PrevSlide -> updateSlide ((+) -1) model - GotMessage text -> - case decodeState text of - Nothing -> (model, Cmd.none) - Just newstate -> ({model | slide = newstate.state }, Cmd.none) - - -- while changing slides we must take care not to end up in an invalid - -- state (where slide > max), so this logic gets its own function -tweakSlide : (Int -> Int) -> Model -> Model -tweakSlide f model = { model | slide = modBy model.max (f model.slide) } - -updateSlide : (Int -> Int) -> Model -> (Model, Cmd Msg) -updateSlide f model = - let new = tweakSlide f model - in (new, sendPort (encodeState { state = new.slide })) - -{- VIEW COMPONENTS -} - - -- our body consists of a slide container and a couple controls -body : Model -> Html Msg -body model = div [] - [ div [class "slides"] (slideView model.slide model.max) - , div [class "controls"] - [ button [ onClick PrevSlide ] [ text "←" ] - , text (String.fromInt (model.slide+1)) - , button [ onClick NextSlide ] [ text "→" ] - ] - ] - - -- the slide view is just a list of img tags, one for each slide; note - -- that these are all loaded on startup, with visibility done through - -- z indices so we won't have lags while switching between them. -slideView : Int -> Int -> List (Html Msg) -slideView i max = List.range 0 (max - 1) - |> List.map (\x -> ("example/" ++ (padNum 2 (x+1)) ++ ".png", x == i)) - |> List.map (\(path,t) -> img [src path, onTop t] []) - -onTop t = style "z-index" (String.fromInt (if t then 10 else 0)) - - -- format an int with prefixed 0's — apparently elm doesn't have a - -- standard function for that, but it's needed for slide filenames -padNum : Int -> Int -> String -padNum l num = - let str = String.fromInt num - in if (String.length str) > l then str else - (String.repeat (l - String.length str) "0") ++ str - - -view : Model -> Browser.Document Msg -view model = { title = "Websockets example" - , body = [body model] - } - - |