HelpBubbleF

module HelpBubbleF(helpBubbleF) where
import AllFudgets

data BubbleState = Idle | Armed | Up

helpBubbleF help fud =
    if useBubbles
    then loopCompThroughLeftF $
         groupF startcmds ctrlK0 ((timerF>+<bubbleF) >+< fud)
    else fud
 where
   bubbleF = bubbleRootPopupF (labelF' lblpm help)
   lblpm = setBgColor "white" . setFont helpFont
   eventmask = [EnterWindowMask,LeaveWindowMask]
   startcmds = [XCmd $ ChangeWindowAttributes [CWEventMask eventmask],
                XCmd $ ConfigureWindow [CWBorderWidth 0]]

   ctrlK0 = ctrlK 0 0 Idle

   toTimer = High . Left
   toBubble = High . Right

   ctrlK size pos bubbleState =
      getK $ message event (either fromTimer fromBubble)
     where
       same = ctrlK size pos bubbleState
       idle = ctrlK size pos Idle
       newSize size' = ctrlK size' pos bubbleState
       timerOff s = putK (toTimer Nothing) $ ctrlK size pos s
       timerOn pos' = putK (toTimer (Just (0,500))) $ ctrlK size pos' Armed

       fromBubble _ = same

       fromTimer Tick =
         case bubbleState of
	   Armed ->
	       putK (toBubble (Popup (pos+offset) ())) $
	       timerOff Up
	     where offset = pP (xcoord size `div` 2) 3
	   _ -> same
       event e =
         --echoK (show e) $
         case e of
	   XEvt EnterNotify { pos=pos,rootPos=rootPos } -> timerOn (rootPos-pos)

	   XEvt LeaveNotify { } ->
	     case bubbleState of
	       Idle -> same
	       Armed -> timerOff Idle
	       Up -> putK (toBubble Popdown) $ idle

	   LEvt (LayoutSize size') -> newSize size'
	   _ -> same

useBubbles = argFlag "helpbubbles" True
helpFont = argKey "helpfont" "-*-new century schoolbook-medium-r-*-*-12-*-*-*-*-*-iso8859-1"