summaryrefslogtreecommitdiffstats
path: root/lib/Phi/Widget.hs
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2011-07-14 00:09:20 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2011-07-14 00:09:20 +0200
commit55d15b73caa4b8d74cf7d678842da69302e600d9 (patch)
treef24500cc8ffb6a1c1ad3bff774d741081069d082 /lib/Phi/Widget.hs
parent90c25a997bf951ea4b5c13cb95ef0dbb8105777e (diff)
downloadphi-55d15b73caa4b8d74cf7d678842da69302e600d9.tar
phi-55d15b73caa4b8d74cf7d678842da69302e600d9.zip
Restructured widget state
Diffstat (limited to 'lib/Phi/Widget.hs')
-rw-r--r--lib/Phi/Widget.hs67
1 files changed, 67 insertions, 0 deletions
diff --git a/lib/Phi/Widget.hs b/lib/Phi/Widget.hs
new file mode 100644
index 0000000..a4850e7
--- /dev/null
+++ b/lib/Phi/Widget.hs
@@ -0,0 +1,67 @@
+{-# LANGUAGE ExistentialQuantification, TypeFamilies #-}
+
+module Phi.Widget ( Widget(..)
+ , WidgetClass(..)
+ , WidgetState(..)
+ , separator
+ , createWidgetState
+ , layoutWidgets
+ , renderWidgets
+ ) where
+
+import Control.Monad
+
+import Graphics.Rendering.Cairo
+
+
+class WidgetClass a where
+ type WidgetData a :: *
+
+ initialState :: a -> WidgetData a
+
+ minSize :: a -> Int
+
+ weight :: a -> Float
+ weight _ = 0
+
+ layout :: a -> Int -> Int -> WidgetData a
+ layout widget _ _ = initialState widget
+
+ render :: a -> WidgetData a -> Int -> Int -> Render ()
+
+data Widget = forall a. WidgetClass a => Widget a
+
+data WidgetState = forall a. WidgetClass a => WidgetState { stateWidget :: a
+ , stateWidth :: Int
+ , stateHeight :: Int
+ , statePrivateData :: WidgetData a
+ }
+
+createWidgetState :: Widget -> WidgetState
+createWidgetState (Widget w) = WidgetState { stateWidget = w
+ , stateWidth = 0
+ , stateHeight = 0
+ , statePrivateData = initialState w
+ }
+
+layoutWidgets :: [WidgetState] -> Int -> Int -> [WidgetState]
+layoutWidgets widgets w h = map layoutWidget widgets
+ where
+ layoutWidget state = state { stateWidth = w, stateHeight = h }
+
+renderWidgets :: [WidgetState] -> Render ()
+renderWidgets widgets = forM_ widgets $ \WidgetState { stateWidget = widget, stateWidth = w, stateHeight = h, statePrivateData = priv } -> render widget priv w h
+
+
+data Separator = Separator Int Float
+
+instance WidgetClass Separator where
+ type WidgetData Separator = ()
+ initialState _ = ()
+
+ minSize (Separator s _) = s
+ weight (Separator _ w) = w
+ render _ _ _ _ = return ()
+
+separator :: Int -> Float -> Widget
+separator s w = Widget $ Separator s w