@@ -21,12 +21,12 @@ import Control.Monad.Reader hiding (mapM, mapM_, forM, forM_, sequence, sequence
2121import Control.Monad.State hiding (state, mapM, mapM_, forM, forM_, sequence, sequence_)
2222import GHCJS.DOM.Node
2323import GHCJS.DOM.UIEvent
24−import GHCJS.DOM.EventM (event, EventM, stopPropagation)
24+import GHCJS.DOM.EventM (on, event, EventM, stopPropagation)
2525import GHCJS.DOM.Document
26−import GHCJS.DOM.Element
27−import GHCJS.DOM.HTMLElement
28−import GHCJS.DOM.Types hiding (Widget (..), unWidget, Event)
29−import GHCJS.DOM.NamedNodeMap
26+import GHCJS.DOM.Element as E
27+import GHCJS.DOM.Types hiding (Event)
28+import qualified GHCJS.DOM.Types as DOM (Event)
29+import GHCJS.DOM.NamedNodeMap as NNM
3030import Control.Lens hiding (element, children)
3131import Data.These
3232import Data.Align
@@ -60,27 +60,27 @@ class Attributes m a where
6060 addAttributes :: IsElement e => a -> e -> m ()
6161
6262instance MonadIO m => Attributes m AttributeMap where
63− addAttributes curAttrs e = liftIO $ imapM_ (elementSetAttribute e) curAttrs
63+ addAttributes curAttrs e = imapM_ (setAttribute e) curAttrs
6464
6565instance MonadWidget t m => Attributes m (Dynamic t AttributeMap) where
6666 addAttributes attrs e = do
6767 schedulePostBuild $ do
6868 curAttrs <- sample $ current attrs
69− liftIO $ imapM_ (elementSetAttribute e) curAttrs
69+ imapM_ (setAttribute e) curAttrs
7070 addVoidAction $ flip fmap (updated attrs) $ \newAttrs -> liftIO $ do
71− oldAttrs <- maybe (return Set.empty) namedNodeMapGetNames =<< elementGetAttributes e
72− forM_ (Set.toList $ oldAttrs `Set.difference` Map.keysSet newAttrs) $ elementRemoveAttribute e
73− imapM_ (elementSetAttribute e) newAttrs --TODO: avoid re-setting unchanged attributes; possibly do the compare using Align in haskell
71+ oldAttrs <- maybe (return Set.empty) namedNodeMapGetNames =<< getAttributes e
72+ forM_ (Set.toList $ oldAttrs `Set.difference` Map.keysSet newAttrs) $ removeAttribute e
73+ imapM_ (setAttribute e) newAttrs --TODO: avoid re-setting unchanged attributes; possibly do the compare using Align in haskell
7474
7575buildEmptyElementNS :: (MonadWidget t m, Attributes m attrs) => Maybe String -> String -> attrs -> m Element
7676buildEmptyElementNS mns elementTag attrs = do
7777 doc <- askDocument
7878 p <- askParent
7979 Just e <- liftIO $ case mns of
80− Nothing -> documentCreateElement doc elementTag
81− Just ns -> documentCreateElementNS doc ns elementTag
80+ Nothing -> createElement doc (Just elementTag)
81+ Just ns -> createElementNS doc (Just ns) (Just elementTag)
8282 addAttributes attrs e
83− _ <- liftIO $ nodeAppendChild p $ Just e
83+ _ <- appendChild p $ Just e
8484 return $ castToElement e
8585
8686buildEmptyElement :: (MonadWidget t m, Attributes m attrs) => String -> attrs -> m Element
@@ -96,13 +96,13 @@ buildElementNS mns elementTag attrs child = do
9696buildElement :: (MonadWidget t m, Attributes m attrs) => String -> attrs -> m a -> m (Element, a)
9797buildElement = buildElementNS Nothing
9898
99−namedNodeMapGetNames :: IsNamedNodeMap self => self -> IO (Set String)
99+namedNodeMapGetNames :: NamedNodeMap -> IO (Set String)
100100namedNodeMapGetNames self = do
101− l <- namedNodeMapGetLength self
101+ l <- NNM.getLength self
102102 let locations = if l == 0 then [] else [0..l-1] -- Can't use 0..l-1 if l is 0 because l is unsigned and will wrap around
103− liftM Set.fromList $ forM locations $ \i -> do
104− Just n <- namedNodeMapItem self i
105− nodeGetNodeName n
103+ liftM (Set.fromList . catMaybes) $ forM locations $ \i -> do
104+ Just n <- NNM.item self i
105+ getNodeName n
106106
107107text :: MonadWidget t m => String -> m ()
108108text = void . text'
@@ -112,8 +112,8 @@ text' :: MonadWidget t m => String -> m Text
112112text' s = do
113113 doc <- askDocument
114114 p <- askParent
115− Just n <- liftIO $ documentCreateTextNode doc s
116− _ <- liftIO $ nodeAppendChild p $ Just n
115+ Just n <- createTextNode doc s
116+ _ <- appendChild p $ Just n
117117 return n
118118
119119dynText :: MonadWidget t m => Dynamic t String -> m ()
@@ -121,8 +121,8 @@ dynText s = do
121121 n <- text' ""
122122 schedulePostBuild $ do
123123 curS <- sample $ current s
124− liftIO $ nodeSetNodeValue n curS
125− addVoidAction $ fmap (liftIO . nodeSetNodeValue n) $ updated s
124+ setNodeValue n $ Just curS
125+ addVoidAction $ fmap (setNodeValue n . Just) $ updated s
126126
127127display :: (MonadWidget t m, Show a) => Dynamic t a -> m ()
128128display a = dynText =<< mapDyn show a
@@ -159,12 +159,12 @@ widgetHoldInternal child0 newChild = do
159159 doc <- askDocument
160160 runWidget <- getRunWidget
161161 let build c = do
162− Just df <- liftIO $ documentCreateDocumentFragment doc
162+ Just df <- createDocumentFragment doc
163163 (result, postBuild, voidActions) <- runWidget df c
164164 scheduleFollowup newChildBuiltTriggerRef (result, voidActions)
165165 postBuild
166− mp' <- liftIO $ nodeGetParentNode endPlaceholder
167− forM_ mp' $ \p' -> liftIO $ nodeInsertBefore p' (Just df) (Just endPlaceholder)
166+ mp' <- getParentNode endPlaceholder
167+ forM_ mp' $ \p' -> insertBefore p' (Just df) (Just endPlaceholder)
168168 return ()
169169 addVoidAction $ ffor newChild $ \c -> do
170170 liftIO $ deleteBetweenExclusive startPlaceholder endPlaceholder
@@ -209,7 +209,7 @@ listWithKeyShallowDiff initialVals valsChanged mkChild = do
209209 Nothing -> Just Nothing -- Even if we let a Nothing through when the element doesn't already exist, this doesn't cause a problem because it is ignored
210210 Just _ -> Nothing -- We don't want to let spurious re-creations of items through
211211 listHoldWithKey initialVals (attachWith (flip (Map.differenceWith relevantDiff)) (current sentVals) valsChanged) $ \k v ->
212− mkChild k v $ select childValChangedSelector $ Const2 k
212+ mkChild k v $ Reflex.select childValChangedSelector $ Const2 k
213213
214214-- | Display the given map of items using the builder function provided, and update it with the given event. 'Nothing' entries will delete the corresponding children, and 'Just' entries will create or replace them. Since child events do not take any signal arguments, they are always rebuilt. To update a child without rebuilding, either embed signals in the map's values, or refer to them directly in the builder function.
215215listHoldWithKey :: (Ord k, MonadWidget t m) => Map k v -> Event t (Map k (Maybe v)) -> (k -> v -> m a) -> m (Dynamic t (Map k a))
@@ -224,13 +224,13 @@ listHoldWithKey initialVals valsChanged mkChild = do
224224 result <- mkChild k v
225225 childEnd <- text' ""
226226 return (result, (childStart, childEnd))
227− Just dfOrig <- liftIO $ documentCreateDocumentFragment doc
227+ Just dfOrig <- createDocumentFragment doc
228228 initialState <- iforM initialVals $ \k v -> subWidgetWithVoidActions (toNode dfOrig) $ wrapChild k v --Note: we have to use subWidgetWithVoidActions rather than runWidget here, because running post-build actions during build can cause not-yet-constructed values to be read
229229 stateRef <- liftIO $ newIORef initialState
230230 children <- holdDyn initialState newChildren
231231 tellWidgetOutput =<< mapDyn (fmap snd) children
232− mpOrig <- liftIO $ nodeGetParentNode endPlaceholder
233− forM_ mpOrig $ \pOrig -> liftIO $ nodeInsertBefore pOrig (Just dfOrig) (Just endPlaceholder)
232+ mpOrig <- getParentNode endPlaceholder
233+ forM_ mpOrig $ \pOrig -> insertBefore pOrig (Just dfOrig) (Just endPlaceholder)
234234 addVoidAction $ flip fmap valsChanged $ \newVals -> do
235235 curState <- liftIO $ readIORef stateRef
236236 --TODO: Should we remove the parent from the DOM first to avoid reflows?
@@ -240,24 +240,24 @@ listHoldWithKey initialVals valsChanged mkChild = do
240240 return Nothing
241241 These ((_, (start, end)), _) (Just v) -> do -- Replacing existing child
242242 liftIO $ deleteBetweenExclusive start end
243− Just df <- liftIO $ documentCreateDocumentFragment doc
243+ Just df <- createDocumentFragment doc
244244 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
245245 let s = (childResult, childVoidAction)
246246 modify (>>childPostBuild)
247− mp <- liftIO $ nodeGetParentNode end
248− forM_ mp $ \p -> liftIO $ nodeInsertBefore p (Just df) (Just end)
247+ mp <- getParentNode end
248+ forM_ mp $ \p -> insertBefore p (Just df) (Just end)
249249 return $ Just s
250250 That Nothing -> return Nothing -- Deleting non-existent child
251251 That (Just v) -> do -- Creating new child
252− Just df <- liftIO $ documentCreateDocumentFragment doc
252+ Just df <- createDocumentFragment doc
253253 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
254254 let s = (childResult, childVoidAction)
255255 modify (>>childPostBuild)
256256 let placeholder = case Map.lookupGT k curState of
257257 Nothing -> endPlaceholder
258258 Just (_, ((_, (start, _)), _)) -> start
259− mp <- liftIO $ nodeGetParentNode placeholder
260− forM_ mp $ \p -> liftIO $ nodeInsertBefore p (Just df) (Just placeholder)
259+ mp <- getParentNode placeholder
260+ forM_ mp $ \p -> insertBefore p (Just df) (Just placeholder)
261261 return $ Just s
262262 This state -> do -- No change
263263 return $ Just state
@@ -303,47 +303,56 @@ selectViewListWithKey_ selection vals mkChild = liftM (fmap fst) $ selectViewLis
303303-- | s and e must both be children of the same node and s must precede e
304304deleteBetweenExclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
305305deleteBetweenExclusive s e = do
306− mCurrentParent <- nodeGetParentNode e -- May be different than it was at initial construction, e.g., because the parent may have dumped us in from a DocumentFragment
306+ mCurrentParent <- getParentNode e -- May be different than it was at initial construction, e.g., because the parent may have dumped us in from a DocumentFragment
307307 case mCurrentParent of
308308 Nothing -> return () --TODO: Is this the right behavior?
309309 Just currentParent -> do
310310 let go = do
311− Just x <- nodeGetPreviousSibling e -- This can't be Nothing because we should hit 's' first
311+ Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
312312 when (toNode s /= toNode x) $ do
313− _ <- nodeRemoveChild currentParent $ Just x
313+ _ <- removeChild currentParent $ Just x
314314 go
315315 go
316316
317317-- | s and e must both be children of the same node and s must precede e
318318deleteBetweenInclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
319319deleteBetweenInclusive s e = do
320− mCurrentParent <- nodeGetParentNode e -- May be different than it was at initial construction, e.g., because the parent may have dumped us in from a DocumentFragment
320+ mCurrentParent <- getParentNode e -- May be different than it was at initial construction, e.g., because the parent may have dumped us in from a DocumentFragment
321321 case mCurrentParent of
322322 Nothing -> return () --TODO: Is this the right behavior?
323323 Just currentParent -> do
324324 let go = do
325− Just x <- nodeGetPreviousSibling e -- This can't be Nothing because we should hit 's' first
326− _ <- nodeRemoveChild currentParent $ Just x
325+ Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
326+ _ <- removeChild currentParent $ Just x
327327 when (toNode s /= toNode x) go
328328 go
329− _ <- nodeRemoveChild currentParent $ Just e
329+ _ <- removeChild currentParent $ Just e
330330 return ()
331331
332+nodeClear :: IsNode self => self -> IO ()
333+nodeClear n = do
334+ mfc <- getFirstChild n
335+ case mfc of
336+ Nothing -> return ()
337+ Just fc -> do
338+ _ <- removeChild n $ Just fc
339+ nodeClear n
340+
332341--------------------------------------------------------------------------------
333342-- Adapters
334343--------------------------------------------------------------------------------
335344
336−wrapDomEvent :: (Functor (Event t), MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => e -> (e -> EventM event e () -> IO (IO ())) -> EventM event e a -> m (Event t a)
345+wrapDomEvent :: (Functor (Event t), MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => e -> (e -> EventM e event () -> IO (IO ())) -> EventM e event a -> m (Event t a)
337346wrapDomEvent element elementOnevent getValue = wrapDomEventMaybe element elementOnevent $ liftM Just getValue
338347
339−wrapDomEventMaybe :: (Functor (Event t), MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => e -> (e -> EventM event e () -> IO (IO ())) -> EventM event e (Maybe a) -> m (Event t a)
348+wrapDomEventMaybe :: (Functor (Event t), MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => e -> (e -> EventM e event () -> IO (IO ())) -> EventM e event (Maybe a) -> m (Event t a)
340349wrapDomEventMaybe element elementOnevent getValue = do
341350 postGui <- askPostGui
342351 runWithActions <- askRunWithActions
343352 e <- newEventWithTrigger $ \et -> do
344353 unsubscribe <- {-# SCC "a" #-} liftIO $ {-# SCC "b" #-} elementOnevent element $ {-# SCC "c" #-} do
345354 mv <- {-# SCC "d" #-} getValue
346− forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> v]
355+ forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> Identity v]
347356 return $ liftIO $ do
348357 {-# SCC "e" #-} unsubscribe
349358 return $! {-# SCC "f" #-} e
@@ -377,11 +386,11 @@ data EventTag
377386 | MouseoutTag
378387 | MouseoverTag
379388 | MouseupTag
380−-- | MousewheelTag -- webkitgtk only provides elementOnmousewheel (not elementOnwheel), but firefox does not support the mousewheel event; we should provide wheel (the equivalent, standard event), but we will need to make sure webkitgtk supports it first
389+ | MousewheelTag
381390 | ScrollTag
382391 | SelectTag
383392 | SubmitTag
384−-- | WheelTag -- See MousewheelTag
393+ | WheelTag
385394 | BeforecutTag
386395 | CutTag
387396 | BeforecopyTag
@@ -425,11 +434,11 @@ data EventName :: EventTag -> * where
425434 Mouseout :: EventName 'MouseoutTag
426435 Mouseover :: EventName 'MouseoverTag
427436 Mouseup :: EventName 'MouseupTag
428− --Mousewheel :: EventName 'MousewheelTag
437+ Mousewheel :: EventName 'MousewheelTag
429438 Scroll :: EventName 'ScrollTag
430439 Select :: EventName 'SelectTag
431440 Submit :: EventName 'SubmitTag
432− --Wheel :: EventName 'WheelTag
441+ Wheel :: EventName 'WheelTag
433442 Beforecut :: EventName 'BeforecutTag
434443 Cut :: EventName 'CutTag
435444 Beforecopy :: EventName 'BeforecopyTag
@@ -446,8 +455,8 @@ data EventName :: EventTag -> * where
446455
447456type family EventType en where
448457 EventType 'AbortTag = UIEvent
449− EventType 'BlurTag = UIEvent
450− EventType 'ChangeTag = UIEvent
458+ EventType 'BlurTag = FocusEvent
459+ EventType 'ChangeTag = DOM.Event
451460 EventType 'ClickTag = MouseEvent
452461 EventType 'ContextmenuTag = MouseEvent
453462 EventType 'DblclickTag = MouseEvent
@@ -459,87 +468,87 @@ type family EventType en where
459468 EventType 'DragstartTag = MouseEvent
460469 EventType 'DropTag = MouseEvent
461470 EventType 'ErrorTag = UIEvent
462− EventType 'FocusTag = UIEvent
463− EventType 'InputTag = UIEvent
464− EventType 'InvalidTag = UIEvent
465− EventType 'KeydownTag = UIEvent
466− EventType 'KeypressTag = UIEvent
467− EventType 'KeyupTag = UIEvent
471+ EventType 'FocusTag = FocusEvent
472+ EventType 'InputTag = DOM.Event
473+ EventType 'InvalidTag = DOM.Event
474+ EventType 'KeydownTag = KeyboardEvent
475+ EventType 'KeypressTag = KeyboardEvent
476+ EventType 'KeyupTag = KeyboardEvent
468477 EventType 'LoadTag = UIEvent
469478 EventType 'MousedownTag = MouseEvent
470− EventType 'MouseenterTag = UIEvent
471− EventType 'MouseleaveTag = UIEvent
479+ EventType 'MouseenterTag = MouseEvent
480+ EventType 'MouseleaveTag = MouseEvent
472481 EventType 'MousemoveTag = MouseEvent
473482 EventType 'MouseoutTag = MouseEvent
474483 EventType 'MouseoverTag = MouseEvent
475484 EventType 'MouseupTag = MouseEvent
476− --EventType 'MousewheelTag = MouseEvent
485+ EventType 'MousewheelTag = MouseEvent
477486 EventType 'ScrollTag = UIEvent
478487 EventType 'SelectTag = UIEvent
479− EventType 'SubmitTag = UIEvent
480− --EventType 'WheelTag = UIEvent
481− EventType 'BeforecutTag = UIEvent
482− EventType 'CutTag = UIEvent
483− EventType 'BeforecopyTag = UIEvent
484− EventType 'CopyTag = UIEvent
485− EventType 'BeforepasteTag = UIEvent
486− EventType 'PasteTag = UIEvent
487− EventType 'ResetTag = UIEvent
488− EventType 'SearchTag = UIEvent
489− EventType 'SelectstartTag = UIEvent
490− EventType 'TouchstartTag = UIEvent
491− EventType 'TouchmoveTag = UIEvent
492− EventType 'TouchendTag = UIEvent
493− EventType 'TouchcancelTag = UIEvent
494−
495−onEventName :: IsElement e => EventName en -> e -> EventM (EventType en) e () -> IO (IO ())
496−onEventName en = case en of
497− Abort -> elementOnabort
498− Blur -> elementOnblur
499− Change -> elementOnchange
500− Click -> elementOnclick
501− Contextmenu -> elementOncontextmenu
502− Dblclick -> elementOndblclick
503− Drag -> elementOndrag
504− Dragend -> elementOndragend
505− Dragenter -> elementOndragenter
506− Dragleave -> elementOndragleave
507− Dragover -> elementOndragover
508− Dragstart -> elementOndragstart
509− Drop -> elementOndrop
510− Error -> elementOnerror
511− Focus -> elementOnfocus
512− Input -> elementOninput
513− Invalid -> elementOninvalid
514− Keydown -> elementOnkeydown
515− Keypress -> elementOnkeypress
516− Keyup -> elementOnkeyup
517− Load -> elementOnload
518− Mousedown -> elementOnmousedown
519− Mouseenter -> elementOnmouseenter
520− Mouseleave -> elementOnmouseleave
521− Mousemove -> elementOnmousemove
522− Mouseout -> elementOnmouseout
523− Mouseover -> elementOnmouseover
524− Mouseup -> elementOnmouseup
525− --Mousewheel -> elementOnmousewheel
526− Scroll -> elementOnscroll
527− Select -> elementOnselect
528− Submit -> elementOnsubmit
529− --Wheel -> elementOnwheel
530− Beforecut -> elementOnbeforecut
531− Cut -> elementOncut
532− Beforecopy -> elementOnbeforecopy
533− Copy -> elementOncopy
534− Beforepaste -> elementOnbeforepaste
535− Paste -> elementOnpaste
536− Reset -> elementOnreset
537− Search -> elementOnsearch
538− Selectstart -> elementOnselectstart
539− Touchstart -> elementOntouchstart
540− Touchmove -> elementOntouchmove
541− Touchend -> elementOntouchend
542− Touchcancel -> elementOntouchcancel
488+ EventType 'SubmitTag = DOM.Event
489+ EventType 'WheelTag = WheelEvent
490+ EventType 'BeforecutTag = DOM.Event
491+ EventType 'CutTag = DOM.Event
492+ EventType 'BeforecopyTag = DOM.Event
493+ EventType 'CopyTag = DOM.Event
494+ EventType 'BeforepasteTag = DOM.Event
495+ EventType 'PasteTag = DOM.Event
496+ EventType 'ResetTag = DOM.Event
497+ EventType 'SearchTag = DOM.Event
498+ EventType 'SelectstartTag = DOM.Event
499+ EventType 'TouchstartTag = TouchEvent
500+ EventType 'TouchmoveTag = TouchEvent
501+ EventType 'TouchendTag = TouchEvent
502+ EventType 'TouchcancelTag = TouchEvent
503+
504+onEventName :: IsElement e => EventName en -> e -> EventM e (EventType en) () -> IO (IO ())
505+onEventName en e = case en of
506+ Abort -> on e E.abort
507+ Blur -> on e E.blurEvent
508+ Change -> on e E.change
509+ Click -> on e E.click
510+ Contextmenu -> on e E.contextMenu
511+ Dblclick -> on e E.dblClick
512+ Drag -> on e E.drag
513+ Dragend -> on e E.dragEnd
514+ Dragenter -> on e E.dragEnter
515+ Dragleave -> on e E.dragLeave
516+ Dragover -> on e E.dragOver
517+ Dragstart -> on e E.dragStart
518+ Drop -> on e E.drop
519+ Error -> on e E.error
520+ Focus -> on e E.focusEvent
521+ Input -> on e E.input
522+ Invalid -> on e E.invalid
523+ Keydown -> on e E.keyDown
524+ Keypress -> on e E.keyPress
525+ Keyup -> on e E.keyUp
526+ Load -> on e E.load
527+ Mousedown -> on e E.mouseDown
528+ Mouseenter -> on e E.mouseEnter
529+ Mouseleave -> on e E.mouseLeave
530+ Mousemove -> on e E.mouseMove
531+ Mouseout -> on e E.mouseOut
532+ Mouseover -> on e E.mouseOver
533+ Mouseup -> on e E.mouseUp
534+ Mousewheel -> on e E.mouseWheel
535+ Scroll -> on e E.scroll
536+ Select -> on e E.select
537+ Submit -> on e E.submit
538+ Wheel -> on e E.wheel
539+ Beforecut -> on e E.beforeCut
540+ Cut -> on e E.cut
541+ Beforecopy -> on e E.beforeCopy
542+ Copy -> on e E.copy
543+ Beforepaste -> on e E.beforePaste
544+ Paste -> on e E.paste
545+ Reset -> on e E.reset
546+ Search -> on e E.search
547+ Selectstart -> on e E.selectStart
548+ Touchstart -> on e E.touchStart
549+ Touchmove -> on e E.touchMove
550+ Touchend -> on e E.touchEnd
551+ Touchcancel -> on e E.touchCancel
543552
544553newtype EventResult en = EventResult { unEventResult :: EventResultType en }
545554
@@ -588,42 +597,43 @@ type family EventResultType (en :: EventTag) :: * where
588597 EventResultType 'TouchmoveTag = ()
589598 EventResultType 'TouchendTag = ()
590599 EventResultType 'TouchcancelTag = ()
600+ EventResultType 'MousewheelTag = ()
601+ EventResultType 'WheelTag = ()
591602
592−wrapDomEventsMaybe :: (Functor (Event t), IsElement e, MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => e -> (forall en. EventName en -> EventM (EventType en) e (Maybe (f en))) -> m (EventSelector t (WrapArg f EventName))
603+wrapDomEventsMaybe :: (Functor (Event t), IsElement e, MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => e -> (forall en. EventName en -> EventM e (EventType en) (Maybe (f en))) -> m (EventSelector t (WrapArg f EventName))
593604wrapDomEventsMaybe element handlers = do
594605 postGui <- askPostGui
595606 runWithActions <- askRunWithActions
596607 e <- newFanEventWithTrigger $ \(WrapArg en) et -> do
597− unsubscribe <- liftIO $ (onEventName en) element $ do
608+ unsubscribe <- onEventName en element $ do
598609 mv <- handlers en
599− forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> v]
610+ forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> Identity v]
600611 return $ liftIO $ do
601612 unsubscribe
602613 return $! e
603614
604−getKeyEvent :: EventM UIEvent e Int
615+getKeyEvent :: EventM e KeyboardEvent Int
605616getKeyEvent = do
606617 e <- event
607− liftIO $ do
608− which <- uiEventGetWhich e
609− if which /= 0 then return which else do
610− charCode <- uiEventGetCharCode e
611− if charCode /= 0 then return charCode else
612− uiEventGetKeyCode e
613−
614−getMouseEventCoords :: EventM MouseEvent e (Int, Int)
618+ which <- getWhich e
619+ if which /= 0 then return which else do
620+ charCode <- getCharCode e
621+ if charCode /= 0 then return charCode else
622+ getKeyCode e
623+
624+getMouseEventCoords :: EventM e MouseEvent (Int, Int)
615625getMouseEventCoords = do
616626 e <- event
617− liftIO $ bisequence (mouseEventGetClientX e, mouseEventGetClientY e)
627+ bisequence (getX e, getY e)
618628
619−defaultDomEventHandler :: IsElement e => e -> EventName en -> EventM (EventType en) e (Maybe (EventResult en))
629+defaultDomEventHandler :: IsElement e => e -> EventName en -> EventM e (EventType en) (Maybe (EventResult en))
620630defaultDomEventHandler e evt = liftM (Just . EventResult) $ case evt of
621631 Click -> return ()
622632 Dblclick -> return ()
623633 Keypress -> getKeyEvent
634+ Scroll -> getScrollTop e
624635 Keydown -> getKeyEvent
625636 Keyup -> getKeyEvent
626− Scroll -> liftIO $ elementGetScrollTop e
627637 Mousemove -> getMouseEventCoords
628638 Mouseup -> getMouseEventCoords
629639 Mousedown -> getMouseEventCoords
@@ -662,8 +672,10 @@ defaultDomEventHandler e evt = liftM (Just . EventResult) $ case evt of
662672 Touchmove -> return ()
663673 Touchend -> return ()
664674 Touchcancel -> return ()
675+ Mousewheel -> return ()
676+ Wheel -> return ()
665677
666−wrapElement :: forall t h m. (Functor (Event t), MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => (forall en. Element -> EventName en -> EventM (EventType en) Element (Maybe (EventResult en))) -> Element -> m (El t)
678+wrapElement :: forall t h m. (Functor (Event t), MonadIO m, MonadSample t m, MonadReflexCreateTrigger t m, Reflex t, HasPostGui t h m) => (forall en. Element -> EventName en -> EventM Element (EventType en) (Maybe (EventResult en))) -> Element -> m (El t)
667679wrapElement eh e = do
668680 es <- wrapDomEventsMaybe e $ eh e
669681 return $ El e es
@@ -748,17 +760,15 @@ simpleList xs mkChild = mapDyn (map snd . Map.toList) =<< flip list mkChild =<<
748760elDynHtml' :: MonadWidget t m => String -> Dynamic t String -> m (El t)
749761elDynHtml' elementTag html = do
750762 e <- buildEmptyElement elementTag (Map.empty :: Map String String)
751− let h = castToHTMLElement e
752− schedulePostBuild $ liftIO . htmlElementSetInnerHTML h =<< sample (current html)
753− addVoidAction $ fmap (liftIO . htmlElementSetInnerHTML h) $ updated html
763+ schedulePostBuild $ setInnerHTML e . Just =<< sample (current html)
764+ addVoidAction $ fmap (setInnerHTML e . Just) $ updated html
754765 wrapElement defaultDomEventHandler e
755766
756767elDynHtmlAttr' :: MonadWidget t m => String -> Map String String -> Dynamic t String -> m (El t)
757768elDynHtmlAttr' elementTag attrs html = do
758769 e <- buildEmptyElement elementTag attrs
759− let h = castToHTMLElement e
760− schedulePostBuild $ liftIO . htmlElementSetInnerHTML h =<< sample (current html)
761− addVoidAction $ fmap (liftIO . htmlElementSetInnerHTML h) $ updated html
770+ schedulePostBuild $ setInnerHTML e . Just =<< sample (current html)
771+ addVoidAction $ fmap (setInnerHTML e . Just) $ updated html
762772 wrapElement defaultDomEventHandler e
763773
764774data Link t
@@ -783,7 +793,7 @@ class HasDomEvent t a where
783793 domEvent :: EventName en -> a -> Event t (EventResultType en)
784794
785795instance Reflex t => HasDomEvent t (El t) where
786− domEvent en e = fmap unEventResult $ select (_el_events e) (WrapArg en)
796+ domEvent en e = fmap unEventResult $ Reflex.select (_el_events e) (WrapArg en)
787797
788798linkClass :: MonadWidget t m => String -> String -> m (Link t)
789799linkClass s c = do
@@ -871,7 +881,7 @@ tabDisplay ulClass activeClass tabItems = do
871881unsafePlaceElement :: MonadWidget t m => Element -> m (El t)
872882unsafePlaceElement e = do
873883 p <- askParent
874− _ <- liftIO $ nodeAppendChild p $ Just e
884+ _ <- appendChild p $ Just e
875885 wrapElement defaultDomEventHandler e
876886
877887deriveGEq ''EventName