61 lines
1.6 KiB
Haskell
61 lines
1.6 KiB
Haskell
{-# LANGUAGE ExistentialQuantification #-}
|
|
|
|
module Phi.Panel ( Position(..)
|
|
, Panel(..)
|
|
, PanelClass(..)
|
|
, (<~>)
|
|
, PanelConfig(..)
|
|
, defaultPanelConfig
|
|
, separator
|
|
) where
|
|
|
|
import Data.Function
|
|
import Data.Monoid
|
|
|
|
data Position = Top | Bottom
|
|
|
|
class PanelClass a where
|
|
minSize :: a -> Int
|
|
|
|
weight :: a -> Float
|
|
weight _ = 0
|
|
|
|
data Panel = forall a. PanelClass a => Panel a | CompoundPanel [Panel]
|
|
|
|
instance Monoid Panel where
|
|
mempty = CompoundPanel []
|
|
mappend a b = makePanel $ (toList a) ++ (toList b)
|
|
where
|
|
toList (Panel p) = [Panel p]
|
|
toList (CompoundPanel panels) = panels
|
|
|
|
makePanel [p] = p
|
|
makePanel panels = CompoundPanel panels
|
|
|
|
instance PanelClass Panel where
|
|
minSize (Panel p) = minSize p
|
|
minSize (CompoundPanel panels) = sum $ map minSize panels
|
|
|
|
weight (Panel p) = weight p
|
|
weight (CompoundPanel panels) = sum $ map weight panels
|
|
|
|
(<~>) :: Panel -> Panel -> Panel
|
|
(<~>) = mappend
|
|
|
|
|
|
data PanelConfig = PanelConfig { panelPosition :: Position
|
|
, panelSize :: Int
|
|
, panelContent :: Panel
|
|
}
|
|
|
|
defaultPanelConfig :: PanelConfig
|
|
defaultPanelConfig = PanelConfig { panelPosition = Top, panelSize = 24, panelContent = mempty }
|
|
|
|
data Separator = Separator Int Float
|
|
|
|
instance PanelClass Separator where
|
|
minSize (Separator s _) = s
|
|
weight (Separator _ w) = w
|
|
|
|
separator :: Int -> Float -> Panel
|
|
separator s w = Panel $ Separator s w
|