{-# LANGUAGE CPP #-}
module DrawingUtils where
import Xtypes
import Drawing
import Graphic
import FixedDrawing
import FlexibleDrawing(blank')
import GCAttrs
import GCtx
import Placers
import MatrixP(matrixP,matrixP')
import Spacers
import Placers2
import TableP(tableP,tableP')
import Geometry
import DrawTypes(DrawCommand(..))
import Alignment(aLeft,aCenter,aTop)
import LayoutDir(LayoutDir(..))
--import EitherUtils(Cont(..))
--import Fudget(K)

#include "exists.h"

boxVisibleD :: Int -> [Drawing lbl leaf] -> Drawing lbl leaf
boxVisibleD = forall lbl leaf. Int -> [Drawing lbl leaf] -> Drawing lbl leaf
ComposedD
boxD :: [Drawing lbl leaf] -> Drawing lbl leaf
boxD [Drawing lbl leaf]
ds = forall lbl leaf. Int -> [Drawing lbl leaf] -> Drawing lbl leaf
ComposedD (forall (t :: * -> *) a. Foldable t => t a -> Int
length [Drawing lbl leaf]
ds) [Drawing lbl leaf]
ds
stackD :: [Drawing lbl leaf] -> Drawing lbl leaf
stackD = forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD Placer
overlayP forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {lbl} {leaf}. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
vertD :: Drawing lbl leaf -> Drawing lbl leaf
vertD = forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD Placer
verticalP
vertD' :: Int -> Drawing lbl leaf -> Drawing lbl leaf
vertD' = forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Placer
verticalP'
horizD :: Drawing lbl leaf -> Drawing lbl leaf
horizD = forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD Placer
horizontalP
horizD' :: Int -> Drawing lbl leaf -> Drawing lbl leaf
horizD' = forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Placer
horizontalP'
vboxD :: [Drawing lbl leaf] -> Drawing lbl leaf
vboxD = forall {lbl} {leaf}. Drawing lbl leaf -> Drawing lbl leaf
vertD forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {lbl} {leaf}. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
hboxD :: [Drawing lbl leaf] -> Drawing lbl leaf
hboxD = forall {lbl} {leaf}. Drawing lbl leaf -> Drawing lbl leaf
horizD forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {lbl} {leaf}. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
vboxD' :: Int -> [Drawing lbl leaf] -> Drawing lbl leaf
vboxD' Int
sep = forall {lbl} {leaf}. Int -> Drawing lbl leaf -> Drawing lbl leaf
vertD' Int
sep forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {lbl} {leaf}. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
hboxD' :: Int -> [Drawing lbl leaf] -> Drawing lbl leaf
hboxD' Int
sep = forall {lbl} {leaf}. Int -> Drawing lbl leaf -> Drawing lbl leaf
horizD' Int
sep forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {lbl} {leaf}. [Drawing lbl leaf] -> Drawing lbl leaf
boxD

vertlD :: Drawing lbl leaf -> Drawing lbl leaf
vertlD = forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD Placer
verticalLeftP
vertlD' :: Int -> Drawing lbl leaf -> Drawing lbl leaf
vertlD' = forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Placer
verticalLeftP'
vboxlD :: [Drawing lbl leaf] -> Drawing lbl leaf
vboxlD = forall {lbl} {leaf}. Drawing lbl leaf -> Drawing lbl leaf
vertlD forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {lbl} {leaf}. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
vboxlD' :: Int -> [Drawing lbl leaf] -> Drawing lbl leaf
vboxlD' Int
sep = forall {lbl} {leaf}. Int -> Drawing lbl leaf -> Drawing lbl leaf
vertlD' Int
sep forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {lbl} {leaf}. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
horizcD :: Drawing lbl leaf -> Drawing lbl leaf
horizcD = forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD Placer
horizontalCenterP
horizcD' :: Int -> Drawing lbl leaf -> Drawing lbl leaf
horizcD' = forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Placer
horizontalCenterP'
hboxcD :: [Drawing lbl leaf] -> Drawing lbl leaf
hboxcD = forall {lbl} {leaf}. Drawing lbl leaf -> Drawing lbl leaf
horizcD forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {lbl} {leaf}. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
hboxcD' :: Int -> [Drawing lbl leaf] -> Drawing lbl leaf
hboxcD' Int
sep = forall {lbl} {leaf}. Int -> Drawing lbl leaf -> Drawing lbl leaf
horizcD' Int
sep forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {lbl} {leaf}. [Drawing lbl leaf] -> Drawing lbl leaf
boxD

tableD :: Int -> [Drawing lbl leaf] -> Drawing lbl leaf
tableD Int
n = forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD (Int -> Placer
tableP Int
n) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {lbl} {leaf}. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
tableD' :: Int -> Int -> [Drawing lbl leaf] -> Drawing lbl leaf
tableD' Int
sep Int
n = forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD (Int -> LayoutDir -> Int -> Placer
tableP' Int
n LayoutDir
Horizontal Int
sep) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {lbl} {leaf}. [Drawing lbl leaf] -> Drawing lbl leaf
boxD

matrixD :: Int -> [Drawing lbl leaf] -> Drawing lbl leaf
matrixD Int
n = forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD (Int -> Placer
matrixP Int
n) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {lbl} {leaf}. [Drawing lbl leaf] -> Drawing lbl leaf
boxD
matrixD' :: Int -> Int -> [Drawing lbl leaf] -> Drawing lbl leaf
matrixD' Int
sep Int
n = forall lbl leaf. Placer -> Drawing lbl leaf -> Drawing lbl leaf
PlacedD (Int -> LayoutDir -> Int -> Placer
matrixP' Int
n LayoutDir
Horizontal Int
sep) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {lbl} {leaf}. [Drawing lbl leaf] -> Drawing lbl leaf
boxD

westD :: Drawing lbl leaf -> Drawing lbl leaf
westD = forall {lbl} {leaf}. Spacer -> Drawing lbl leaf -> Drawing lbl leaf
spacedD forall a b. (a -> b) -> a -> b
$ Alignment -> Alignment -> Spacer
hvAlignS Alignment
aLeft Alignment
aCenter
northwestD :: Drawing lbl leaf -> Drawing lbl leaf
northwestD = forall {lbl} {leaf}. Spacer -> Drawing lbl leaf -> Drawing lbl leaf
spacedD forall a b. (a -> b) -> a -> b
$ Alignment -> Alignment -> Spacer
hvAlignS Alignment
aLeft Alignment
aTop

padD :: Int -> Drawing lbl leaf -> Drawing lbl leaf
padD = forall {lbl} {leaf}. Spacer -> Drawing lbl leaf -> Drawing lbl leaf
spacedDforall b c a. (b -> c) -> (a -> b) -> a -> c
.Int -> Spacer
marginS

fontD :: a -> Drawing lbl leaf -> Drawing lbl leaf
fontD a
fn = forall {lbl} {leaf}.
[GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf -> Drawing lbl leaf
softAttribD [forall a b. b -> GCAttributes a b
GCFont (forall {a}. (Show a, FontGen a) => a -> FontSpec
fontSpec a
fn)]

--fgnD :: ColorName -> Drawing lbl leaf -> Drawing lbl leaf
--fgnD = fgD.Name

--fontnD :: FontName -> Drawing lbl leaf -> Drawing lbl leaf
--fontnD = fontD.Name

fgD :: a -> Drawing lbl leaf -> Drawing lbl leaf
fgD a
color = forall {lbl} {leaf}.
[GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf -> Drawing lbl leaf
softAttribD [forall a b. a -> GCAttributes a b
GCForeground (forall {a}. (Show a, ColorGen a) => a -> ColorSpec
colorSpec a
color)]
bgD :: a -> Drawing lbl leaf -> Drawing lbl leaf
bgD a
color = forall {lbl} {leaf}.
[GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf -> Drawing lbl leaf
softAttribD [forall a b. a -> GCAttributes a b
GCBackground (forall {a}. (Show a, ColorGen a) => a -> ColorSpec
colorSpec a
color)]
fatD :: Drawing lbl leaf -> Drawing lbl leaf
fatD = forall {lbl} {leaf}.
[GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf -> Drawing lbl leaf
softAttribD [forall a b. Int -> GCAttributes a b
GCLineWidth Int
5,forall a b. GCCapStyle -> GCAttributes a b
GCCapStyle GCCapStyle
CapRound]
--attribD = belowAnnotD.AttribD --hmm
attribD :: GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
attribD = forall lbl leaf. GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
AttribD 
softAttribD :: [GCAttributes ColorSpec FontSpec]
-> Drawing lbl leaf -> Drawing lbl leaf
softAttribD = forall lbl leaf. GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
attribDforall b c a. (b -> c) -> (a -> b) -> a -> c
.[GCAttributes ColorSpec FontSpec] -> GCSpec
SoftGC
hardAttribD :: GCtx -> Drawing lbl leaf -> Drawing lbl leaf
hardAttribD = forall lbl leaf. GCSpec -> Drawing lbl leaf -> Drawing lbl leaf
attribDforall b c a. (b -> c) -> (a -> b) -> a -> c
.GCtx -> GCSpec
HardGC
--spacedD = belowAnnotD.SpacedD  --hmm
spacedD :: Spacer -> Drawing lbl leaf -> Drawing lbl leaf
spacedD = forall {lbl} {leaf}. Spacer -> Drawing lbl leaf -> Drawing lbl leaf
SpacedD

--belowAnnotD f (LabelD a d) = LabelD a (belowAnnotD f d)
--belowAnnotD f d = f d

#ifdef USE_EXIST_Q
data Gfx = EXISTS(a) TSTHACK((Graphic EQV(a)) =>) G EQV(a)
-- deriving Show -- doesn't work because of a HBC bug

instance Show Gfx where showsPrec :: Int -> Gfx -> ShowS
showsPrec Int
n (G a
x) String
s = String
"G "forall a. [a] -> [a] -> [a]
++{-showsPrec 10 x-} String
s

instance Graphic Gfx where
  measureGraphicK :: forall (k :: * -> * -> *) i o.
FudgetIO k =>
Gfx -> GCtx -> Cont (k i o) MeasuredGraphics
measureGraphicK (G a
x) = forall a (k :: * -> * -> *) i o.
(Graphic a, FudgetIO k) =>
a -> GCtx -> Cont (k i o) MeasuredGraphics
measureGraphicK a
x

g :: a -> Drawing lbl Gfx
g a
x = forall {leaf} {lbl}. leaf -> Drawing lbl leaf
atomicD (forall a. Graphic a => a -> Gfx
G a
x)

#else

g = atomicD

#endif

filledRectD :: Size -> Drawing lbl Gfx
filledRectD Size
size = forall {a} {lbl}. Graphic a => a -> Drawing lbl Gfx
g (Size -> [DrawCommand] -> FixedDrawing
FixD (Size
size) [Rect -> DrawCommand
FillRectangle (Size -> Size -> Rect
Rect Size
origin Size
size)])
rectD :: Size -> Drawing lbl Gfx
rectD Size
size = forall {a} {lbl}. Graphic a => a -> Drawing lbl Gfx
g (Size -> [DrawCommand] -> FixedDrawing
FixD (Size
sizeforall a. Num a => a -> a -> a
+Size
1) [Rect -> DrawCommand
DrawRectangle (Size -> Size -> Rect
Rect Size
origin Size
size)])
                   -- size+1 assumes that the line width is 1
blankD :: Size -> Drawing lbl Gfx
blankD = forall {a} {lbl}. Graphic a => a -> Drawing lbl Gfx
g forall b c a. (b -> c) -> (a -> b) -> a -> c
. Size -> FlexibleDrawing
blank' 

holeD :: Drawing lbl Gfx
holeD =
    forall {a} {lbl} {leaf}.
(Show a, ColorGen a) =>
a -> Drawing lbl leaf -> Drawing lbl leaf
fgD String
"blue3" forall a b. (a -> b) -> a -> b
$ forall {lbl}. Size -> Drawing lbl Gfx
rectD Size
size
    --stack [fgD "white" (filledRectD size),rectD size]
  where
    size :: Size
size = Int -> Int -> Size
pP Int
15 Int
13