module Brick.Widgets.Internal
( renderFinal
, cropToContext
, cropResultToContext
)
where
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative
#endif
import Lens.Micro ((^.), (&), (%~))
import Control.Monad.Trans.State.Lazy
import Control.Monad.Trans.Reader
import Data.Default
import qualified Graphics.Vty as V
import Brick.Types
import Brick.Types.Internal
import Brick.AttrMap
renderFinal :: AttrMap
-> [Widget n]
-> V.DisplayRegion
-> ([CursorLocation n] -> Maybe (CursorLocation n))
-> RenderState n
-> (RenderState n, V.Picture, Maybe (CursorLocation n), [Extent n])
renderFinal aMap layerRenders sz chooseCursor rs = (newRS, picWithBg, theCursor, concat layerExtents)
where
(layerResults, !newRS) = flip runState rs $ sequence $
(\p -> runReaderT p ctx) <$>
(render <$> cropToContext <$> layerRenders)
ctx = Context def (fst sz) (snd sz) def aMap
pic = V.picForLayers $ uncurry V.resize sz <$> (^.imageL) <$> layerResults
picWithBg = pic { V.picBackground = V.Background ' ' V.defAttr }
layerCursors = (^.cursorsL) <$> layerResults
layerExtents = reverse $ (^.extentsL) <$> layerResults
theCursor = chooseCursor $ concat layerCursors
cropToContext :: Widget n -> Widget n
cropToContext p =
Widget (hSize p) (vSize p) (render p >>= cropResultToContext)
cropResultToContext :: Result n -> RenderM n (Result n)
cropResultToContext result = do
c <- getContext
return $ result & imageL %~ (V.crop (max 0 $ c^.availWidthL) (max 0 $ c^.availHeightL))