{-#LANGUAGE ViewPatterns #-}
module Simple.UI.Layouts.SingleLayout (
SingleLayout (..),
SingleLayoutData (..),
SingleLayoutClass,
singleLayoutNew,
layoutIndex,
def
) where
import Control.Lens (element, (^?))
import Control.Monad (forM_)
import Data.Default.Class
import Simple.UI.Core.Internal.UIApp
import Simple.UI.Core.Attribute
import Simple.UI.Core.ListenerList
import Simple.UI.Widgets.Container
import Simple.UI.Widgets.Widget
newtype SingleLayout = SingleLayout
{ _singleLayoutIndex :: Attribute Int
}
data SingleLayoutData = SingleLayoutData
class LayoutClass w => SingleLayoutClass w where
layoutIndex :: w -> Attribute Int
instance LayoutClass SingleLayout where
type LayoutData SingleLayout = SingleLayoutData
layoutDraw (castToContainer -> container) drawing width height = do
_widgets <- get container widgets
forM_ _widgets $ \(widget, _) -> set widget visible False
maybeWidget <- singleLayoutWidget container
case maybeWidget of
Just widget -> do
set widget visible True
fire widget draw (drawing, width, height)
Nothing ->
return ()
layoutComputeSize (castToContainer -> container) = do
maybeWidget <- singleLayoutWidget container
case maybeWidget of
Just widget -> computeSize widget
Nothing -> return (1, 1)
instance SingleLayoutClass SingleLayout where
layoutIndex = _singleLayoutIndex
instance Default SingleLayoutData where
def = SingleLayoutData
singleLayoutNew :: UIApp u SingleLayout
singleLayoutNew = do
index <- attributeNew 0
return SingleLayout
{ _singleLayoutIndex = index
}
singleLayoutWidget :: Container SingleLayout -> UIApp u (Maybe Widget)
singleLayoutWidget container = do
_widgets <- get container widgets
if null _widgets
then
return Nothing
else do
_layout <- get container layout
index <- readAttr $ layoutIndex _layout
return $ fst <$> _widgets ^? element index