module BubbleF(bubbleF, bubblePopupF, bubbleRootPopupF) where
--import Alignment(Alignment(..))
import Command
import XDraw
import CompOps((>=^<), (>^=<))
import Dlayout(groupF)
import Event
import Fudget(F)
--import FudgetIO
import FRequest
import NullF()
import Gc
import Geometry(origin,pP,Point(..),psub,padd)
import LayoutRequest(LayoutResponse(..))
import Message(Message(..))
import PopupGroupF
--import Popupmsg
import Spacer(sepF)
import ShapeK
import MapstateK
import EitherUtils(stripEither)
import Xtypes
default(Int) -- mostly for Hugs
f =
popupGroupF (bubbleOffset, wattrs, bubbleShapeK) (bubbleF f)
f =
rootPopupF (bubbleOffset, rwattrs, bubbleShapeK) (bubbleF f)
bubbleF :: (F a b) -> F a b
bubbleF f =
let startcmds = [XCmd $ ChangeWindowAttributes wattrs]
in stripEither >^=<
groupF startcmds bubbleShapeK (sepF sep f) >=^< Right
wattrs = [CWEventMask [ExposureMask]]
rwattrs = CWOverrideRedirect True:wattrs
bubbleShapeK =
wCreateGC rootGC [GCLineWidth 2] $
shapeK fillBubble . bubbleK
bubbleK gc =
let bubbleT state@size msg =
case msg of
Low (LEvt (LayoutSize size')) -> (size', [])
Low (XEvt (Expose _ 0)) ->
(state, if size == origin
then []
else [Low $ wDraw gc (drawBubble (size-1))])
_ -> (state, [])
in mapstateK bubbleT origin
drawBubble size = DrawLines CoordModeOrigin (bubblePoints size)
fillBubble size = [FillPolygon Convex CoordModeOrigin (bubblePoints size)]
c = 4
ah = 12
ax = 12
aw = 6
atx = 6
bubbleBorder = ah + c
sep = pP (2 * c) (2 * c + bubbleBorder)
bubbleOffset (Point _ h) = Point atx (h - c)
bubblePoints size =
let Point w h = psub size (pP 0 (2 * bubbleBorder))
in map (padd (pP 0 bubbleBorder))
[pP c 0,
pP (w - c) 0,
pP w c,
pP w (h - c),
pP (w - c) h,
pP (ax + aw) h,
pP atx (h + ah),
pP ax h,
pP c h,
pP 0 (h - c),
pP 0 c,
pP c 0]
--drawlines (p1 : p2 : ps) = DrawLine (Line p1 p2) : drawlines (p2 : ps)
--drawlines _ = []