packages feed

matterhorn-50200.5.0: src/Events/TabbedWindow.hs

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

import           Prelude ()
import           Prelude.MH

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

import           Types
import           Types.KeyEvents
import           Events.Keybindings

handleTabbedWindowEvent :: (Show a, Eq a)
                        => Lens' ChatState (TabbedWindow a)
                        -> Vty.Event
                        -> MH ()
handleTabbedWindowEvent target e = do
    w <- use target
    handleKeyboardEvent (tabbedWindowKeybindings target) (forwardEvent w) e

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

tabbedWindowKeybindings :: (Show a, Eq a)
                        => Lens' ChatState (TabbedWindow a)
                        -> KeyConfig
                        -> [Keybinding]
tabbedWindowKeybindings target = mkKeybindings
    [ mkKb CancelEvent "Close window" $ do
        w <- use target
        setMode (twReturnMode w)

    , mkKb SelectNextTabEvent "Select next tab" $ do
        w' <- tabbedWindowNextTab =<< use target
        target .= w'

    , mkKb SelectPreviousTabEvent "Select previous tab" $ do
        w' <- tabbedWindowPreviousTab =<< use target
        target .= w'
    ]