module Layout where
import Data.Maybe
import Job
import Monitor
import qualified Data.Map as M
import Rect
data RectType = Small
| Large
deriving (Eq, Ord)
type RectMap = M.Map RectType [Rect]
findRects :: Rect -> [Monitor] -> [(Monitor, Rect)]
findRects originalRect monitors = match monitors rectMap
where
rectMap = rectsForTypes originalRect monitors
match [] _ = []
match (m:ms) mmap = let (rect, restMap) = rectMapPop (rectType m) mmap
in (m, rect):match ms restMap
rectsForTypes :: Rect -> [Monitor] -> RectMap
rectsForTypes originalRect monitors =
let types = map rectType monitors
numSmalle = length $ filter (==Small) types
numLarge = length $ filter (==Large) types
smallArea = if numLarge == 0
then snd $ divideVertical originalRect 0.7
else snd $ divideVertical originalRect 0.9
largeArea = if numSmalle == 0
then originalRect
else fst (divideVertical originalRect 0.9)
in rectMapCreate
[ (Small, splitHorizontal smallArea numSmalle)
, (Large, splitVertical largeArea numLarge)
]
rectType :: Monitor -> RectType
rectType (JobMonitor { mJobStatus = Fail _ }) = Large
rectType _ = Small
rectMapPop :: RectType -> RectMap -> (Rect, RectMap)
rectMapPop t m = let rects = fromJust $ M.lookup t m
firstRect = head rects
restRects = tail rects
in (firstRect, M.insert t restRects m)
rectMapCreate :: [(RectType, [Rect])] -> RectMap
rectMapCreate = M.fromList