packages feed

hascard-0.6.0.2: src/UI/Settings.hs

module UI.Settings (State, drawUI, handleEvent, theMap) where

import UI.Attributes
import Brick
import Brick.Focus
import Brick.Forms
import Brick.Widgets.Border
import Brick.Widgets.Border.Style
import Brick.Widgets.Center
import Control.Monad (unless)
import Control.Monad.IO.Class
import Lens.Micro.Platform
import States
import StateManagement
import Settings
import qualified Brick.Types as T
import qualified Graphics.Vty as V
import UI.BrickHelpers (scrollableViewportPercent, handleClickScroll)

drawUI :: SS -> [Widget Name]
drawUI = (:[]) . ui

ui :: SS -> Widget Name
ui f =
  joinBorders $
  center $
  withBorderStyle unicodeRounded $
  border $
  hLimitPercent 60 $
  hLimit 40 $
  hCenter (withAttr titleAttr (str "Settings")) <=>
  hBorder <=> 
  scrollableViewportPercent 60 SettingsViewport 
  (padLeft (Pad 1) $ renderForm f)

scroll = vScrollBy (viewportScroll SettingsViewport)

handleEvent :: BrickEvent Name Event -> EventM Name GlobalState ()
handleEvent ev@(VtyEvent e) = do
  form <- use ss
  let halt' = popState <* liftIO (setSettings (formState form))
      focus = formFocus form
      (Just n) = focusGetCurrent focus
      down = if n /= MaxRecentsField then
               ss .= form { formFocus = focusNext focus }
             else scroll 1
      up = unless (n == HintsField) $
             ss .= form { formFocus = focusPrev focus }


  case e of
    V.EvKey V.KEsc []         -> halt'
    V.EvKey (V.KChar 'q') []  -> halt'
    V.EvKey V.KDown []        -> down
    V.EvKey (V.KChar 'j') []  -> down
    V.EvKey V.KUp []          -> up
    V.EvKey (V.KChar 'k') []  -> up
    V.EvKey (V.KChar '\t') [] -> return ()
    V.EvKey V.KBackTab []     -> return ()
    _ -> zoom ss $ handleFormEvent ev

handleEvent (T.MouseDown (SBClick el SettingsViewport) _ _ _) = handleClickScroll scroll el
handleEvent _ = return ()