{-# OPTIONS_GHC -Wall -O2
  #-}

module Graphics.UI.LUI.Widget
    (DrawInfo(..)
    ,WidgetFuncs(..)
    ,KeyStatus(..)
    ,Widget
    ,New
    ,KeyAction
    ,Handler
    ,ActionHandlers
    )
where

import Graphics.UI.LUI.Image(Image)
import Graphics.UI.LUI.Accessor(Accessor)

import Graphics.UI.HaskGame.Vector2(Vector2)
import qualified Graphics.UI.HaskGame.Key as Key

import qualified Data.Map as Map

data KeyStatus = KeyDown | KeyUp
  deriving (Eq, Ord, Show, Read)

type KeyAction = (KeyStatus, Key.KeyGroup)
type Handler model = (String, Key.ModKey -> model)
type ActionHandlers model = Map.Map KeyAction (Handler model)

data DrawInfo = DrawInfo
    {
      diHasFocus :: Bool
    }
  deriving (Eq, Ord, Show, Read)

data WidgetFuncs model = WidgetFuncs
    {
      widgetImage :: DrawInfo -> Image
    , widgetSize :: DrawInfo -> Vector2 Int
    , widgetGetKeymap :: Maybe (ActionHandlers model)
    }

type Widget model = model -> WidgetFuncs model

type New model mutable =
    Accessor model mutable -> Widget model