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

import           Prelude ()
import           Matterhorn.Prelude

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

import           Network.Mattermost.Types ( TeamId )

import           Matterhorn.Types


handleTabbedWindowEvent :: (Show a, Eq a)
                        => Lens' ChatState (TabbedWindow ChatState MH Name a)
                        -> TeamId
                        -> Vty.Event
                        -> MH Bool
handleTabbedWindowEvent :: forall a.
(Show a, Eq a) =>
Lens' ChatState (TabbedWindow ChatState MH Name a)
-> TeamId -> Event -> MH Bool
handleTabbedWindowEvent Lens' ChatState (TabbedWindow ChatState MH Name a)
target TeamId
tId Event
e = do
    TabbedWindow ChatState MH Name a
w <- forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Lens' ChatState (TabbedWindow ChatState MH Name a)
target
    [Event -> MH Bool] -> Event -> MH Bool
handleEventWith [ (KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH)
-> Event -> MH Bool
mhHandleKeyboardEvent (forall a.
(Show a, Eq a) =>
Lens' ChatState (TabbedWindow ChatState MH Name a)
-> TeamId -> KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH
tabbedWindowKeybindings Lens' ChatState (TabbedWindow ChatState MH Name a)
target TeamId
tId)
                    , \Event
_ -> forall a s n.
(Show a, Eq a) =>
TabbedWindow s MH n a -> Event -> MH ()
forwardEvent TabbedWindow ChatState MH Name a
w Event
e forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
                    ] Event
e

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

tabbedWindowKeybindings :: (Show a, Eq a)
                        => Lens' ChatState (TabbedWindow ChatState MH Name a)
                        -> TeamId
                        -> KeyConfig KeyEvent
                        -> KeyDispatcher KeyEvent MH
tabbedWindowKeybindings :: forall a.
(Show a, Eq a) =>
Lens' ChatState (TabbedWindow ChatState MH Name a)
-> TeamId -> KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH
tabbedWindowKeybindings Lens' ChatState (TabbedWindow ChatState MH Name a)
target TeamId
tId KeyConfig KeyEvent
kc = forall k (m :: * -> *).
Ord k =>
KeyConfig k -> [KeyEventHandler k m] -> KeyDispatcher k m
unsafeKeyDispatcher KeyConfig KeyEvent
kc forall a b. (a -> b) -> a -> b
$ forall a.
(Show a, Eq a) =>
TeamId
-> Lens' ChatState (TabbedWindow ChatState MH Name a)
-> [MHKeyEventHandler]
tabbedWindowKeyHandlers TeamId
tId Lens' ChatState (TabbedWindow ChatState MH Name a)
target

tabbedWindowKeyHandlers :: (Show a, Eq a)
                        => TeamId
                        -> Lens' ChatState (TabbedWindow ChatState MH Name a)
                        -> [MHKeyEventHandler]
tabbedWindowKeyHandlers :: forall a.
(Show a, Eq a) =>
TeamId
-> Lens' ChatState (TabbedWindow ChatState MH Name a)
-> [MHKeyEventHandler]
tabbedWindowKeyHandlers TeamId
tId Lens' ChatState (TabbedWindow ChatState MH Name a)
target =
    [ forall k (m :: * -> *). k -> Text -> m () -> KeyEventHandler k m
onEvent KeyEvent
CancelEvent Text
"Close window" forall a b. (a -> b) -> a -> b
$
        TeamId -> MH ()
popMode TeamId
tId

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

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