diff options
Diffstat (limited to 'lib/Phi/Panel.hs')
-rw-r--r-- | lib/Phi/Panel.hs | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/lib/Phi/Panel.hs b/lib/Phi/Panel.hs index 42f4f98..b15f6ab 100644 --- a/lib/Phi/Panel.hs +++ b/lib/Phi/Panel.hs @@ -4,10 +4,13 @@ module Phi.Panel ( Position(..) , Panel(..) , PanelClass(..) , (<~>) + , PanelConfig(..) + , defaultPanelConfig , separator ) where import Data.Function +import Data.Monoid data Position = Top | Bottom @@ -17,21 +20,36 @@ class PanelClass a where weight :: a -> Float weight _ = 0 -data Panel = forall a. PanelClass a => Panel a +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 -data CompoundPanel = CompoundPanel Panel Panel +(<~>) :: Panel -> Panel -> Panel +(<~>) = mappend -instance PanelClass CompoundPanel where - minSize (CompoundPanel a b) = ((+) `on` minSize) a b - weight (CompoundPanel a b) = ((+) `on` weight) a b -(<~>) :: Panel -> Panel -> Panel -a <~> b = Panel $ CompoundPanel a b +data PanelConfig = PanelConfig { panelPosition :: Position + , panelSize :: Int + , panelContent :: Panel + } +defaultPanelConfig :: PanelConfig +defaultPanelConfig = PanelConfig { panelPosition = Top, panelSize = 24, panelContent = mempty } data Separator = Separator Int Float |