packages feed

taskell-1.11.2: src/Taskell/UI/Draw/Main/StatusBar.hs

module Taskell.UI.Draw.Main.StatusBar
    ( renderStatusBar
    ) where

import ClassyPrelude

import Control.Lens ((^.))

import Brick

import Taskell.Data.Lists         (count)
import Taskell.Events.State.Types (current, lists, mode, path, searchTerm)

import Taskell.Events.State.Types.Mode (ModalType (..), Mode (..))
import Taskell.IO.Config.Layout        (columnPadding)
import Taskell.Types                   (ListIndex (ListIndex), TaskIndex (TaskIndex))
import Taskell.UI.Draw.Field           (Field)
import Taskell.UI.Draw.Types           (DSWidget, DrawState (..), ReaderDrawState)
import Taskell.UI.Theme

getPosition :: ReaderDrawState Text
getPosition = do
    (ListIndex col, TaskIndex pos) <- (^. current) <$> asks dsState
    len <- count col . (^. lists) <$> asks dsState
    let posNorm =
            if len > 0
                then pos + 1
                else 0
    pure $ tshow posNorm <> "/" <> tshow len

modeToText :: Maybe Field -> Mode -> ReaderDrawState Text
modeToText fld md = do
    debug <- asks dsDebug
    pure $
        if debug
            then tshow md
            else case md of
                     Normal ->
                         case fld of
                             Nothing -> "NORMAL"
                             Just _  -> "NORMAL + SEARCH"
                     Insert {} -> "INSERT"
                     Modal (Help _) -> "HELP"
                     Modal MoveTo -> "MOVE"
                     Modal Detail {} -> "DETAIL"
                     Modal Due {} -> "DUE"
                     Search {} -> "SEARCH"
                     _ -> ""

getMode :: ReaderDrawState Text
getMode = do
    state <- asks dsState
    modeToText (state ^. searchTerm) (state ^. mode)

renderStatusBar :: DSWidget
renderStatusBar = do
    topPath <- pack . (^. path) <$> asks dsState
    colPad <- columnPadding <$> asks dsLayout
    posTxt <- getPosition
    modeTxt <- getMode
    let titl = padLeftRight colPad $ txt topPath
    let pos = padRight (Pad colPad) $ txt posTxt
    let md = txt modeTxt
    let bar = padRight Max (titl <+> md) <+> pos
    pure . padTop (Pad 1) $ withAttr statusBarAttr bar