packages feed

vty-ui-1.7: demos/CollectionDemo.hs

{-# OPTIONS_GHC -fno-warn-missing-signatures -fno-warn-unused-do-bind #-}
{-# LANGUAGE OverloadedStrings #-}
module Main where

import System.Exit
import qualified Data.Text as T
import Graphics.Vty hiding (Button)
import Graphics.Vty.Widgets.All

items :: [T.Text]
items = [ "Arrow keys change list items"
        , "Esc quits"
        , "Ctrl-n goes to the next interface"
        ]

mkFirstUI = do
  u <- plainText $ T.unlines items
  pe <- padded u (padLeftRight 2)
  (d, dFg) <- newDialog pe "This is a dialog"
  setNormalAttribute d (white `on` blue)
  c <- centered =<< withPadding (padLeftRight 10) (dialogWidget d)
  d `onDialogAccept` const shutdownUi
  d `onDialogCancel` const shutdownUi
  return (c, dFg)

mkSecondUI = do
  fg <- newFocusGroup
  lst <- newTextList (green `on` blue) items 1
  addToFocusGroup fg lst
  c <- centered =<< vLimit 10 =<< hLimit 50 =<< bordered lst
  return (c, fg)

mkThirdUI = do
  fg <- newFocusGroup
  cb1 <- newCheckbox $ items !! 0
  cb2 <- newCheckbox $ items !! 1
  cb3 <- newCheckbox $ items !! 2
  addToFocusGroup fg cb1
  addToFocusGroup fg cb2
  addToFocusGroup fg cb3

  c <- centered =<< vLimit 10 =<< hLimit 50 =<< bordered =<< (
         (return cb1) <--> (return cb2) <--> (return cb3)
       )

  return (c, fg)

main :: IO ()
main = do
  coll <- newCollection

  (ui1, fg1) <- mkFirstUI
  switchToFirst <- addToCollection coll ui1 fg1

  (ui2, fg2) <- mkSecondUI
  switchToSecond <- addToCollection coll ui2 fg2

  (ui3, fg3) <- mkThirdUI
  switchToThird <- addToCollection coll ui3 fg3

  let keyHandler nextUI = \_ k mods ->
        case (k, mods) of
            (KASCII 'n', [MCtrl]) -> nextUI >> return True
            (KEsc, []) -> exitSuccess
            _ -> return False

  fg1 `onKeyPressed` (keyHandler switchToSecond)
  fg2 `onKeyPressed` (keyHandler switchToThird)
  fg3 `onKeyPressed` (keyHandler switchToFirst)

  runUi coll $ defaultContext { focusAttr = black `on` yellow }