module View.Timer ( timerView ) where import Html (..) import Html.Attributes (..) import Html.Events (..) import Time (Time) import Signal import Maybe import List import String import Model.Model (..) import Model.Timer (..) import Model.Edition.Edition (..) import Model.Edition.NameEdition (..) import Model.Edition.TimeEdition (..) import Model.TimerState (..) import Model.Id (..) import Update.Update (..) import Update.UpdateTimer (..) import View.ActivatedClasses (..) import Utils.Maybe (..) timerView : Model -> (Id, Timer) -> Html timerView model (id, timer) = div [ class "timer" ] [ renderMaybeEdition model id Name (nameBlockReadOnly id timer) (nameBlockEdition id timer) , renderMaybeEdition model id Time (timeBlockReadOnly id timer) (timeBlockEdition timer) , playPauseBlock (id, timer) , stopBlock (id, timer) , removeBlock (id, timer) ] nameBlockReadOnly : Id -> Timer -> Html nameBlockReadOnly id timer = button [ class "name block" , onClick (Signal.send updates (Edit id Name)) ] [ text (timerName id timer) ] nameBlockEdition : Id -> Timer -> Edition -> Html nameBlockEdition id timer edition = button [ [ (True, "name block edition") , (List.isEmpty edition.chars, "empty") ] |> activatedClasses , onClick (Signal.send updates ValidEdition) ] [ if List.isEmpty edition.chars then text (timerName id timer) else edition.chars |> renderNameEdition |> text ] timerName : Id -> Timer -> String timerName id = Maybe.withDefault ("Timer " ++ toString id) << .name timeBlockReadOnly : Id -> Timer -> Html timeBlockReadOnly id timer = button [ [ (True, "time block") , (timer.state == Ringing, "isRinging") , (timer.state == Running, "isRunning") ] |> activatedClasses , onClick <| if timer.state == Ringing then Signal.send updates (UpdateTimer id Stop) else Signal.send updates (Edit id Time) ] [ timeWithProgressBar timer ] timeBlockEdition : Timer -> Edition -> Html timeBlockEdition timer edition = let isEmptyEdition = List.isEmpty edition.chars in button [ [ (True, "time block edition") , (isEmptyEdition, "empty") ] |> activatedClasses , onClick (Signal.send updates ValidEdition) ] [ if isEmptyEdition then timeWithProgressBar 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 = truncate (time / 1000) totalMinutes = totalSeconds // 60 restSeconds = totalSeconds `rem` 60 in (String.padLeft 2 '0' (toString totalMinutes)) ++ " : " ++ (String.padLeft 2 '0' (toString restSeconds)) timeWithProgressBar : Timer -> Html timeWithProgressBar timer = div [] [ span [ class "progressBar" , let width = 1 - timer.currentTime / (initTime timer.initialTime) |> (*) 198 |> round |> toString |> flip String.append "px" in style [ ("width", width) ] ] [] , span [ class "text" ] [ text (timeView timer.currentTime) ] ] playPauseBlock : (Id, Timer) -> Html playPauseBlock (id, timer) = button [ class <| "playPause block" , onClick (Signal.send updates (UpdateTimer id ToggleRunning)) ] [ let icon = if timer.state == Running then "fa-pause" else "fa-play" in i [ class <| "fa fa-fw " ++ icon ] [] ] stopBlock : (Id, Timer) -> Html stopBlock (id, timer) = button [ class <| "stop block" , onClick (Signal.send updates (UpdateTimer id Stop)) ] [ i [ class "fa fa-fw fa-stop" ] [] ] removeBlock : (Id, Timer) -> Html removeBlock (id, timer) = button [ class <| "remove block" , onClick (Signal.send updates (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