codemonitor-0.2: src/Render/Layout.hs
module Render.Layout where
import GHC.Exts
import Job.Types
import Monitor
import Render.Rect
data AttentionLevel = High | Medium | Low deriving (Eq, Ord)
findRects :: Rect -> [Monitor] -> [(Monitor, Rect)]
findRects originalRect monitors = zip orderedMonitors rectangles
where
orderedMonitors = orderMonitors monitors
rectangles
| orderedMonitors == []
= []
| hasHighest
= let (topArea, bottomArea) = divideVertical originalRect 0.9
tops = splitVertical topArea 1
bottoms = splitHorizontal bottomArea (numMonitors - 1)
in tops ++ bottoms
| hasMedium
= let (topArea, bottomArea) = divideVertical originalRect 0.9
tops = splitVertical topArea numMedium
bottoms = splitHorizontal bottomArea (numMonitors - numMedium)
in tops ++ bottoms
| otherwise
= let (_, bottomArea) = divideVertical originalRect 0.7
bottoms = splitHorizontal bottomArea numMonitors
in bottoms
numMonitors = length orderedMonitors
hasHighest = countAttentionLevels High orderedMonitors > 0
numMedium = countAttentionLevels Medium orderedMonitors
hasMedium = numMedium > 0
orderMonitors :: [Monitor] -> [Monitor]
orderMonitors = sortWith attentionLevel
attentionLevel :: Monitor -> AttentionLevel
attentionLevel (StatusCodeMonitor _ _ _ Fail _) = High
attentionLevel (StdoutMonitor _ _ _ _) = Medium
attentionLevel _ = Low
countAttentionLevels :: AttentionLevel -> [Monitor] -> Int
countAttentionLevels level = length . filterAttentionLevel level
filterAttentionLevel :: AttentionLevel -> [Monitor] -> [Monitor]
filterAttentionLevel level = filter ((==level) . attentionLevel)