module Matterhorn.Events.UrlSelect where

import           Prelude ()
import           Matterhorn.Prelude

import           Brick.Widgets.List
import qualified Graphics.Vty as Vty

import           Matterhorn.Events.Keybindings
import           Matterhorn.State.UrlSelect
import           Matterhorn.State.SaveAttachmentWindow
import           Matterhorn.Types


onEventUrlSelect :: Vty.Event -> MH Bool
onEventUrlSelect :: Event -> MH Bool
onEventUrlSelect =
  (KeyConfig -> KeyHandlerMap)
-> (Event -> MH ()) -> Event -> MH Bool
handleKeyboardEvent KeyConfig -> KeyHandlerMap
urlSelectKeybindings ((Event -> MH ()) -> Event -> MH Bool)
-> (Event -> MH ()) -> Event -> MH Bool
forall a b. (a -> b) -> a -> b
$ \ Event
ev ->
    Lens' ChatState (GenericList Name Vector (Int, LinkChoice))
-> (Event
    -> GenericList Name Vector (Int, LinkChoice)
    -> EventM Name (GenericList Name Vector (Int, LinkChoice)))
-> Event
-> MH ()
forall b e.
Lens' ChatState b -> (e -> b -> EventM Name b) -> e -> MH ()
mhHandleEventLensed ((TeamState -> f TeamState) -> ChatState -> f ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> f TeamState) -> ChatState -> f ChatState)
-> ((GenericList Name Vector (Int, LinkChoice)
     -> f (GenericList Name Vector (Int, LinkChoice)))
    -> TeamState -> f TeamState)
-> (GenericList Name Vector (Int, LinkChoice)
    -> f (GenericList Name Vector (Int, LinkChoice)))
-> ChatState
-> f ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector (Int, LinkChoice)
 -> f (GenericList Name Vector (Int, LinkChoice)))
-> TeamState -> f TeamState
Lens' TeamState (GenericList Name Vector (Int, LinkChoice))
tsUrlList) Event
-> GenericList Name Vector (Int, LinkChoice)
-> EventM Name (GenericList Name Vector (Int, LinkChoice))
forall (t :: * -> *) n e.
(Foldable t, Splittable t, Ord n) =>
Event -> GenericList n t e -> EventM n (GenericList n t e)
handleListEvent Event
ev

urlSelectKeybindings :: KeyConfig -> KeyHandlerMap
urlSelectKeybindings :: KeyConfig -> KeyHandlerMap
urlSelectKeybindings = [KeyEventHandler] -> KeyConfig -> KeyHandlerMap
mkKeybindings [KeyEventHandler]
urlSelectKeyHandlers

urlSelectKeyHandlers :: [KeyEventHandler]
urlSelectKeyHandlers :: [KeyEventHandler]
urlSelectKeyHandlers =
    [ Text -> Event -> MH () -> KeyEventHandler
staticKb Text
"Open the selected URL, if any"
         (Key -> [Modifier] -> Event
Vty.EvKey Key
Vty.KEnter []) (MH () -> KeyEventHandler) -> MH () -> KeyEventHandler
forall a b. (a -> b) -> a -> b
$
             MH ()
openSelectedURL

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
SaveAttachmentEvent Text
"Save the selected attachment"
        MH ()
openSaveAttachmentWindow

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
CancelEvent Text
"Cancel URL selection" MH ()
stopUrlSelect

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
SelectUpEvent Text
"Move cursor up" (MH () -> KeyEventHandler) -> MH () -> KeyEventHandler
forall a b. (a -> b) -> a -> b
$
        Lens' ChatState (GenericList Name Vector (Int, LinkChoice))
-> (Event
    -> GenericList Name Vector (Int, LinkChoice)
    -> EventM Name (GenericList Name Vector (Int, LinkChoice)))
-> Event
-> MH ()
forall b e.
Lens' ChatState b -> (e -> b -> EventM Name b) -> e -> MH ()
mhHandleEventLensed ((TeamState -> f TeamState) -> ChatState -> f ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> f TeamState) -> ChatState -> f ChatState)
-> ((GenericList Name Vector (Int, LinkChoice)
     -> f (GenericList Name Vector (Int, LinkChoice)))
    -> TeamState -> f TeamState)
-> (GenericList Name Vector (Int, LinkChoice)
    -> f (GenericList Name Vector (Int, LinkChoice)))
-> ChatState
-> f ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector (Int, LinkChoice)
 -> f (GenericList Name Vector (Int, LinkChoice)))
-> TeamState -> f TeamState
Lens' TeamState (GenericList Name Vector (Int, LinkChoice))
tsUrlList) Event
-> GenericList Name Vector (Int, LinkChoice)
-> EventM Name (GenericList Name Vector (Int, LinkChoice))
forall (t :: * -> *) n e.
(Foldable t, Splittable t, Ord n) =>
Event -> GenericList n t e -> EventM n (GenericList n t e)
handleListEvent (Key -> [Modifier] -> Event
Vty.EvKey Key
Vty.KUp [])

    , KeyEvent -> Text -> MH () -> KeyEventHandler
mkKb KeyEvent
SelectDownEvent Text
"Move cursor down" (MH () -> KeyEventHandler) -> MH () -> KeyEventHandler
forall a b. (a -> b) -> a -> b
$
        Lens' ChatState (GenericList Name Vector (Int, LinkChoice))
-> (Event
    -> GenericList Name Vector (Int, LinkChoice)
    -> EventM Name (GenericList Name Vector (Int, LinkChoice)))
-> Event
-> MH ()
forall b e.
Lens' ChatState b -> (e -> b -> EventM Name b) -> e -> MH ()
mhHandleEventLensed ((TeamState -> f TeamState) -> ChatState -> f ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> f TeamState) -> ChatState -> f ChatState)
-> ((GenericList Name Vector (Int, LinkChoice)
     -> f (GenericList Name Vector (Int, LinkChoice)))
    -> TeamState -> f TeamState)
-> (GenericList Name Vector (Int, LinkChoice)
    -> f (GenericList Name Vector (Int, LinkChoice)))
-> ChatState
-> f ChatState
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(GenericList Name Vector (Int, LinkChoice)
 -> f (GenericList Name Vector (Int, LinkChoice)))
-> TeamState -> f TeamState
Lens' TeamState (GenericList Name Vector (Int, LinkChoice))
tsUrlList) Event
-> GenericList Name Vector (Int, LinkChoice)
-> EventM Name (GenericList Name Vector (Int, LinkChoice))
forall (t :: * -> *) n e.
(Foldable t, Splittable t, Ord n) =>
Event -> GenericList n t e -> EventM n (GenericList n t e)
handleListEvent (Key -> [Modifier] -> Event
Vty.EvKey Key
Vty.KDown [])

    , Text -> Event -> MH () -> KeyEventHandler
staticKb Text
"Cancel URL selection"
         (Key -> [Modifier] -> Event
Vty.EvKey (Char -> Key
Vty.KChar Char
'q') []) (MH () -> KeyEventHandler) -> MH () -> KeyEventHandler
forall a b. (a -> b) -> a -> b
$ MH ()
stopUrlSelect

    ]