wtk-gtk-0.1: Graphics/UI/Gtk/WtkGui.hs
---------------------------------------------------------
--
-- Module : GUI.wtk-gui
-- Copyright : Bartosz Wójcik (2010)
-- License : BSD3
--
-- Maintainer : bartek@sudety.it
-- Stability : Unstable
-- Portability : portable
--
-- | Data types being standard interface between any GUI and
-- underlying application.
-- Heavy usage of lenses, which has disadvantage of huge amount
-- of API documentation without proper comments.
---------------------------------------------------------
{-# LANGUAGE ExistentialQuantification
, TemplateHaskell
, FlexibleContexts
, NoMonomorphismRestriction #-}
module Graphics.UI.Gtk.WtkGui
where
import Data.Time
import Data.IORef (IORef)
import Data.Lenses
import Data.Lenses.Template
-- | Abstract input types. Denote UI fields.
data InputFieldType =
-- | Float value
Fl { flValue_ :: Maybe Double -- ^ parsed value
}
-- | Integer value
| In { inValue_ :: Maybe Int }
-- | String value
| Str { stValue_ :: String }
-- | Date value
| Da { daValue_ :: Maybe Day }
-- | Selection list (no syntax validation)
| Selection { selValue_ :: Maybe Int -- ^ selected item
, selString_ :: [String] -- ^ list of avaliable values
}
-- | Check Box (no syntax validation)
| CheckBox { cbValue_ :: Bool }
-- | Very general action.
| Action { action_ :: IO () }
-- | In case no data needed for a widget.
| NoDataJustAttributes
-- Action is so particular GUI solution specific so we not abstract it.
-- forall a. Action { action :: IORef a -> IO () } -- ^ action itself
instance Show InputFieldType where
show (Fl x) = "Fl " ++ show x
show (In x) = "In " ++ show x
show (Str x) = "St " ++ x
show (Da x) = "Da " ++ show x
show (Selection x y) = "Sel " ++ show x ++ " " ++ show y
show (CheckBox x) = "CB " ++ show x
show (Action _) = "Action"
$( deriveLenses ''InputFieldType )
isSelectionJust (Selection (Just _) _) = True
isSelectionJust _ = False
isInputJust (Fl (Just _)) = True
isInputJust (In (Just _)) = True
isInputJust (Da (Just _)) = True
isInputJust _ = False
isCheckBox (CheckBox _) = True
isCheckBox _ = False
setCheckBox v (CheckBox _) = CheckBox v
setCheckBox _ x = x
newSelection :: Int -> InputFieldType -> InputFieldType
newSelection i s@(Selection _ xs) | length xs < i-1 || i < 0 = s
| otherwise = Selection (Just i) xs
-- ================= Abstract Widget ========================
-- | Attributes of an abstract widget
data Attributes = Attributes {
rawValue_ :: String -- ^ raw value
, validated_ :: Bool -- ^ value has been validated
, visible_ :: Bool -- ^ visibility
, editable_ :: Bool -- ^ value editable
, isError_ :: Bool -- ^ True when value is not correct
, errMssg_ :: String -- ^ error message
}
deriving (Show, Eq, Ord)
$( deriveLenses ''Attributes )
-- | Abstraction of widget. It consists of id, value with type and attributes.
-- This is main data type to use as widget field. It consist of all what needed:
-- its ID, its value of one of allowed types and attributes.
data InputField = InputField {idOf_ :: Int
,val_ :: InputFieldType
,att_ :: Attributes
}
deriving Show
$( deriveLenses ''InputField )
-- | Boilerplating not provided by Lenses.Template
val_flValue = val . flValue
val_inValue = val . inValue
val_stValue = val . stValue
val_daValue = val . daValue
val_cbValue = val . cbValue
val_selValue = val . selValue
val_selString = val . selString
val_action = val . action
att_rawValue = att . rawValue
att_validated = att . validated
att_visible = att . visible
att_editable = att . editable
att_isError = att . isError
att_errMssg = att . errMssg