module View.Timer ( timerView ) where import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) import Time exposing (Time) import Signal import Maybe import List import String import Model.Model exposing (..) import Model.Timer exposing (..) import Model.Edition.Edition exposing (..) import Model.Edition.NameEdition exposing (..) import Model.Edition.TimeEdition exposing (..) import Model.TimerState exposing (..) import Model.Id exposing (..) import Update.Update exposing (..) import Update.UpdateTimer exposing (..) import View.ActivatedClasses exposing (..) import Utils.Maybe exposing (..) timerView : Model -> (Id, Timer) -> Html timerView model (id, timer) = div [ [ (True, "timer") , (timer.state == Ringing, "isRinging") , (timer.state == Running, "isRunning") ] |> activatedClasses ] [ renderMaybeEdition model id Name (nameBlockReadOnly id timer) (nameBlockEdition id timer) , renderMaybeEdition model id Time (timeBlockReadOnly (id, timer)) (timeBlockEdition (id, timer)) , playPauseTimer (id, timer) , stopTimer (id, timer) , removeTimer (id, timer) ] nameBlockReadOnly : Id -> Timer -> Html nameBlockReadOnly id timer = div [ class "name" , onClick actions.address (Edit id Name) ] [ text (timerName id timer) ] nameBlockEdition : Id -> Timer -> Edition -> Html nameBlockEdition id timer edition = div [ [ (True, "name edition") , (isEmpty edition, "empty") ] |> activatedClasses , onClick actions.address NoOp ] [ if isEmpty edition then text (timerName id timer) else edition.chars |> renderNameEdition |> flip String.append "_" |> text ] timerName : Id -> Timer -> String timerName id = Maybe.withDefault ("Timer " ++ toString id) << .name timeBlockReadOnly : (Id, Timer) -> Html timeBlockReadOnly (id, timer) = div [ class "time" , onClick actions.address (Edit id Time) ] [ timeWithProgressBar (id, timer) ] timeBlockEdition : (Id, Timer) -> Edition -> Html timeBlockEdition (id, timer) edition = div [ [ (True, "time edition") , (isEmpty edition, "empty") ] |> activatedClasses , onClick actions.address NoOp ] [ if isEmpty edition then timeWithProgressBar (id, timer) else text (editionView edition.chars) ] editionView : List Char -> String editionView numbers = let (minutes, seconds) = toMinutesAndSeconds numbers in minutes ++ " : " ++ seconds timeView : Time -> String timeView time = let totalSeconds = ceiling (time / 1000) totalMinutes = totalSeconds // 60 restSeconds = totalSeconds `rem` 60 in (String.padLeft 2 '0' (toString totalMinutes)) ++ " : " ++ (String.padLeft 2 '0' (toString restSeconds)) timeWithProgressBar : (Id, Timer) -> Html timeWithProgressBar (id, timer) = div [] [ span [ class "progressBar" , let width = 1 - timer.currentTime / timer.initialTime |> (*) 1020 |> round |> toString |> flip String.append "px" in style [ ("width", width) ] , onClick actions.address (UpdateTimer id Stop) ] [] , span [ class "text" ] [ text (timeView timer.currentTime) ] ] playPauseTimer : (Id, Timer) -> Html playPauseTimer (id, timer) = button [ class <| "playPause" , onClick actions.address (UpdateTimer id ToggleRunning) ] [ let icon = if timer.state == Running then "fa-pause" else "fa-play" in i [ class <| "fa fa-fw " ++ icon ] [] ] stopTimer : (Id, Timer) -> Html stopTimer (id, timer) = button [ class <| "stop" , onClick actions.address (UpdateTimer id Stop) ] [ i [ class "fa fa-fw fa-stop" ] [] ] removeTimer : (Id, Timer) -> Html removeTimer (id, timer) = button [ class <| "remove" , onClick actions.address (RemoveTimer id) ] [ i [ class "fa fa-fw fa-remove" ] [] ] renderMaybeEdition : Model -> Id -> Kind -> Html -> (Edition -> Html) -> Html renderMaybeEdition model id kind readOnlyView editionView = let maybeEdition = filterMaybe (\edition -> edition.id == id) model.edition in case maybeEdition of Just edition -> if edition.kind == kind then editionView edition else readOnlyView Nothing -> readOnlyView