{-# 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 <- Getting
  (TabbedWindow ChatState MH Name a)
  ChatState
  (TabbedWindow ChatState MH Name a)
-> MH (TabbedWindow ChatState MH Name a)
forall s (m :: * -> *) a. MonadState s m => Getting a s a -> m a
use Getting
  (TabbedWindow ChatState MH Name a)
  ChatState
  (TabbedWindow ChatState MH Name a)
Lens' ChatState (TabbedWindow ChatState MH Name a)
target
    [Event -> MH Bool] -> Event -> MH Bool
handleEventWith [ (KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH)
-> Event -> MH Bool
mhHandleKeyboardEvent (Lens' ChatState (TabbedWindow ChatState MH Name a)
-> TeamId -> KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH
forall a.
(Show a, Eq a) =>
Lens' ChatState (TabbedWindow ChatState MH Name a)
-> TeamId -> KeyConfig KeyEvent -> KeyDispatcher KeyEvent MH
tabbedWindowKeybindings (TabbedWindow ChatState MH Name a
 -> f (TabbedWindow ChatState MH Name a))
-> ChatState -> f ChatState
Lens' ChatState (TabbedWindow ChatState MH Name a)
target TeamId
tId)
                    , \Event
_ -> TabbedWindow ChatState MH Name a -> Event -> MH ()
forall a s n.
(Show a, Eq a) =>
TabbedWindow s MH n a -> Event -> MH ()
forwardEvent TabbedWindow ChatState MH Name a
w Event
e MH () -> MH Bool -> MH Bool
forall a b. MH a -> MH b -> MH b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Bool -> MH Bool
forall a. a -> MH a
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 = TabbedWindow s MH n a -> TabbedWindowEntry s MH n a
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
    TabbedWindowEntry s MH n a -> a -> Event -> MH ()
forall s (m :: * -> *) n a.
TabbedWindowEntry s m n a -> a -> Event -> m ()
tweHandleEvent TabbedWindowEntry s MH n a
cur (TabbedWindow s MH n a -> a
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 = KeyConfig KeyEvent
-> [KeyEventHandler KeyEvent MH] -> KeyDispatcher KeyEvent MH
forall k (m :: * -> *).
Ord k =>
KeyConfig k -> [KeyEventHandler k m] -> KeyDispatcher k m
unsafeKeyDispatcher KeyConfig KeyEvent
kc ([KeyEventHandler KeyEvent MH] -> KeyDispatcher KeyEvent MH)
-> [KeyEventHandler KeyEvent MH] -> KeyDispatcher KeyEvent MH
forall a b. (a -> b) -> a -> b
$ TeamId
-> Lens' ChatState (TabbedWindow ChatState MH Name a)
-> [KeyEventHandler KeyEvent MH]
forall a.
(Show a, Eq a) =>
TeamId
-> Lens' ChatState (TabbedWindow ChatState MH Name a)
-> [KeyEventHandler KeyEvent MH]
tabbedWindowKeyHandlers TeamId
tId (TabbedWindow ChatState MH Name a
 -> f (TabbedWindow ChatState MH Name a))
-> ChatState -> f ChatState
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)
-> [KeyEventHandler KeyEvent MH]
tabbedWindowKeyHandlers TeamId
tId Lens' ChatState (TabbedWindow ChatState MH Name a)
target =
    [ KeyEvent -> Text -> MH () -> KeyEventHandler KeyEvent MH
forall k (m :: * -> *). k -> Text -> m () -> KeyEventHandler k m
onEvent KeyEvent
CancelEvent Text
"Close window" (MH () -> KeyEventHandler KeyEvent MH)
-> MH () -> KeyEventHandler KeyEvent MH
forall a b. (a -> b) -> a -> b
$
        TeamId -> MH ()
popMode TeamId
tId

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

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