{-# Language BangPatterns #-}
{-|
Module      : Client.View
Description : View selection module
Copyright   : (c) Eric Mertens, 2016
License     : ISC
Maintainer  : emertens@gmail.com

This module selects the correct view based on the current state.

-}
module Client.View
  ( viewLines
  ) where

import Client.Image.PackedImage (Image')
import Client.State
import Client.State.Focus
import Client.View.Cert (certViewLines)
import Client.View.ChannelList (channelListLines)
import Client.View.ChannelInfo (channelInfoImages)
import Client.View.Digraphs (digraphLines)
import Client.View.Help (helpImageLines)
import Client.View.IgnoreList (ignoreListLines)
import Client.View.KeyMap (keyMapLines)
import Client.View.MaskList (maskListImages)
import Client.View.Mentions (mentionsViewLines)
import Client.View.Messages (chatMessageImages)
import Client.View.Palette (paletteViewLines)
import Client.View.RtsStats (rtsStatsLines)
import Client.View.UrlSelection (urlSelectionView)
import Client.View.UserList (userInfoImages, userListImages)
import Client.View.Who (whoLines)
import Client.View.Windows (windowsImages)
import Control.Lens (view)

viewLines :: Focus -> Subfocus -> Int -> ClientState -> [Image']
viewLines :: Focus -> Subfocus -> Int -> ClientState -> [Image']
viewLines Focus
focus Subfocus
subfocus Int
w !ClientState
st =
  case (Maybe Text
network', Maybe Identifier
channel', Subfocus
subfocus) of
    (Maybe Text, Maybe Identifier, Subfocus)
_ | Just (String
"url",String
arg) <- ClientState -> Maybe (String, String)
clientActiveCommand ClientState
st ->
      Int -> Focus -> String -> ClientState -> [Image']
urlSelectionView Int
w Focus
focus String
arg ClientState
st
    (Just Text
network, Just Identifier
channel, Subfocus
FocusInfo) ->
      Text -> Identifier -> ClientState -> [Image']
channelInfoImages Text
network Identifier
channel ClientState
st
    (Just Text
network, Just Identifier
channel, Subfocus
FocusUsers)
      | forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Lens' ClientState Bool
clientDetailView ClientState
st -> Text -> Identifier -> ClientState -> [Image']
userInfoImages Text
network Identifier
channel ClientState
st
      | Bool
otherwise                -> Text -> Identifier -> Int -> ClientState -> [Image']
userListImages Text
network Identifier
channel Int
w ClientState
st
    (Just Text
network, Just Identifier
channel, FocusMasks Char
mode) ->
      Char -> Text -> Identifier -> Int -> ClientState -> [Image']
maskListImages Char
mode Text
network Identifier
channel Int
w ClientState
st
    (Maybe Text
_, Maybe Identifier
_, FocusWindows WindowsFilter
filt) -> WindowsFilter -> ClientState -> [Image']
windowsImages WindowsFilter
filt ClientState
st
    (Maybe Text
_, Maybe Identifier
_, Subfocus
FocusMentions)     -> Int -> ClientState -> [Image']
mentionsViewLines Int
w ClientState
st
    (Maybe Text
_, Maybe Identifier
_, Subfocus
FocusPalette)      -> Palette -> [Image']
paletteViewLines Palette
pal
    (Maybe Text
_, Maybe Identifier
_, Subfocus
FocusDigraphs)     -> Int -> ClientState -> [Image']
digraphLines Int
w ClientState
st
    (Maybe Text
_, Maybe Identifier
_, Subfocus
FocusKeyMap)       -> ClientState -> [Image']
keyMapLines ClientState
st
    (Maybe Text
_, Maybe Identifier
_, FocusHelp Maybe Text
mb)      -> ClientState -> Maybe Text -> Palette -> [Image']
helpImageLines ClientState
st Maybe Text
mb Palette
pal
    (Maybe Text
_, Maybe Identifier
_, Subfocus
FocusRtsStats)     -> Maybe Stats -> Palette -> [Image']
rtsStatsLines (forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Lens' ClientState (Maybe Stats)
clientRtsStats ClientState
st) Palette
pal
    (Maybe Text
_, Maybe Identifier
_, Subfocus
FocusIgnoreList)   -> HashSet Identifier -> Palette -> [Image']
ignoreListLines (forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Lens' ClientState (HashSet Identifier)
clientIgnores ClientState
st) Palette
pal
    (Maybe Text
_, Maybe Identifier
_, Subfocus
FocusCert)         -> ClientState -> [Image']
certViewLines ClientState
st
    (Just Text
network, Maybe Identifier
_, FocusChanList Maybe Int
min' Maybe Int
max') ->
      Text -> Int -> ClientState -> (Maybe Int, Maybe Int) -> [Image']
channelListLines Text
network Int
w ClientState
st (Maybe Int
min', Maybe Int
max')
    (Just Text
network, Maybe Identifier
_, Subfocus
FocusWho) ->
      Text -> Int -> ClientState -> [Image']
whoLines Text
network Int
w ClientState
st
    (Maybe Text, Maybe Identifier, Subfocus)
_ -> Focus -> Int -> ClientState -> [Image']
chatMessageImages Focus
focus Int
w ClientState
st
  where
    (Maybe Text
network', Maybe Identifier
channel') = case Focus
focus of
      Focus
Unfocused -> (forall a. Maybe a
Nothing, forall a. Maybe a
Nothing)
      NetworkFocus Text
network -> (forall a. a -> Maybe a
Just Text
network, forall a. Maybe a
Nothing)
      ChannelFocus Text
network Identifier
channel -> (forall a. a -> Maybe a
Just Text
network, forall a. a -> Maybe a
Just Identifier
channel)
    pal :: Palette
pal = ClientState -> Palette
clientPalette ClientState
st