{-# LANGUAGE DeriveFunctor #-}
module Drawing(Drawing(..),labelD,placedD,atomicD,DPath(..),up,GCSpec) where
import Graphic
import MeasuredGraphics(MeasuredGraphics(..),DPath(..),up)
--import FudgetIO
import NullF() -- instances, for hbc
import GCtx(GCSpec(..),wCreateGCtx)
import Placers2(overlayP)
import LayoutRequest
--import EitherUtils(Cont(..))
import GCAttrs(ColorSpec,FontSpec)
import Xtypes(GCAttributes)
--import Geometry() -- Show instances
data Drawing lbl leaf
= AtomicD leaf
| LabelD lbl (Drawing lbl leaf)
| AttribD GCSpec (Drawing lbl leaf)
| SpacedD Spacer (Drawing lbl leaf)
| PlacedD Placer (Drawing lbl leaf)
| ComposedD Int [Drawing lbl leaf] -- ^ Int=how many visible components
| CreateHardAttribD GCtx [GCAttributes ColorSpec FontSpec] (GCtx ->
Drawing lbl leaf)
deriving (Show,Functor)
labelD = LabelD
placedD = PlacedD
atomicD = AtomicD
instance Graphic leaf => Graphic (Drawing annot leaf) where
measureGraphicK = drawK
measureGraphicListK = drawListK overlayP -- or autoP ??
drawK d gctx{-@(GC gc fs)-} k =
case d of
AtomicD x -> measureGraphicK x gctx k
LabelD _ d -> drawK d gctx (k . MarkM gctx)
AttribD gcspec d ->
wCreateGCtx' gctx gcspec $ \ gctx' ->
drawK d gctx' (k . MarkM gctx')
SpacedD spacer d ->
drawK d gctx $ \ g ->
k (SpacedM spacer g)
PlacedD placer d ->
drawK d gctx $ \ g ->
k (PlacedM placer g)
ComposedD n ds ->
-- take the n visible components, remaining parts are invisible.
drawsK gctx (take n ds) $ \ gs ->
k (ComposedM gs)
CreateHardAttribD templ attrs d ->
wCreateGCtx templ attrs $ \tx ->
drawK (d tx) gctx k
{-
where
replaceFontK fs gcattrs k = font gcattrs (k fs) (\fid -> queryFont fid k)
font [] kdef _ = kdef
font (GCFont fid:gcattrs) _ kfont = kfont fid
font (_:gcattrs) kdef kfont = font gcattrs kdef kfont
-}
drawListK placer ds gctx k =
drawsK gctx ds $ \ gs ->
k (PlacedM placer $ ComposedM gs)
drawsK gctx [] k = k []
drawsK gctx (d:ds) k =
drawK d gctx $ \ g ->
drawsK gctx ds $ \ gs ->
k (g:gs)
wCreateGCtx' gctx gcspec k =
case gcspec of
HardGC gctx' -> k gctx'
SoftGC gcattrs -> wCreateGCtx gctx gcattrs k