packages feed

billeksah-forms-1.0.0: src/Graphics/Forms/Parameters.hs

{-# Language ExistentialQuantification, TypeFamilies, DeriveDataTypeable #-}

-----------------------------------------------------------------------------
--
-- Module      :  Graphics.Forms.Parameters
-- Copyright   :
-- License     :  AllRightsReserved
--
-- Maintainer  :
-- Stability   :
-- Portability :
--
-- | Module for parameters for editors
--  Setting of parameters: ("Name", ParaString "Hello") `setPara` defaultParameters
-- Getting parameters getPara "Name" paras
--
-----------------------------------------------------------------------------

module Graphics.Forms.Parameters (
    defaultParams,
    (<<<),
    getPara,
    getParaS,
    ParaType(..),
    Parameters
) where

import Base
import Graphics.Pane

import Graphics.UI.Gtk (Packing, ShadowType)
import Graphics.UI.Gtk.General.Enums (Packing(..), ShadowType(..))
import Data.Typeable (Typeable)

-- ParaName "Hallo" <<< defaultParams
--          selector

-- setPara :: Selector alpha => alpha => (ValueType alpha) => Parameters -> Parameters

type Parameters = [Para ParaType]

-- type Parameters = forall alpha . (Selector alpha) [(alpha, ValueType alpha)]



-- | A generalised attribute with independent get and set types.
data Para alpha = Para
    {paName   :: String,
     paValue  :: alpha}
     deriving Show

infixr 9 <<<

(<<<) :: (String, ParaType) -> Parameters -> Parameters
(<<<) (name,newValue)  paras =
    case [ para | para <- paras, paName para == name] of
        [p] -> p{paValue = newValue} : [ para | para <- paras, paName para /=  name]
        _   -> error $ "Parameters >> Cant find parameter " ++ name

getPara :: String -> Parameters -> ParaType
getPara name paras =
    case [ para | para <- paras, paName para == name] of
        [p] -> paValue p
        _   -> error $ "Parameters >> Cant find parameter " ++ name

getParaS :: String -> Parameters -> String
getParaS name paras = case getPara name paras of
                    ParaString s -> s
                    _ -> error "Parameters>>Not a string"

data StringSel = Name | StockId | Synopsis
    deriving (Eq, Ord, Show, Typeable)

instance Selector StringSel where
    type ValueType StringSel = String


data ParaType  =
    ParaString String
    | ParaAlign (Float,Float,Float,Float)
    | ParaPadding (Int,Int,Int,Int)
    | ParaSize (Int,Int)
    | ParaPos (Float,Float)
    | ParaBool Bool
    | ParaHori HorizontalAlign
    | ParaDir Direction
    | ParaShadow ShadowType
    | ParaPack Packing
    deriving(Eq,Show)

data HorizontalAlign =   StartHorizontal | StopHorizontal | Keep
    deriving (Eq,Show)

--data StringPara = ParaName | ParaStockId | ParaSynopsis
--    deriving (Eq,Ord,Show,Typeable)
--
--instance Selector StringPara where
--    type ValueType = String
--


defaultParams :: Parameters
defaultParams =
    [   Para "Name"            (ParaString "")
    ,   Para "StockId"         (ParaString "")
    ,   Para "Synopsis"        (ParaString "")
    ,   Para "Sensitivity"     (ParaBool True)
-- For boxes
    ,   Para "VBoxHomogeneous" (ParaBool False)
    ,   Para "HBoxHomogeneous" (ParaBool True)
    ,   Para "VPack"           (ParaPack PackNatural)
    ,   Para "HPack"           (ParaPack PackGrow)
-- For fields
    ,   Para "OuterAlignment"  (ParaAlign (0.0, 0.0, 1, 1))
    ,   Para "OuterPadding"    (ParaPadding (5, 5, 5, 5))
-- the label
    ,   Para "ShowLabel"       (ParaBool True)
    ,   Para "LabelAlign"      (ParaPos (0.5, 0.0))
    ,   Para "Shadow"          (ParaShadow ShadowNone)
-- the inner alignment
    ,   Para "InnerAlignment"  (ParaAlign (0.0, 0.0, 1, 1))
    ,   Para "InnerPadding"    (ParaPadding (5, 5, 5, 5))

-- for the field
    ,   Para "MinSize"         (ParaSize (-1,-1))

-- for special widgets
    ,   Para "Direction"       (ParaDir Horizontal)
    ,   Para "MultiSel"        (ParaBool True)


--    ,   Para "Horizontal"      (ParaHori Keep)
    ]