module LayoutRequest where import Geometry(Point(..), Size(..),Rect(..){-,padd,psub,pmax,pP-}) --import EitherUtils(mapMaybe) --import HO(apFst) --import Maptrace(ctrace) -- debugging import Alignment import ShowFun() data LayoutRequest = Layout { minsize :: Size, fixedh, fixedv :: Bool, wAdj, hAdj :: Int -> Size, -- If the available width is w -- then the size of this box should be wAdj w. -- Analogously for hAdj. refpoints :: [Point], -- used by some placers wantedPos :: Maybe (Point,Size,Alignment) } deriving (Show) plainLayout s fh fv = refpLayout s fh fv [] refpLayout s fh fv rps = Layout s fh fv wa ha rps Nothing where wa w = {-ctrace "wa" (show (w::Int,s)) $-} s ha h = {-ctrace "ha" (show (h::Int,s)) $-} s --wa = if fh then const s else \ w -> pmax s (pP w 0) --ha = if fv then const s else \ h -> pmax s (pP 0 h) data LayoutMessage = LayoutRequest LayoutRequest | LayoutMakeVisible Rect (Maybe Alignment,Maybe Alignment) | LayoutScrollStep Int | LayoutName String | LayoutPlacer Placer | LayoutSpacer Spacer | LayoutHint LayoutHint | LayoutDoNow | LayoutDestroy | LayoutReplaceSpacer Spacer -- for use by dynSpacerF | LayoutReplacePlacer Placer -- for use by dynPlacerF deriving (Show) data LayoutResponse = LayoutPlace Rect | LayoutSize Size | LayoutPos Point -- Position in parent window. Occationally useful. deriving Show layoutMakeVisible r = LayoutMakeVisible r (Nothing,Nothing) newtype Placer = P Placer1 deriving (Show) type Placer1 = ([LayoutRequest] -> Placer2) type Placer2 = (LayoutRequest, Rect -> [Rect]) unP (P p) = p newtype Spacer = S Spacer1 deriving (Show) type Spacer1 = (LayoutRequest -> Spacer2) type Spacer2 = (LayoutRequest, Rect -> Rect) unS (S s) = s type LayoutHint = String -- ?? --mapLayoutSize f req@(Layout {minsize=s}) = req{minsize=f s} mapLayoutSize f = mapAdjLayoutSize f id id mapAdjLayoutSize f wf hf req@(Layout {minsize=s,wAdj=wa,hAdj=ha}) = req{minsize=f s, wAdj=f.wa.wf, hAdj=f.ha.hf} mapLayoutRefs f req@(Layout{refpoints=rps}) = req{refpoints=map f rps} flipReq (Layout p fh fv wa ha rps wanted) = Layout (flipPoint p) fv fh (flipPoint . ha) (flipPoint . wa) (map flipPoint rps) (fmap flipWanted wanted) flipWanted (p,s,a) = (flipPoint p,flipPoint s,a) flipRect (Rect p s) = Rect (flipPoint p) (flipPoint s) flipPoint (Point x y) = Point y x