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 = (Widget Name -> [Widget Name] -> [Widget Name] forall a. a -> [a] -> [a] :[]) (Widget Name -> [Widget Name]) -> (PS -> Widget Name) -> PS -> [Widget Name] 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 = Widget Name -> Widget Name forall n. Widget n -> Widget n joinBorders (Widget Name -> Widget Name) -> Widget Name -> Widget Name forall a b. (a -> b) -> a -> b $ Widget Name -> Widget Name forall n. Widget n -> Widget n center (Widget Name -> Widget Name) -> Widget Name -> Widget Name forall a b. (a -> b) -> a -> b $ BorderStyle -> Widget Name -> Widget Name forall n. BorderStyle -> Widget n -> Widget n withBorderStyle BorderStyle unicodeRounded (Widget Name -> Widget Name) -> Widget Name -> Widget Name forall a b. (a -> b) -> a -> b $ Widget Name -> Widget Name forall n. Widget n -> Widget n border (Widget Name -> Widget Name) -> Widget Name -> Widget Name forall a b. (a -> b) -> a -> b $ Int -> Widget Name -> Widget Name forall n. Int -> Widget n -> Widget n hLimitPercent Int 60 (Widget Name -> Widget Name) -> Widget Name -> Widget Name forall a b. (a -> b) -> a -> b $ Int -> Widget Name -> Widget Name forall n. Int -> Widget n -> Widget n hLimit Int 40 (Widget Name -> Widget Name) -> Widget Name -> Widget Name forall a b. (a -> b) -> a -> b $ Widget Name -> Widget Name forall n. Widget n -> Widget n hCenter (AttrName -> Widget Name -> Widget Name forall n. AttrName -> Widget n -> Widget n withAttr AttrName titleAttr (FilePath -> Widget Name forall n. FilePath -> Widget n str FilePath "Select parameters")) Widget Name -> Widget Name -> Widget Name forall n. Widget n -> Widget n -> Widget n <=> Widget Name forall n. Widget n hBorder Widget Name -> Widget Name -> Widget Name forall n. Widget n -> Widget n -> Widget n <=> Int -> Widget Name -> Widget Name forall n. Int -> Widget n -> Widget n padLeftRight Int 1 (Form Parameters Event Name -> Widget Name forall n s e. Eq n => Form s e n -> Widget n renderForm (PS s PS -> Getting (Form Parameters Event Name) PS (Form Parameters Event Name) -> Form Parameters Event Name forall s a. s -> Getting a s a -> a ^. Getting (Form Parameters Event Name) PS (Form Parameters Event Name) 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 <- Getting PS GlobalState PS -> EventM Name GlobalState PS forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a use Getting PS GlobalState PS Lens' GlobalState PS ps let form :: Form Parameters Event Name form = PS s PS -> Getting (Form Parameters Event Name) PS (Form Parameters Event Name) -> Form Parameters Event Name forall s a. s -> Getting a s a -> a ^. Getting (Form Parameters Event Name) PS (Form Parameters Event Name) Lens' PS (Form Parameters Event Name) psForm focus :: FocusRing Name focus = Form Parameters Event Name -> FocusRing Name forall s e n. Form s e n -> FocusRing n formFocus Form Parameters Event Name form (Just Name n) = FocusRing Name -> Maybe Name forall n. FocusRing n -> Maybe n focusGetCurrent FocusRing Name focus down :: EventM Name GlobalState Event down = LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS -> EventM Name PS Event -> EventM Name GlobalState Event forall c. LensLike' (Zoomed (EventM Name PS) c) GlobalState PS -> EventM Name PS c -> EventM Name GlobalState c forall (m :: * -> *) (n :: * -> *) s t c. Zoom m n s t => LensLike' (Zoomed m c) t s -> m c -> n c zoom LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS Lens' GlobalState PS ps (EventM Name PS Event -> EventM Name GlobalState Event) -> EventM Name PS Event -> EventM Name GlobalState Event forall a b. (a -> b) -> a -> b $ case Name n of Name ParametersOkField -> Event -> EventM Name PS Event forall a. a -> EventM Name PS a forall (m :: * -> *) a. Monad m => a -> m a return () Name ChunkField1 -> (Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> PS -> Identity PS Lens' PS (Form Parameters Event Name) psForm ((Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> PS -> Identity PS) -> Form Parameters Event Name -> EventM Name PS Event forall s (m :: * -> *) a b. MonadState s m => ASetter s s a b -> b -> m Event .= Form Parameters Event Name form { formFocus = focusNext (focusNext focus) } Name _ -> (Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> PS -> Identity PS Lens' PS (Form Parameters Event Name) psForm ((Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> PS -> Identity PS) -> Form Parameters Event Name -> EventM Name PS Event forall s (m :: * -> *) a b. MonadState s m => ASetter s s a b -> b -> m Event .= Form Parameters Event Name form { formFocus = focusNext focus } up :: EventM Name GlobalState Event up = LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS -> EventM Name PS Event -> EventM Name GlobalState Event forall c. LensLike' (Zoomed (EventM Name PS) c) GlobalState PS -> EventM Name PS c -> EventM Name GlobalState c forall (m :: * -> *) (n :: * -> *) s t c. Zoom m n s t => LensLike' (Zoomed m c) t s -> m c -> n c zoom LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS Lens' GlobalState PS ps (EventM Name PS Event -> EventM Name GlobalState Event) -> EventM Name PS Event -> EventM Name GlobalState Event forall a b. (a -> b) -> a -> b $ case Name n of Name ChunkField1 -> Event -> EventM Name PS Event forall a. a -> EventM Name PS a forall (m :: * -> *) a. Monad m => a -> m a return () Name ChunkField2 -> Event -> EventM Name PS Event forall a. a -> EventM Name PS a forall (m :: * -> *) a. Monad m => a -> m a return () Name SubsetField -> (Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> PS -> Identity PS Lens' PS (Form Parameters Event Name) psForm ((Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> PS -> Identity PS) -> Form Parameters Event Name -> EventM Name PS Event forall s (m :: * -> *) a b. MonadState s m => ASetter s s a b -> b -> m Event .= Form Parameters Event Name form { formFocus = focusPrev (focusPrev focus) } Name _ -> (Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> PS -> Identity PS Lens' PS (Form Parameters Event Name) psForm ((Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> PS -> Identity PS) -> Form Parameters Event Name -> EventM Name PS Event forall s (m :: * -> *) a b. MonadState s m => ASetter s s a b -> b -> m Event .= Form Parameters Event Name form { formFocus = focusPrev focus } right :: EventM Name GlobalState Event right = LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS -> EventM Name PS Event -> EventM Name GlobalState Event forall c. LensLike' (Zoomed (EventM Name PS) c) GlobalState PS -> EventM Name PS c -> EventM Name GlobalState c forall (m :: * -> *) (n :: * -> *) s t c. Zoom m n s t => LensLike' (Zoomed m c) t s -> m c -> n c zoom LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS Lens' GlobalState PS ps (EventM Name PS Event -> EventM Name GlobalState Event) -> EventM Name PS Event -> EventM Name GlobalState Event forall a b. (a -> b) -> a -> b $ case Name n of Name ChunkField1 -> (Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> PS -> Identity PS Lens' PS (Form Parameters Event Name) psForm ((Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> PS -> Identity PS) -> Form Parameters Event Name -> EventM Name PS Event forall s (m :: * -> *) a b. MonadState s m => ASetter s s a b -> b -> m Event .= Form Parameters Event Name form { formFocus = focusNext focus } Name _ -> Event -> EventM Name PS Event forall a. a -> EventM Name PS a forall (m :: * -> *) a. Monad m => a -> m a return () left :: EventM Name GlobalState Event left = LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS -> EventM Name PS Event -> EventM Name GlobalState Event forall c. LensLike' (Zoomed (EventM Name PS) c) GlobalState PS -> EventM Name PS c -> EventM Name GlobalState c forall (m :: * -> *) (n :: * -> *) s t c. Zoom m n s t => LensLike' (Zoomed m c) t s -> m c -> n c zoom LensLike' (Zoomed (EventM Name PS) Event) GlobalState PS Lens' GlobalState PS ps (EventM Name PS Event -> EventM Name GlobalState Event) -> EventM Name PS Event -> EventM Name GlobalState Event forall a b. (a -> b) -> a -> b $ case Name n of Name ChunkField2 -> (Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> PS -> Identity PS Lens' PS (Form Parameters Event Name) psForm ((Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> PS -> Identity PS) -> Form Parameters Event Name -> EventM Name PS Event forall s (m :: * -> *) a b. MonadState s m => ASetter s s a b -> b -> m Event .= Form Parameters Event Name form { formFocus = focusPrev focus } Name _ -> Event -> EventM Name PS Event forall a. a -> EventM Name PS a forall (m :: * -> *) a. Monad m => a -> m a return () case Event e of V.EvKey Key V.KEsc [] -> EventM Name GlobalState Event forall (m :: * -> *). MonadState GlobalState m => m Event popState V.EvKey (V.KChar Char 'q') [] -> EventM Name GlobalState Event 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') [] -> Event -> EventM Name GlobalState Event forall a. a -> EventM Name GlobalState a forall (m :: * -> *) a. Monad m => a -> m a return () V.EvKey Key V.KBackTab [] -> Event -> EventM Name GlobalState Event forall a. a -> EventM Name GlobalState a 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) -> Event -> EventM Name GlobalState Event forall a. a -> EventM Name GlobalState a forall (m :: * -> *) a. Monad m => a -> m a return () (V.EvKey Key V.KLeft [], Name ChunkField1) -> Event -> EventM Name GlobalState Event forall a. a -> EventM Name GlobalState a forall (m :: * -> *) a. Monad m => a -> m a return () (V.EvKey Key V.KRight [], Name SubsetField) -> Event -> EventM Name GlobalState Event forall a. a -> EventM Name GlobalState a forall (m :: * -> *) a. Monad m => a -> m a return () (V.EvKey Key V.KLeft [], Name SubsetField) -> Event -> EventM Name GlobalState Event forall a. a -> EventM Name GlobalState a forall (m :: * -> *) a. Monad m => a -> m a return () (Event, Name) _ -> do LensLike' (Zoomed (EventM Name (Form Parameters Event Name)) Event) GlobalState (Form Parameters Event Name) -> EventM Name (Form Parameters Event Name) Event -> EventM Name GlobalState Event forall c. LensLike' (Zoomed (EventM Name (Form Parameters Event Name)) c) GlobalState (Form Parameters Event Name) -> EventM Name (Form Parameters Event Name) c -> EventM Name GlobalState c forall (m :: * -> *) (n :: * -> *) s t c. Zoom m n s t => LensLike' (Zoomed m c) t s -> m c -> n c zoom ((PS -> Focusing (StateT (EventState Name) IO) Event PS) -> GlobalState -> Focusing (StateT (EventState Name) IO) Event GlobalState Lens' GlobalState PS ps((PS -> Focusing (StateT (EventState Name) IO) Event PS) -> GlobalState -> Focusing (StateT (EventState Name) IO) Event GlobalState) -> ((Form Parameters Event Name -> Focusing (StateT (EventState Name) IO) Event (Form Parameters Event Name)) -> PS -> Focusing (StateT (EventState Name) IO) Event PS) -> (Form Parameters Event Name -> Focusing (StateT (EventState Name) IO) Event (Form Parameters Event Name)) -> GlobalState -> Focusing (StateT (EventState Name) IO) Event GlobalState forall b c a. (b -> c) -> (a -> b) -> a -> c .(Form Parameters Event Name -> Focusing (StateT (EventState Name) IO) Event (Form Parameters Event Name)) -> PS -> Focusing (StateT (EventState Name) IO) Event PS Lens' PS (Form Parameters Event Name) psForm) (EventM Name (Form Parameters Event Name) Event -> EventM Name GlobalState Event) -> EventM Name (Form Parameters Event Name) Event -> EventM Name GlobalState Event forall a b. (a -> b) -> a -> b $ BrickEvent Name Event -> EventM Name (Form Parameters Event Name) Event 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 <- Getting (Form Parameters Event Name) GlobalState (Form Parameters Event Name) -> EventM Name GlobalState (Form Parameters Event Name) forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a use (Getting (Form Parameters Event Name) GlobalState (Form Parameters Event Name) -> EventM Name GlobalState (Form Parameters Event Name)) -> Getting (Form Parameters Event Name) GlobalState (Form Parameters Event Name) -> EventM Name GlobalState (Form Parameters Event Name) forall a b. (a -> b) -> a -> b $ (PS -> Const (Form Parameters Event Name) PS) -> GlobalState -> Const (Form Parameters Event Name) GlobalState Lens' GlobalState PS ps((PS -> Const (Form Parameters Event Name) PS) -> GlobalState -> Const (Form Parameters Event Name) GlobalState) -> Getting (Form Parameters Event Name) PS (Form Parameters Event Name) -> Getting (Form Parameters Event Name) GlobalState (Form Parameters Event Name) forall b c a. (b -> c) -> (a -> b) -> a -> c .Getting (Form Parameters Event Name) PS (Form Parameters Event Name) Lens' PS (Form Parameters Event Name) psForm Bool -> EventM Name GlobalState Event -> EventM Name GlobalState Event forall (f :: * -> *). Applicative f => Bool -> f Event -> f Event when (Form Parameters Event Name -> Parameters forall s e n. Form s e n -> s formState Form Parameters Event Name f Parameters -> Getting Bool Parameters Bool -> Bool forall s a. s -> Getting a s a -> a ^. Getting Bool Parameters Bool Lens' Parameters Bool pOk) (EventM Name GlobalState Event -> EventM Name GlobalState Event) -> EventM Name GlobalState Event -> EventM Name GlobalState Event forall a b. (a -> b) -> a -> b $ do (Parameters -> Identity Parameters) -> GlobalState -> Identity GlobalState Lens' GlobalState Parameters parameters ((Parameters -> Identity Parameters) -> GlobalState -> Identity GlobalState) -> Parameters -> EventM Name GlobalState Event forall s (m :: * -> *) a b. MonadState s m => ASetter s s a b -> b -> m Event .= Form Parameters Event Name -> Parameters forall s e n. Form s e n -> s formState Form Parameters Event Name f (Parameters -> Identity Parameters) -> GlobalState -> Identity GlobalState Lens' GlobalState Parameters parameters((Parameters -> Identity Parameters) -> GlobalState -> Identity GlobalState) -> ((Bool -> Identity Bool) -> Parameters -> Identity Parameters) -> (Bool -> Identity Bool) -> GlobalState -> Identity GlobalState forall b c a. (b -> c) -> (a -> b) -> a -> c .(Bool -> Identity Bool) -> Parameters -> Identity Parameters Lens' Parameters Bool pOk ((Bool -> Identity Bool) -> GlobalState -> Identity GlobalState) -> Bool -> EventM Name GlobalState Event forall s (m :: * -> *) a b. MonadState s m => ASetter s s a b -> b -> m Event .= Bool False Parameters paramsWithoutOk <- Getting Parameters GlobalState Parameters -> EventM Name GlobalState Parameters forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a use Getting Parameters GlobalState Parameters Lens' GlobalState Parameters parameters (PS -> Identity PS) -> GlobalState -> Identity GlobalState Lens' GlobalState PS ps((PS -> Identity PS) -> GlobalState -> Identity GlobalState) -> ((Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> PS -> Identity PS) -> (Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> GlobalState -> Identity GlobalState forall b c a. (b -> c) -> (a -> b) -> a -> c .(Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> PS -> Identity PS Lens' PS (Form Parameters Event Name) psForm ((Form Parameters Event Name -> Identity (Form Parameters Event Name)) -> GlobalState -> Identity GlobalState) -> Form Parameters Event Name -> EventM Name GlobalState Event forall s (m :: * -> *) a b. MonadState s m => ASetter s s a b -> b -> m Event .= Parameters -> Form Parameters Event Name -> Form Parameters Event Name forall s e n. s -> Form s e n -> Form s e n updateFormState Parameters paramsWithoutOk Form Parameters Event Name f State state <- FilePath -> [Card] -> EventM Name GlobalState State forall (m :: * -> *). (MonadState GlobalState m, MonadIO m) => FilePath -> [Card] -> m State cardsWithOptionsStateM (PS s PS -> Getting FilePath PS FilePath -> FilePath forall s a. s -> Getting a s a -> a ^. Getting FilePath PS FilePath Lens' PS FilePath psFp) (PS s PS -> Getting [Card] PS [Card] -> [Card] forall s a. s -> Getting a s a -> a ^. Getting [Card] PS [Card] Lens' PS [Card] psCards) State -> EventM Name GlobalState Event forall (m :: * -> *). MonadState GlobalState m => State -> m Event goToState State state handleEvent BrickEvent Name Event _ = Event -> EventM Name GlobalState Event forall a. a -> EventM Name GlobalState a forall (m :: * -> *) a. Monad m => a -> m a return ()