{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module Matterhorn.Draw.ThemeListOverlay
  ( drawThemeListOverlay
  )
where

import           Prelude ()
import           Matterhorn.Prelude

import           Brick
import qualified Brick.Widgets.List as L
import           Brick.Widgets.Border ( hBorder )
import           Brick.Widgets.Center ( hCenter )

import           Matterhorn.Draw.ListOverlay ( drawListOverlay, OverlayPosition(..) )
import           Matterhorn.Themes
import           Matterhorn.Types
import           Matterhorn.Types.KeyEvents ( ppBinding )
import           Matterhorn.Events.Keybindings


drawThemeListOverlay :: ChatState -> Widget Name
drawThemeListOverlay :: ChatState -> Widget Name
drawThemeListOverlay ChatState
st =
    let overlay :: Widget Name
overlay = ListOverlayState InternalTheme ()
-> (() -> Widget Name)
-> (() -> Widget Name)
-> (() -> Widget Name)
-> (Bool -> InternalTheme -> Widget Name)
-> Maybe (Widget Name)
-> OverlayPosition
-> Int
-> Widget Name
forall a b.
ListOverlayState a b
-> (b -> Widget Name)
-> (b -> Widget Name)
-> (b -> Widget Name)
-> (Bool -> a -> Widget Name)
-> Maybe (Widget Name)
-> OverlayPosition
-> Int
-> Widget Name
drawListOverlay (ChatState
stChatState
-> Getting
     (ListOverlayState InternalTheme ())
     ChatState
     (ListOverlayState InternalTheme ())
-> ListOverlayState InternalTheme ()
forall s a. s -> Getting a s a -> a
^.(TeamState -> Const (ListOverlayState InternalTheme ()) TeamState)
-> ChatState -> Const (ListOverlayState InternalTheme ()) ChatState
Lens' ChatState TeamState
csCurrentTeam((TeamState -> Const (ListOverlayState InternalTheme ()) TeamState)
 -> ChatState
 -> Const (ListOverlayState InternalTheme ()) ChatState)
-> ((ListOverlayState InternalTheme ()
     -> Const
          (ListOverlayState InternalTheme ())
          (ListOverlayState InternalTheme ()))
    -> TeamState
    -> Const (ListOverlayState InternalTheme ()) TeamState)
-> Getting
     (ListOverlayState InternalTheme ())
     ChatState
     (ListOverlayState InternalTheme ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ListOverlayState InternalTheme ()
 -> Const
      (ListOverlayState InternalTheme ())
      (ListOverlayState InternalTheme ()))
-> TeamState -> Const (ListOverlayState InternalTheme ()) TeamState
Lens' TeamState (ListOverlayState InternalTheme ())
tsThemeListOverlay)
                                  (Widget Name -> () -> Widget Name
forall a b. a -> b -> a
const (Widget Name -> () -> Widget Name)
-> Widget Name -> () -> Widget Name
forall a b. (a -> b) -> a -> b
$ Text -> Widget Name
forall n. Text -> Widget n
txt Text
"Themes")
                                  (Widget Name -> () -> Widget Name
forall a b. a -> b -> a
const (Widget Name -> () -> Widget Name)
-> Widget Name -> () -> Widget Name
forall a b. (a -> b) -> a -> b
$ Text -> Widget Name
forall n. Text -> Widget n
txt Text
"No matching themes found.")
                                  (Widget Name -> () -> Widget Name
forall a b. a -> b -> a
const (Widget Name -> () -> Widget Name)
-> Widget Name -> () -> Widget Name
forall a b. (a -> b) -> a -> b
$ Text -> Widget Name
forall n. Text -> Widget n
txt Text
"Search built-in themes:")
                                  Bool -> InternalTheme -> Widget Name
renderInternalTheme
                                  (Widget Name -> Maybe (Widget Name)
forall a. a -> Maybe a
Just Widget Name
forall n. Widget n
footer)
                                  OverlayPosition
OverlayUpperRight
                                  Int
50
        footer :: Widget n
footer = Widget n
forall n. Widget n
hBorder Widget n -> Widget n -> Widget n
forall n. Widget n -> Widget n -> Widget n
<=>
                 (Widget n -> Widget n
forall n. Widget n -> Widget n
hCenter (Widget n -> Widget n) -> Widget n -> Widget n
forall a b. (a -> b) -> a -> b
$ [Widget n] -> Widget n
forall n. [Widget n] -> Widget n
hBox [ Widget n
forall n. Widget n
enter
                                 , Text -> Widget n
forall n. Text -> Widget n
txt (Text -> Widget n) -> Text -> Widget n
forall a b. (a -> b) -> a -> b
$ Text
":choose theme  "
                                 , Widget n
forall n. Widget n
close
                                 , Text -> Widget n
forall n. Text -> Widget n
txt Text
":close"
                                 ])
        enter :: Widget n
enter = Widget n -> Widget n
forall n. Widget n -> Widget n
emph (Widget n -> Widget n) -> Widget n -> Widget n
forall a b. (a -> b) -> a -> b
$ Text -> Widget n
forall n. Text -> Widget n
txt (Text -> Widget n) -> Text -> Widget n
forall a b. (a -> b) -> a -> b
$ Binding -> Text
ppBinding (KeyEvent -> Binding
getFirstDefaultBinding KeyEvent
ActivateListItemEvent)
        close :: Widget n
close = Widget n -> Widget n
forall n. Widget n -> Widget n
emph (Widget n -> Widget n) -> Widget n -> Widget n
forall a b. (a -> b) -> a -> b
$ Text -> Widget n
forall n. Text -> Widget n
txt (Text -> Widget n) -> Text -> Widget n
forall a b. (a -> b) -> a -> b
$ Binding -> Text
ppBinding (KeyEvent -> Binding
getFirstDefaultBinding KeyEvent
CancelEvent)
        emph :: Widget n -> Widget n
emph = AttrName -> Widget n -> Widget n
forall n. AttrName -> Widget n -> Widget n
withDefAttr AttrName
clientEmphAttr
    in Widget Name -> Widget Name
forall n. Widget n -> Widget n
joinBorders Widget Name
overlay

renderInternalTheme :: Bool -> InternalTheme -> Widget Name
renderInternalTheme :: Bool -> InternalTheme -> Widget Name
renderInternalTheme Bool
foc InternalTheme
it =
    (if Bool
foc then AttrName -> Widget Name -> Widget Name
forall n. AttrName -> Widget n -> Widget n
forceAttr AttrName
L.listSelectedFocusedAttr else Widget Name -> Widget Name
forall a. a -> a
id) (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
    (Padding -> Widget Name -> Widget Name
forall n. Padding -> Widget n -> Widget n
padRight Padding
Max (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
     AttrName -> Widget Name -> Widget Name
forall n. AttrName -> Widget n -> Widget n
withDefAttr AttrName
clientEmphAttr (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
     Text -> Widget Name
forall n. Text -> Widget n
txt (Text -> Widget Name) -> Text -> Widget Name
forall a b. (a -> b) -> a -> b
$ InternalTheme -> Text
internalThemeName InternalTheme
it) Widget Name -> Widget Name -> Widget Name
forall n. Widget n -> Widget n -> Widget n
<=>
    (Int -> Widget Name -> Widget Name
forall n. Int -> Widget n -> Widget n
vLimit Int
2 (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$
     (Padding -> Widget Name -> Widget Name
forall n. Padding -> Widget n -> Widget n
padLeft (Int -> Padding
Pad Int
2) (Widget Name -> Widget Name) -> Widget Name -> Widget Name
forall a b. (a -> b) -> a -> b
$ Text -> Widget Name
forall n. Text -> Widget n
txtWrap (Text -> Widget Name) -> Text -> Widget Name
forall a b. (a -> b) -> a -> b
$ InternalTheme -> Text
internalThemeDesc InternalTheme
it) Widget Name -> Widget Name -> Widget Name
forall n. Widget n -> Widget n -> Widget n
<=> Char -> Widget Name
forall n. Char -> Widget n
fill Char
' ')