module FPPrac.Trees.LayoutTree
( LayoutTree(..)
, LayoutNodeContent(..)
, LayoutLine(..)
, TopConnect
, BottomConnect
, Radius
, printTree
) where
import EventLoop.Output
import EventLoop.Output.Single
import EventLoop.CommonTypes
data LayoutTree = LBox Pos TopConnect BottomConnect [LayoutNodeContent] [(LayoutLine, LayoutTree)] deriving (Show)
data LayoutNodeContent = LayoutNodeText Color Pos String Dimension
| LayoutNode Color Pos Radius
deriving (Show)
data LayoutLine = LayoutLine Color
deriving (Show)
type TopConnect = Connect
type BottomConnect = Connect
type Connect = Pos
type Radius = Float
type Offset = Pos
marginLine = 3 :: Float
lineThickness = 2 :: Float
textFont = "Courier"
absolutePos :: Pos -> Pos -> Pos
absolutePos (offsetx, offsety) (relx, rely) = (offsetx + relx, offsety + rely)
printTree :: LayoutTree -> GObject
printTree (LBox pos _ botConnect nodeContents childrenWithLines) = Container (gChildren ++ gLines ++ gContents)
where
children = map snd childrenWithLines
gChildren = map printTree children
gContents = map (printNodeContent pos) nodeContents
gLines = map (printLine (botConnect')) childrenWithLines
botConnect' = absolutePos pos botConnect
printNodeContent :: Offset -> LayoutNodeContent -> GObject
printNodeContent (xOffset, yOffset) (LayoutNodeText color (x,y) str (_, height)) = GObject "nodetext" (Text color 1 color (x + xOffset, y + yOffset) height textFont str True) []
printNodeContent (xOffset, yOffset) (LayoutNode color (x,y) rad) = GObject "node" (Arc (0,0,0) 0 color (x + xOffset, y + yOffset) rad 0 360) []
printLine :: Pos -> (LayoutLine, LayoutTree) -> GObject
printLine startPos ((LayoutLine lineColor),(LBox pos topConnect _ _ _)) = GObject "line" (Line lineColor lineThickness [startMarg, endMarg]) []
where
startMarg = marginizePosition marginLine startPos endPos
endMarg = marginizePosition marginLine endPos startPos
endPos = absolutePos pos topConnect
marginizePosition :: Float -> Pos -> Pos -> Pos
marginizePosition margin (xStart, yStart) (xEnd, yEnd) = (xStart', yStart')
where
xStart' = xStart + fraction * xSize
yStart' = yStart + fraction * ySize
fraction = margin / size
size = sqrt (xSize^2 + ySize^2)
xSize = xEnd xStart
ySize = yEnd yStart