module StatusIndicator where import Fudgets data Status = Unknown | InProgress | InError | Good deriving (Eq,Ord) statusF :: (Eq a,Enum a,Bounded a) => F (a,Status) b statusF = nullF >==< (createDrawStatus $ \ draw -> let u = draw Unknown pm = setBgColor bgColor . setInitDisp u . setBorderWidth 0 . setMargin 0 in placerF (horizontalP' 0) $ listF [(l,displayF' pm>=^<draw)|l<-[minBound..maxBound]]) createDrawStatus cont = fg ["black"] $ \ black -> fg ["red","#ff3300","#ff0033","#cc0000","grey40","black"] $ \ red -> fg ["yellow","#ffff33","white"] $ \ yellow -> fg ["green3","#00cc00","#00c000","green","black"] $ \ green -> --fg ["blue3","#0000cc","#0000c0","blue","black"] $ \ blue -> let drawStatus status = g $ FixCD 12 $ case status of Unknown -> [noLight] InProgress -> yellowLight InError -> redLight Good -> greenLight redLight = colLight red greenLight = colLight green yellowLight = colLight yellow colLight fg = [light fg,noLight] light fg = (fg,[FillArc (Rect 2 9) 0 (64*360)]) noLight = (black,[DrawArc (Rect 2 9) 0 (64*360)]) in cont drawStatus where fg colspec cont = wCreateGCtx rootGCtx (gcFgA colspec) $ cont . gctx2gc --instance Graphic Status where measureGraphicK = measureGraphicK . drawStatus