diff options
Diffstat (limited to 'lib/Phi/Widget.hs')
-rw-r--r-- | lib/Phi/Widget.hs | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/lib/Phi/Widget.hs b/lib/Phi/Widget.hs index f6703a7..d28c21d 100644 --- a/lib/Phi/Widget.hs +++ b/lib/Phi/Widget.hs @@ -1,26 +1,35 @@ {-# LANGUAGE ExistentialQuantification, TypeFamilies, StandaloneDeriving, FlexibleContexts #-} -module Phi.Widget ( Widget(..) +module Phi.Widget ( Display + , Widget(..) , WidgetClass(..) , WidgetState(..) , separator , createWidgetState , layoutWidgets , renderWidgets + , handleMessageWidgets ) where +import Control.Concurrent import Control.Monad + import Data.Traversable +import qualified Graphics.X11.Xlib + import Graphics.Rendering.Cairo import Phi.Phi +type Display = MVar Graphics.X11.Xlib.Display + + class Show a => WidgetClass a where type WidgetData a :: * - initialState :: a -> WidgetData a + initWidget :: a -> Phi -> Display -> IO (WidgetData a) minSize :: a -> Int @@ -47,14 +56,16 @@ data WidgetState = forall a. (WidgetClass a, Show (WidgetData a)) => WidgetState } deriving instance Show WidgetState -createWidgetState :: Widget -> WidgetState -createWidgetState (Widget w) = WidgetState { stateWidget = w - , stateX = 0 - , stateY = 0 - , stateWidth = 0 - , stateHeight = 0 - , statePrivateData = initialState w - } +createWidgetState :: Phi -> Display -> Widget -> IO WidgetState +createWidgetState phi disp (Widget w) = do + priv <- initWidget w phi disp + return WidgetState { stateWidget = w + , stateX = 0 + , stateY = 0 + , stateWidth = 0 + , stateHeight = 0 + , statePrivateData = priv + } layoutWidgets :: [WidgetState] -> Int -> Int -> Int -> Int -> [WidgetState] layoutWidgets widgets x y width height = snd $ mapAccumL layoutWidgetAndX x widgets @@ -98,7 +109,7 @@ data Separator = Separator Int Float deriving Show instance WidgetClass Separator where type WidgetData Separator = () - initialState _ = () + initWidget _ _ _ = return () minSize (Separator s _) = s weight (Separator _ w) = w |