eventloop-0.8.2.8: src/Eventloop/Utility/Trees/LayoutTree.hs
module Eventloop.Utility.Trees.LayoutTree where
import Eventloop.Module.BasicShapes.Types
import Eventloop.Utility.Vectors
data LayoutTree = LBox Point TopConnect BottomConnect [LayoutNodeContent] [(LayoutLine, LayoutTree)]
deriving (Show, Eq)
data LayoutNodeContent = LayoutNodeText FillColor Point String Dimensions
| LayoutNode FillColor Point Radius
deriving (Show, Eq)
data LayoutLine = LayoutLine StrokeColor
deriving (Show, Eq)
type TopConnect = Connect
type BottomConnect = Connect
type Connect = Point
marginLine = 3 :: Float
lineThickness = 1 :: Float
textThickness = 1 :: Float
textFont = "Courier"
printTree :: LayoutTree -> Shape
printTree (LBox (Point offset) _ botConnect nodeContents childrenWithLines) = CompositeShape (shapeChildren ++ shapeLines ++ shapeContents) Nothing Nothing
where
children = map snd childrenWithLines
shapeChildren = map printTree children
shapeContents = map (printNodeContent offset) nodeContents
shapeLines = map (printLine (botConnect')) childrenWithLines
botConnect' = (Point offset) |+| botConnect
printNodeContent :: Offset -> LayoutNodeContent -> Shape
printNodeContent (xOffset, yOffset) (LayoutNodeText fillColor p text (_, height)) = Text text textFont height ((Point (xOffset, yOffset)) |+| p) AlignCenter fillColor textThickness (0,0,0,0) Nothing
printNodeContent (xOffset, yOffset) (LayoutNode fillColor p r) = Circle ((Point (xOffset, yOffset)) |+| p) r fillColor lineThickness (0,0,0,0) Nothing
printLine :: Point -> (LayoutLine, LayoutTree) -> Shape
printLine startPoint ((LayoutLine lineColor),(LBox point topConnect _ _ _)) = Line startMarg endMarg lineThickness lineColor Nothing
where
startMarg = marginizeLinePoints marginLine startPoint endPoint
endMarg = marginizeLinePoints marginLine endPoint startPoint
endPoint = point |+| topConnect
marginizeLinePoints :: GraphicalNumeric -> Point -> Point -> Point
marginizeLinePoints margin p1@(Point (xStart, yStart)) p2@(Point (xEnd, yEnd)) = Point (xStart', yStart')
where
xStart' = xStart + fraction * xSize
yStart' = yStart + fraction * ySize
fraction = margin / size
size = lengthBetweenPoints p1 p2
(xSize, ySize) = differenceBetweenPoints p1 p2