{-# LANGUAGE RankNTypes #-}
module Matterhorn.Events.TabbedWindow
  ( handleTabbedWindowEvent
  , tabbedWindowKeybindings
  , tabbedWindowKeyHandlers
  )
where

import           Prelude ()
import           Matterhorn.Prelude

import qualified Graphics.Vty as Vty
import           Lens.Micro.Platform ( Lens', (.=) )

import           Matterhorn.Types
import           Matterhorn.Types.KeyEvents
import           Matterhorn.Events.Keybindings

handleTabbedWindowEvent :: (Show a, Eq a)
                        => Lens' ChatState (TabbedWindow a)
                        -> Vty.Event
                        -> MH Bool
handleTabbedWindowEvent :: Lens' ChatState (TabbedWindow a) -> Event -> MH Bool
handleTabbedWindowEvent Lens' ChatState (TabbedWindow a)
target Event
e = do
    TabbedWindow a
w <- Getting (TabbedWindow a) ChatState (TabbedWindow a)
-> MH (TabbedWindow a)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (TabbedWindow a) ChatState (TabbedWindow a)
Lens' ChatState (TabbedWindow a)
target
    (KeyConfig -> KeyHandlerMap)
-> (Event -> MH ()) -> Event -> MH Bool
handleKeyboardEvent (Lens' ChatState (TabbedWindow a) -> KeyConfig -> KeyHandlerMap
forall a.
(Show a, Eq a) =>
Lens' ChatState (TabbedWindow a) -> KeyConfig -> KeyHandlerMap
tabbedWindowKeybindings Lens' ChatState (TabbedWindow a)
target) (TabbedWindow a -> Event -> MH ()
forall a. (Show a, Eq a) => TabbedWindow a -> Event -> MH ()
forwardEvent TabbedWindow a
w) Event
e

forwardEvent :: (Show a, Eq a)
             => TabbedWindow a
             -> Vty.Event
             -> MH ()
forwardEvent :: TabbedWindow a -> Event -> MH ()
forwardEvent TabbedWindow a
w Event
e = do
    let cur :: TabbedWindowEntry a
cur = TabbedWindow a -> TabbedWindowEntry a
forall a. (Show a, Eq a) => TabbedWindow a -> TabbedWindowEntry a
getCurrentTabbedWindowEntry TabbedWindow a
w
    TabbedWindowEntry a -> a -> Event -> MH ()
forall a. TabbedWindowEntry a -> a -> Event -> MH ()
tweHandleEvent TabbedWindowEntry a
cur (TabbedWindow a -> a
forall a. TabbedWindow a -> a
twValue TabbedWindow a
w) Event
e

tabbedWindowKeybindings :: (Show a, Eq a)
                        => Lens' ChatState (TabbedWindow a)
                        -> KeyConfig
                        -> KeyHandlerMap
tabbedWindowKeybindings :: Lens' ChatState (TabbedWindow a) -> KeyConfig -> KeyHandlerMap
tabbedWindowKeybindings Lens' ChatState (TabbedWindow a)
target = [KeyEventHandler] -> KeyConfig -> KeyHandlerMap
mkKeybindings ([KeyEventHandler] -> KeyConfig -> KeyHandlerMap)
-> [KeyEventHandler] -> KeyConfig -> KeyHandlerMap
forall a b. (a -> b) -> a -> b
$ Lens' ChatState (TabbedWindow a) -> [KeyEventHandler]
forall a.
(Show a, Eq a) =>
Lens' ChatState (TabbedWindow a) -> [KeyEventHandler]
tabbedWindowKeyHandlers Lens' ChatState (TabbedWindow a)
target

tabbedWindowKeyHandlers :: (Show a, Eq a)
                        => Lens' ChatState (TabbedWindow a)
                        -> [KeyEventHandler]
tabbedWindowKeyHandlers :: Lens' ChatState (TabbedWindow a) -> [KeyEventHandler]
tabbedWindowKeyHandlers Lens' ChatState (TabbedWindow a)
target =
    [ KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
CancelEvent Text
"Close window" (MH () -> KeyEventHandler) -> MH () -> KeyEventHandler
forall a b. (a -> b) -> a -> b
$ do
        TabbedWindow a
w <- Getting (TabbedWindow a) ChatState (TabbedWindow a)
-> MH (TabbedWindow a)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (TabbedWindow a) ChatState (TabbedWindow a)
Lens' ChatState (TabbedWindow a)
target
        Mode -> MH ()
setMode (TabbedWindow a -> Mode
forall a. TabbedWindow a -> Mode
twReturnMode TabbedWindow a
w)

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
SelectNextTabEvent Text
"Select next tab" (MH () -> KeyEventHandler) -> MH () -> KeyEventHandler
forall a b. (a -> b) -> a -> b
$ do
        TabbedWindow a
w' <- TabbedWindow a -> MH (TabbedWindow a)
forall a. (Show a, Eq a) => TabbedWindow a -> MH (TabbedWindow a)
tabbedWindowNextTab (TabbedWindow a -> MH (TabbedWindow a))
-> MH (TabbedWindow a) -> MH (TabbedWindow a)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Getting (TabbedWindow a) ChatState (TabbedWindow a)
-> MH (TabbedWindow a)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (TabbedWindow a) ChatState (TabbedWindow a)
Lens' ChatState (TabbedWindow a)
target
        (TabbedWindow a -> Identity (TabbedWindow a))
-> ChatState -> Identity ChatState
Lens' ChatState (TabbedWindow a)
target ((TabbedWindow a -> Identity (TabbedWindow a))
 -> ChatState -> Identity ChatState)
-> TabbedWindow a -> MH ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= TabbedWindow a
w'

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
SelectPreviousTabEvent Text
"Select previous tab" (MH () -> KeyEventHandler) -> MH () -> KeyEventHandler
forall a b. (a -> b) -> a -> b
$ do
        TabbedWindow a
w' <- TabbedWindow a -> MH (TabbedWindow a)
forall a. (Show a, Eq a) => TabbedWindow a -> MH (TabbedWindow a)
tabbedWindowPreviousTab (TabbedWindow a -> MH (TabbedWindow a))
-> MH (TabbedWindow a) -> MH (TabbedWindow a)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Getting (TabbedWindow a) ChatState (TabbedWindow a)
-> MH (TabbedWindow a)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting (TabbedWindow a) ChatState (TabbedWindow a)
Lens' ChatState (TabbedWindow a)
target
        (TabbedWindow a -> Identity (TabbedWindow a))
-> ChatState -> Identity ChatState
Lens' ChatState (TabbedWindow a)
target ((TabbedWindow a -> Identity (TabbedWindow a))
 -> ChatState -> Identity ChatState)
-> TabbedWindow a -> MH ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> b -> m ()
.= TabbedWindow a
w'
    ]