packages feed

pgdl-8.1: src/AskScene.hs

{-# LANGUAGE OverloadedStrings #-}

module AskScene where

import Graphics.Vty.Widgets.All
import Graphics.Vty.Input.Events

import Control.Monad

data AskScene = AskScene { sceneWidget :: Widget (Bordered Padded)
                         , playHand :: Handlers AskScene
                         , downHand :: Handlers AskScene
                         , quitHand :: Handlers AskScene
                         , remvHand :: Handlers AskScene
                         }

newAskScene :: IO (AskScene, Widget FocusGroup)
newAskScene = do
    playB <- newButton "No"
    downB <- newButton "Yes"
    quitB <- newButton "Quit"
    remvB <- newButton "Remov"
    buttonBox <- mkwIO playB <++> mkwIO downB <++> mkwIO quitB <++> mkwIO remvB
    b <- do
        bx <- plainText "    Download it again?" <--> return buttonBox
        setBoxSpacing bx 1
        withPadding (padAll 1) bx
    fg <- newFocusGroup
    mapM_ (addToFocusGroup fg . buttonWidget) [playB, downB, quitB, remvB]
    ui <- withBorderedLabel "File Exists!" =<< bordered b
    [phs, dhs, qhs, rhs] <- replicateM 4 newHandlers
    let sce = AskScene { sceneWidget = ui
                       , playHand = phs
                       , downHand = dhs
                       , quitHand = qhs
                       , remvHand = rhs
                       }
    onButtonPressed playB $ \_ -> 
        fireEvent sce (return . playHand) sce
    onButtonPressed downB $ \_ -> 
        fireEvent sce (return . downHand) sce
    onButtonPressed quitB $ \_ -> 
        fireEvent sce (return . quitHand) sce
    onButtonPressed remvB $ \_ ->
        fireEvent sce (return . remvHand) sce
    setFocusGroupNextKey fg KRight []
    setFocusGroupPrevKey fg KLeft []
    return (sce, fg)
    where mkwIO = return . buttonWidget

onScePlay :: AskScene -> Handler AskScene -> IO ()
onScePlay = addHandler (return . playHand)

onSceDown :: AskScene -> Handler AskScene -> IO ()
onSceDown = addHandler (return . downHand)

onSceQuit :: AskScene -> Handler AskScene -> IO ()
onSceQuit = addHandler (return . quitHand)

onSceRemv :: AskScene -> Handler AskScene -> IO()
onSceRemv = addHandler (return . remvHand)