module UI.Parameter (drawUI, theMap, handleEvent) 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 (when)
import Control.Monad.IO.Class
import Lens.Micro.Platform
import States
import StateManagement
import Runners
import qualified Graphics.Vty as V

drawUI :: PS -> [Widget Name]
drawUI :: PS -> [Widget Name]
drawUI = (forall a. a -> [a] -> [a]
:[]) forall b c a. (b -> c) -> (a -> b) -> a -> c
. PS -> Widget Name
ui

ui :: PS -> Widget Name
ui :: PS -> Widget Name
ui PS
s =
  forall n. Widget n -> Widget n
joinBorders forall a b. (a -> b) -> a -> b
$
  forall n. Widget n -> Widget n
center forall a b. (a -> b) -> a -> b
$
  forall n. BorderStyle -> Widget n -> Widget n
withBorderStyle BorderStyle
unicodeRounded forall a b. (a -> b) -> a -> b
$
  forall n. Widget n -> Widget n
border forall a b. (a -> b) -> a -> b
$
  forall n. Int -> Widget n -> Widget n
hLimitPercent Int
60 forall a b. (a -> b) -> a -> b
$
  forall n. Int -> Widget n -> Widget n
hLimit Int
40 forall a b. (a -> b) -> a -> b
$
  forall n. Widget n -> Widget n
hCenter (forall n. AttrName -> Widget n -> Widget n
withAttr AttrName
titleAttr (forall n. FilePath -> Widget n
str FilePath
"Select parameters")) forall n. Widget n -> Widget n -> Widget n
<=>
  forall n. Widget n
hBorder forall n. Widget n -> Widget n -> Widget n
<=>
  forall n. Int -> Widget n -> Widget n
padLeftRight Int
1
  (forall n s e. Eq n => Form s e n -> Widget n
renderForm (PS
s forall s a. s -> Getting a s a -> a
^. Lens' PS (Form Parameters Event Name)
psForm))

handleEvent :: BrickEvent Name Event -> EventM Name GlobalState ()
handleEvent :: BrickEvent Name Event -> EventM Name GlobalState Event
handleEvent ev :: BrickEvent Name Event
ev@(VtyEvent Event
e) = do
  PS
s <- forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Lens' GlobalState PS
ps
  let form :: Form Parameters Event Name
form = PS
s forall s a. s -> Getting a s a -> a
^. Lens' PS (Form Parameters Event Name)
psForm
      focus :: FocusRing Name
focus = forall s e n. Form s e n -> FocusRing n
formFocus Form Parameters Event Name
form
      (Just Name
n) = forall n. FocusRing n -> Maybe n
focusGetCurrent FocusRing Name
focus
      down :: EventM Name GlobalState Event
down = forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom Lens' GlobalState PS
ps forall a b. (a -> b) -> a -> b
$ case Name
n of
        Name
ParametersOkField -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
        Name
ChunkField1 -> Lens' PS (Form Parameters Event Name)
psForm forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Form Parameters Event Name
form { formFocus :: FocusRing Name
formFocus = forall n. FocusRing n -> FocusRing n
focusNext (forall n. FocusRing n -> FocusRing n
focusNext FocusRing Name
focus) }
        Name
_ -> Lens' PS (Form Parameters Event Name)
psForm forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Form Parameters Event Name
form { formFocus :: FocusRing Name
formFocus = forall n. FocusRing n -> FocusRing n
focusNext FocusRing Name
focus }
      up :: EventM Name GlobalState Event
up = forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom Lens' GlobalState PS
ps forall a b. (a -> b) -> a -> b
$ case Name
n of
        Name
ChunkField1 -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
        Name
ChunkField2 -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
        Name
SubsetField -> Lens' PS (Form Parameters Event Name)
psForm forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Form Parameters Event Name
form { formFocus :: FocusRing Name
formFocus = forall n. FocusRing n -> FocusRing n
focusPrev (forall n. FocusRing n -> FocusRing n
focusPrev FocusRing Name
focus) }
        Name
_           -> Lens' PS (Form Parameters Event Name)
psForm forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Form Parameters Event Name
form { formFocus :: FocusRing Name
formFocus = forall n. FocusRing n -> FocusRing n
focusPrev FocusRing Name
focus }
      right :: EventM Name GlobalState Event
right = forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom Lens' GlobalState PS
ps forall a b. (a -> b) -> a -> b
$ case Name
n of
        Name
ChunkField1 -> Lens' PS (Form Parameters Event Name)
psForm forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Form Parameters Event Name
form { formFocus :: FocusRing Name
formFocus = forall n. FocusRing n -> FocusRing n
focusNext FocusRing Name
focus }
        Name
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
      left :: EventM Name GlobalState Event
left = forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom Lens' GlobalState PS
ps forall a b. (a -> b) -> a -> b
$ case Name
n of
        Name
ChunkField2 -> Lens' PS (Form Parameters Event Name)
psForm forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Form Parameters Event Name
form { formFocus :: FocusRing Name
formFocus = forall n. FocusRing n -> FocusRing n
focusPrev FocusRing Name
focus }
        Name
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return ()

  case Event
e of
      V.EvKey Key
V.KEsc []         -> forall (m :: * -> *). MonadState GlobalState m => m Event
popState
      V.EvKey (V.KChar Char
'q') []  -> forall (m :: * -> *). MonadState GlobalState m => m Event
popState
      V.EvKey Key
V.KDown []        -> EventM Name GlobalState Event
down
      V.EvKey (V.KChar Char
'j') []  -> EventM Name GlobalState Event
down
      V.EvKey Key
V.KUp []          -> EventM Name GlobalState Event
up
      V.EvKey (V.KChar Char
'k') []  -> EventM Name GlobalState Event
up
      V.EvKey (V.KChar Char
'\t') [] -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
      V.EvKey Key
V.KBackTab []     -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
      V.EvKey (V.KChar Char
'h') []  -> EventM Name GlobalState Event
left
      V.EvKey (V.KChar Char
'l') []  -> EventM Name GlobalState Event
right
    
      Event
_ -> case (Event
e, Name
n) of
          (V.EvKey Key
V.KRight [], Name
ChunkField2) -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
          (V.EvKey Key
V.KLeft [],  Name
ChunkField1) -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
          (V.EvKey Key
V.KRight [], Name
SubsetField) -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
          (V.EvKey Key
V.KLeft [],  Name
SubsetField) -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
          (Event, Name)
_ -> do forall (m :: * -> *) (n :: * -> *) s t c.
Zoom m n s t =>
LensLike' (Zoomed m c) t s -> m c -> n c
zoom (Lens' GlobalState PS
psforall b c a. (b -> c) -> (a -> b) -> a -> c
.Lens' PS (Form Parameters Event Name)
psForm) forall a b. (a -> b) -> a -> b
$ forall n e s. Eq n => BrickEvent n e -> EventM n (Form s e n) Event
handleFormEvent BrickEvent Name Event
ev
                  Form Parameters Event Name
f <- forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use forall a b. (a -> b) -> a -> b
$ Lens' GlobalState PS
psforall b c a. (b -> c) -> (a -> b) -> a -> c
.Lens' PS (Form Parameters Event Name)
psForm
                  forall (f :: * -> *). Applicative f => Bool -> f Event -> f Event
when (forall s e n. Form s e n -> s
formState Form Parameters Event Name
f forall s a. s -> Getting a s a -> a
^. Lens' Parameters Bool
pOk) forall a b. (a -> b) -> a -> b
$ do
                    Lens' GlobalState Parameters
parameters forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= forall s e n. Form s e n -> s
formState Form Parameters Event Name
f
                    Lens' GlobalState Parameters
parametersforall b c a. (b -> c) -> (a -> b) -> a -> c
.Lens' Parameters Bool
pOk forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= Bool
False
                    Parameters
paramsWithoutOk <- forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Lens' GlobalState Parameters
parameters
                    Lens' GlobalState PS
psforall b c a. (b -> c) -> (a -> b) -> a -> c
.Lens' PS (Form Parameters Event Name)
psForm forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m Event
.= forall s e n. s -> Form s e n -> Form s e n
updateFormState Parameters
paramsWithoutOk Form Parameters Event Name
f
                    State
state <- forall (m :: * -> *).
(MonadState GlobalState m, MonadIO m) =>
FilePath -> [Card] -> m State
cardsWithOptionsStateM (PS
s forall s a. s -> Getting a s a -> a
^. Lens' PS FilePath
psFp) (PS
s forall s a. s -> Getting a s a -> a
^. Lens' PS [Card]
psCards)
                    forall (m :: * -> *). MonadState GlobalState m => State -> m Event
goToState State
state

handleEvent BrickEvent Name Event
_ = forall (m :: * -> *) a. Monad m => a -> m a
return ()