-- | The Picture data structure is representative of the final terminal view.
--
-- This module re-exports most of the Graphics.Vty.Image and Graphics.Vty.Attributes modules.
--
-- Copyright 2009-2010 Corey O'Connor
module Graphics.Vty.Picture ( module Graphics.Vty.Picture
                            , Image
                            , image_width
                            , image_height
                            , (<|>)
                            , (<->)
                            , horiz_cat
                            , vert_cat
                            , background_fill
                            , char
                            , string
                            , iso_10646_string
                            , utf8_string
                            , utf8_bytestring
                            , char_fill
                            , empty_image
                            , translate
                            , crop
                            , pad
                            -- | The possible display attributes used in constructing an `Image`.
                            , module Graphics.Vty.Attributes
                            )
    where

import Graphics.Vty.Attributes
import Graphics.Vty.Image hiding ( attr )

import Data.Word

-- | The type of images to be displayed using 'update'.  
-- Can be constructed directly or using `pic_for_image`. Which provides an initial instance with
-- reasonable defaults for pic_cursor and pic_background.
data Picture = Picture
    { pic_cursor :: Cursor
    , pic_image :: Image 
    , pic_background :: Background
    }

instance Show Picture where
    show (Picture _ image _ ) = "Picture ?? " ++ show image ++ " ??"

-- | Create a picture for display for the given image. The picture will not have a displayed cursor
-- and the background display attribute will be `current_attr`.
pic_for_image :: Image -> Picture
pic_for_image i = Picture 
    { pic_cursor = NoCursor
    , pic_image = i
    , pic_background = Background ' ' current_attr
    }

-- | A picture can be configured either to not show the cursor or show the cursor at the specified
-- character position. 
--
-- There is not a 1 to 1 map from character positions to a row and column on the screen due to
-- characters that take more than 1 column.
--
-- todo: The Cursor can be given a (character,row) offset outside of the visible bounds of the
-- output region. In this case the cursor will not be shown.
data Cursor = 
      NoCursor
    | Cursor Word Word

-- | Unspecified regions are filled with the picture's background pattern.  The background pattern
-- can specify a character and a display attribute. If the display attribute used previously should
-- be used for a background fill then use `current_attr` for the background attribute. This is the
-- default background display attribute.
--
-- \todo The current attribute is always set to the default attributes at the start of updating the
-- screen to a picture.
--
-- \todo The background character *must* occupy a single column and no more.
data Background = Background 
    { background_char :: Char 
    , background_attr :: Attr
    }