{-# LANGUAGE CPP #-} module DDisplayF(--HasInitDisp(..), setSpacer, DisplayF, displayF,displayF',--displayF'', intDispF,intDispF',--intDispF'', labelF,labelF' --,labelF'' ) where import FDefaults import GraphicsF(graphicsDispF',replaceAllGfx,setGfxEventMask)--GfxCommand import Graphic import Drawing() -- instances import DrawingUtils(spacedD,g)--vboxD,blankD,hardAttribD, import GCAttrs --(ColorSpec,colorSpec) -- + instances --import GCtx(GCtx(..),wCreateGCtx,rootGCtx) --import EitherUtils(mapEither) --import FudgetIO --import Fudget import NullF(F) --import Xtypes import ResourceIds() -- synonym ColorName, for hbc import Defaults(defaultFont,labelFont,paperColor,fgColor,bgColor) import CmdLineEnv(argKeyList) import CompOps((>=^^<),(>=^<),(>^^=<)) import CompSP(idLeftSP) import Spops(nullSP) import SpEither(filterRightSP) import Alignment(aRight,aLeft,aCenter) --import AlignF(noStretchF) --import LoadFont(safeLoadQueryFont) --import Font(string_box_size) import Spacers(marginS,compS,hAlignS)--minSizeS,noStretchS, import LayoutRequest(Spacer) import Sizing(Sizing(..)) import CondLayout(alignFixedS') --import Maybe(fromMaybe) {- HBC uses "cpp -C -traditional" which causes all the to be left behind when the macro definitions are processed. That is why the definitions are inside a comment. -} newtype DisplayF a = Pars [Pars a] data Pars a = BorderWidth Int | FgColorSpec ColorSpec | BgColorSpec ColorSpec | FontSpec FontSpec -- | Align Alignment | Spacer Spacer | Margin Int | InitDisp a | InitSize a | Sizing Sizing | Stretchable (Bool,Bool) -- Don't forget to adjust instance Functor DisplayF above if you add stuff here! type StringDisplayF = DisplayF String instance HasBorderWidth (DisplayF a) where { setBorderWidth p (Pars ps) = Pars (BorderWidth p:ps); getBorderWidthMaybe (Pars ps) = getparMaybe (\x->case x of BorderWidth p -> Just p; _-> Nothing) ps } instance HasFgColorSpec (DisplayF a) where { setFgColorSpec p (Pars ps) = Pars (FgColorSpec p:ps); getFgColorSpecMaybe (Pars ps) = getparMaybe (\x->case x of FgColorSpec p -> Just p; _-> Nothing) ps } instance HasBgColorSpec (DisplayF a) where { setBgColorSpec p (Pars ps) = Pars (BgColorSpec p:ps); getBgColorSpecMaybe (Pars ps) = getparMaybe (\x->case x of BgColorSpec p -> Just p; _-> Nothing) ps } instance HasFontSpec (DisplayF a) where { setFontSpec p (Pars ps) = Pars (FontSpec p:ps); getFontSpecMaybe (Pars ps) = getparMaybe (\x->case x of FontSpec p -> Just p; _-> Nothing) ps } --instance HasAlign (DisplayF a) where { setAlign p (Pars ps) = Pars (Align p:ps); getAlignMaybe (Pars ps) = getparMaybe (\x->case x of Align p -> Just p; _-> Nothing) ps } instance HasMargin (DisplayF a) where { setMargin p (Pars ps) = Pars (Margin p:ps); getMarginMaybe (Pars ps) = getparMaybe (\x->case x of Margin p -> Just p; _-> Nothing) ps } instance HasInitDisp (DisplayF) where { setInitDisp p (Pars ps) = Pars (InitDisp p:ps); getInitDispMaybe (Pars ps) = getparMaybe (\x->case x of InitDisp p -> Just p; _-> Nothing) ps } setSpacer p = cust (\ (Pars ps) -> Pars (Spacer p:ps)); getSpacer (Pars ps) = getpar (\x->case x of Spacer p -> Just p; _-> Nothing) ps; getSpacerMaybe (Pars ps) = getparMaybe (\x->case x of Spacer p -> Just p; _-> Nothing) ps instance HasInitSize (DisplayF) where { setInitSize p (Pars ps) = Pars (InitSize p:ps); getInitSizeMaybe (Pars ps) = getparMaybe (\x->case x of InitSize p -> Just p; _-> Nothing) ps } instance HasStretchable (DisplayF a) where { setStretchable p (Pars ps) = Pars (Stretchable p:ps); getStretchableMaybe (Pars ps) = getparMaybe (\x->case x of Stretchable p -> Just p; _-> Nothing) ps } instance HasSizing (DisplayF a) where { setSizing p (Pars ps) = Pars (Sizing p:ps); getSizingMaybe (Pars ps) = getparMaybe (\x->case x of Sizing p -> Just p; _-> Nothing) ps } -- For backwards compatibility: instance HasAlign (DisplayF a) where setAlign align (Pars ps) = Pars (Spacer (alignFixedS' align aCenter):ps) labelDisplayF :: Graphic g => F g void -- because of monomorphism restriction labelDisplayF = labelDisplayF' standard labelDisplayF' pm = noPF $ labelDisplayF'' pm labelDisplayF'' :: Graphic g => Customiser (DisplayF g) -> PF (DisplayF g) g void labelDisplayF'' pmod = nullSP >^^=< graphicsDispF' custom >=^< pre >=^^< filterRightSP where custom = maybe id (setInitDisp . draw) initDisp . maybe id (setInitSize . draw) initSize . setGfxEventMask [] . setSizing sizing . setBorderWidth borderWidth . setBgColorSpec bgColor . setFont font . setFgColorSpec fgColor . setStretchable stretch pre = replaceAllGfx . draw draw = marginD . g marginD = spacedD (marginS margin `compS` spacer) margin = getMargin ps borderWidth = getBorderWidth ps bgColor = getBgColorSpec ps fgColor = getFgColorSpec ps font = getFontSpec ps spacer = getSpacer ps stretch = getStretchable ps sizing = getSizing ps initSize = getInitSizeMaybe ps initDisp = getInitDispMaybe ps ps = pmod (Pars [Margin 4,BorderWidth 0, FgColorSpec dispfg, BgColorSpec dispbg, FontSpec (fontSpec defaultFont), Spacer (alignFixedS' aLeft aCenter), Stretchable (False,False), Sizing Dynamic{-,InitSize "",InitDisp ""-}]) displayF :: Graphic g => F g void -- because of monomorphism restriction displayF = displayF' standard displayF' custom = noPF $ displayF'' custom displayF'' :: Graphic g => Customiser (DisplayF g) -> PF (DisplayF g) g void displayF'' pmod = labelDisplayF'' pmod' where pmod' = pmod . --setInitSize "XXXXX" . setBorderWidth 1 . setStretchable (True,False) . setSpacer (hAlignS aLeft) . setSizing Growing labelF lbl = labelF' standard lbl labelF' pm = noPF . labelF'' pm labelF'' :: Graphic g => Customiser (DisplayF g) -> g -> PF (DisplayF g) a b labelF'' pmod lbl = labelDisplayF'' pmod' >=^^< idLeftSP nullSP where pmod' = pmod. setInitDisp lbl. (setFgColor lblfg::(Customiser (DisplayF g))). setBgColor lblbg. setFont labelFont. setMargin 0 . setSizing Static -- cu works around a deficiency in the type inference algorithm. -- cu x y = id x y :: (Customiser (DisplayF a)) intDispF = intDispF' standard intDispF' = noPF . intDispF'' intDispF'' :: Customiser (DisplayF Int) -> PF (DisplayF Int) Int a intDispF'' pm = displayF'' (pm' 0) -- >=^< mapEither id show where pm' x = pm.setAlign aRight .setInitDisp x .setInitSize ((-maxBound) `asTypeOf` x) -- .forgetInitDisp -- should be built into setInitDisp .(setSizing Static::(Customiser (DisplayF Int))) .setStretchable (False,False) dispbg = colorSpec (argKeyList "dispbg" [paperColor,"white"]) dispfg = colorSpec (argKeyList "dispfg" [fgColor,"black"]) lblbg = colorSpec (argKeyList "lblbg" [bgColor,"white"]) lblfg = colorSpec (argKeyList "lblfg" [fgColor,"black"]) {- forgetInitDisp :: DisplayF a -> DisplayF b forgetInitDisp (Pars ps) = Pars (forget ps) where forget ps = case ps of [] -> [] BorderWidth i:ps -> BorderWidth i:forget ps FgColor c:ps -> FgColor c:forget ps BgColor c:ps -> BgColor c:forget ps Font f:ps -> Font f:forget ps Align a:ps -> Align a:forget ps Margin i:ps -> Margin i:forget ps InitDisp x:ps -> forget ps InitSize s:ps -> InitSize s:forget ps Sizing s:ps -> Sizing s:forget ps Stretchable bb:ps -> Stretchable bb:forget ps -} {- instance Functor DisplayF where map f (Pars ps) = Pars (map (mapPars f) ps) where mapPars f p = case p of BorderWidth i -> BorderWidth i FgColor c -> FgColor c BgColor c -> BgColor c Font f -> Font f Align a -> Align a Margin i -> Margin i InitDisp x -> InitDisp (f x) InitSize s -> InitSize s Sizing s -> Sizing s Stretchable bb -> Stretchable bb -}