{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Imj.Graphics.Class.Draw(
Draw(..)
) where
import Imj.Prelude
import Control.Monad(foldM_)
import Control.Monad.IO.Class(MonadIO)
import Data.Text(Text, length)
import Imj.Geo.Discrete
import Imj.Graphics.Color.Types
import Imj.Graphics.Text.Alignment
import Imj.Graphics.Text.ColorString
class Draw e where
drawChar' :: (MonadIO m) => e -> Char -> Coords Pos -> LayeredColor -> m ()
drawChars' :: (MonadIO m) => e -> Int -> Char -> Coords Pos -> LayeredColor -> m ()
drawTxt' :: (MonadIO m) => e -> Text -> Coords Pos -> LayeredColor -> m ()
drawStr' :: (MonadIO m) => e -> String -> Coords Pos -> LayeredColor -> m ()
{-# INLINABLE drawColorStr' #-}
drawColorStr' :: (MonadIO m) => e -> ColorString -> Coords Pos -> m ()
drawColorStr' env (ColorString cs) pos =
foldM_
(\count (txt, color) -> do
let l = length txt
drawTxt' env txt (move count RIGHT pos) color
return $ count + l
) 0 cs
{-# INLINABLE drawAlignedTxt_' #-}
drawAlignedTxt_' :: (MonadIO m) => e -> Text -> LayeredColor -> Alignment -> m ()
drawAlignedTxt_' env txt colors a = do
let leftCorner = align' a (length txt)
drawTxt' env txt leftCorner colors
{-# INLINABLE drawAlignedTxt' #-}
drawAlignedTxt' :: (MonadIO m) => e -> Text -> LayeredColor -> Alignment -> m Alignment
drawAlignedTxt' env txt colors a =
drawAlignedTxt_' env txt colors a
>> return (toNextLine a)
{-# INLINABLE drawAlignedColorStr' #-}
drawAlignedColorStr' :: (MonadIO m) => e -> Alignment -> ColorString -> m Alignment
drawAlignedColorStr' env a cs = do
let leftCorner = align' a (countChars cs)
_ <- drawColorStr' env cs leftCorner
return $ toNextLine a