@@ -21,12 +21,12 @@ import Control.Monad.Reader hiding (mapM, mapM_, forM, forM_, sequence, sequence
21import Control.Monad.State hiding (state, mapM, mapM_, forM, forM_, sequence, sequence_)
21import Control.Monad.State hiding (state, mapM, mapM_, forM, forM_, sequence, sequence_)
22import GHCJS.DOM.Node
22import GHCJS.DOM.Node
23import GHCJS.DOM.UIEvent
23import GHCJS.DOM.UIEvent
24−import GHCJS.DOM.EventM (event, EventM, stopPropagation)
24+import GHCJS.DOM.EventM (on, event, EventM, stopPropagation)
25import GHCJS.DOM.Document
25import GHCJS.DOM.Document
26−import GHCJS.DOM.Element
26+import GHCJS.DOM.Element as E
27−import GHCJS.DOM.HTMLElement
28−import GHCJS.DOM.Types hiding (Widget (..), unWidget, Event)
27+import GHCJS.DOM.Types hiding (Event)
28+import qualified GHCJS.DOM.Types as DOM (Event)
29−import GHCJS.DOM.NamedNodeMap
29+import GHCJS.DOM.NamedNodeMap as NNM
30import Control.Lens hiding (element, children)
30import Control.Lens hiding (element, children)
31import Data.These
31import Data.These
32import Data.Align
32import Data.Align
@@ -60,27 +60,27 @@ class Attributes m a where
60 addAttributes :: IsElement e => a -> e -> m ()
60 addAttributes :: IsElement e => a -> e -> m ()
62instance MonadIO m => Attributes m AttributeMap where
62instance MonadIO m => Attributes m AttributeMap where
63− addAttributes curAttrs e = liftIO $ imapM_ (elementSetAttribute e) curAttrs
63+ addAttributes curAttrs e = imapM_ (setAttribute e) curAttrs
65instance MonadWidget t m => Attributes m (Dynamic t AttributeMap) where
65instance MonadWidget t m => Attributes m (Dynamic t AttributeMap) where
66 addAttributes attrs e = do
66 addAttributes attrs e = do
67 schedulePostBuild $ do
67 schedulePostBuild $ do
68 curAttrs <- sample $ current attrs
68 curAttrs <- sample $ current attrs
69− liftIO $ imapM_ (elementSetAttribute e) curAttrs
69+ imapM_ (setAttribute e) curAttrs
70 addVoidAction $ flip fmap (updated attrs) $ \newAttrs -> liftIO $ do
70 addVoidAction $ flip fmap (updated attrs) $ \newAttrs -> liftIO $ do
71− oldAttrs <- maybe (return Set.empty) namedNodeMapGetNames =<< elementGetAttributes e
71+ oldAttrs <- maybe (return Set.empty) namedNodeMapGetNames =<< getAttributes e
72− forM_ (Set.toList $ oldAttrs `Set.difference` Map.keysSet newAttrs) $ elementRemoveAttribute e
72+ forM_ (Set.toList $ oldAttrs `Set.difference` Map.keysSet newAttrs) $ removeAttribute e
73− imapM_ (elementSetAttribute e) newAttrs --TODO: avoid re-setting unchanged attributes; possibly do the compare using Align in haskell
73+ imapM_ (setAttribute e) newAttrs --TODO: avoid re-setting unchanged attributes; possibly do the compare using Align in haskell
75buildEmptyElementNS :: (MonadWidget t m, Attributes m attrs) => Maybe String -> String -> attrs -> m Element
75buildEmptyElementNS :: (MonadWidget t m, Attributes m attrs) => Maybe String -> String -> attrs -> m Element
76buildEmptyElementNS mns elementTag attrs = do
76buildEmptyElementNS mns elementTag attrs = do
77 doc <- askDocument
77 doc <- askDocument
78 p <- askParent
78 p <- askParent
79 Just e <- liftIO $ case mns of
79 Just e <- liftIO $ case mns of
80− Nothing -> documentCreateElement doc elementTag
80+ Nothing -> createElement doc (Just elementTag)
81− Just ns -> documentCreateElementNS doc ns elementTag
81+ Just ns -> createElementNS doc (Just ns) (Just elementTag)
82 addAttributes attrs e
82 addAttributes attrs e
83− _ <- liftIO $ nodeAppendChild p $ Just e
83+ _ <- appendChild p $ Just e
84 return $ castToElement e
84 return $ castToElement e
86buildEmptyElement :: (MonadWidget t m, Attributes m attrs) => String -> attrs -> m Element
86buildEmptyElement :: (MonadWidget t m, Attributes m attrs) => String -> attrs -> m Element
@@ -96,13 +96,13 @@ buildElementNS mns elementTag attrs child = do
96buildElement :: (MonadWidget t m, Attributes m attrs) => String -> attrs -> m a -> m (Element, a)
96buildElement :: (MonadWidget t m, Attributes m attrs) => String -> attrs -> m a -> m (Element, a)
97buildElement = buildElementNS Nothing
97buildElement = buildElementNS Nothing
99−namedNodeMapGetNames :: IsNamedNodeMap self => self -> IO (Set String)
99+namedNodeMapGetNames :: NamedNodeMap -> IO (Set String)
100namedNodeMapGetNames self = do
100namedNodeMapGetNames self = do
101− l <- namedNodeMapGetLength self
101+ l <- NNM.getLength self
102 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
102 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
103+ liftM (Set.fromList . catMaybes) $ forM locations $ \i -> do
104− Just n <- namedNodeMapItem self i
104+ Just n <- NNM.item self i
105− nodeGetNodeName n
105+ getNodeName n
107text :: MonadWidget t m => String -> m ()
107text :: MonadWidget t m => String -> m ()
108text = void . text'
108text = void . text'
@@ -112,8 +112,8 @@ text' :: MonadWidget t m => String -> m Text
112text' s = do
112text' s = do
113 doc <- askDocument
113 doc <- askDocument
114 p <- askParent
114 p <- askParent
115− Just n <- liftIO $ documentCreateTextNode doc s
115+ Just n <- createTextNode doc s
116− _ <- liftIO $ nodeAppendChild p $ Just n
116+ _ <- appendChild p $ Just n
119dynText :: MonadWidget t m => Dynamic t String -> m ()
119dynText :: MonadWidget t m => Dynamic t String -> m ()
@@ -121,8 +121,8 @@ dynText s = do
121 n <- text' ""
121 n <- text' ""
122 schedulePostBuild $ do
122 schedulePostBuild $ do
123 curS <- sample $ current s
123 curS <- sample $ current s
124− liftIO $ nodeSetNodeValue n curS
124+ setNodeValue n $ Just curS
125− addVoidAction $ fmap (liftIO . nodeSetNodeValue n) $ updated s
125+ addVoidAction $ fmap (setNodeValue n . Just) $ updated s
127display :: (MonadWidget t m, Show a) => Dynamic t a -> m ()
127display :: (MonadWidget t m, Show a) => Dynamic t a -> m ()
128display a = dynText =<< mapDyn show a
128display a = dynText =<< mapDyn show a
@@ -159,12 +159,12 @@ widgetHoldInternal child0 newChild = do
159 doc <- askDocument
159 doc <- askDocument
160 runWidget <- getRunWidget
160 runWidget <- getRunWidget
161 let build c = do
161 let build c = do
162− Just df <- liftIO $ documentCreateDocumentFragment doc
162+ Just df <- createDocumentFragment doc
163 (result, postBuild, voidActions) <- runWidget df c
163 (result, postBuild, voidActions) <- runWidget df c
164 runFrameWithTriggerRef newChildBuiltTriggerRef (result, voidActions)
164 runFrameWithTriggerRef newChildBuiltTriggerRef (result, voidActions)
165 postBuild
165 postBuild
166− mp' <- liftIO $ nodeGetParentNode endPlaceholder
166+ mp' <- getParentNode endPlaceholder
167− forM_ mp' $ \p' -> liftIO $ nodeInsertBefore p' (Just df) (Just endPlaceholder)
167+ forM_ mp' $ \p' -> insertBefore p' (Just df) (Just endPlaceholder)
168 return ()
168 return ()
169 addVoidAction $ ffor newChild $ \c -> do
169 addVoidAction $ ffor newChild $ \c -> do
170 liftIO $ deleteBetweenExclusive startPlaceholder endPlaceholder
170 liftIO $ deleteBetweenExclusive startPlaceholder endPlaceholder
@@ -209,7 +209,7 @@ listWithKeyShallowDiff initialVals valsChanged mkChild = do
209 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
209 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
210 Just _ -> Nothing -- We don't want to let spurious re-creations of items through
210 Just _ -> Nothing -- We don't want to let spurious re-creations of items through
211 listHoldWithKey initialVals (attachWith (flip (Map.differenceWith relevantDiff)) (current sentVals) valsChanged) $ \k v ->
211 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
214-- | 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.
214-- | 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.
215listHoldWithKey :: (Ord k, MonadWidget t m) => Map k v -> Event t (Map k (Maybe v)) -> (k -> v -> m a) -> m (Dynamic t (Map k a))
215listHoldWithKey :: (Ord k, MonadWidget t m) => Map k v -> Event t (Map k (Maybe v)) -> (k -> v -> m a) -> m (Dynamic t (Map k a))
@@ -225,13 +225,13 @@ listHoldWithKey initialVals valsChanged mkChild = do
225 result <- mkChild k v
225 result <- mkChild k v
226 childEnd <- text' ""
226 childEnd <- text' ""
227 return (result, (childStart, childEnd))
227 return (result, (childStart, childEnd))
228− Just dfOrig <- liftIO $ documentCreateDocumentFragment doc
228+ Just dfOrig <- createDocumentFragment doc
229 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
229 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
230 stateRef <- liftIO $ newIORef initialState
230 stateRef <- liftIO $ newIORef initialState
231 children <- holdDyn initialState newChildren
231 children <- holdDyn initialState newChildren
232 addVoidAction $ switch $ fmap (mergeWith (>>) . map snd . Map.elems) $ current children
232 addVoidAction $ switch $ fmap (mergeWith (>>) . map snd . Map.elems) $ current children
233− mpOrig <- liftIO $ nodeGetParentNode endPlaceholder
233+ mpOrig <- getParentNode endPlaceholder
234− forM_ mpOrig $ \pOrig -> liftIO $ nodeInsertBefore pOrig (Just dfOrig) (Just endPlaceholder)
234+ forM_ mpOrig $ \pOrig -> insertBefore pOrig (Just dfOrig) (Just endPlaceholder)
235 addVoidAction $ flip fmap valsChanged $ \newVals -> do
235 addVoidAction $ flip fmap valsChanged $ \newVals -> do
236 curState <- liftIO $ readIORef stateRef
236 curState <- liftIO $ readIORef stateRef
237 --TODO: Should we remove the parent from the DOM first to avoid reflows?
237 --TODO: Should we remove the parent from the DOM first to avoid reflows?
@@ -241,24 +241,24 @@ listHoldWithKey initialVals valsChanged mkChild = do
241 return Nothing
241 return Nothing
242 These ((_, (start, end)), _) (Just v) -> do -- Replacing existing child
242 These ((_, (start, end)), _) (Just v) -> do -- Replacing existing child
243 liftIO $ deleteBetweenExclusive start end
243 liftIO $ deleteBetweenExclusive start end
244− Just df <- liftIO $ documentCreateDocumentFragment doc
244+ Just df <- createDocumentFragment doc
245 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
245 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
246 let s = (childResult, childVoidAction)
246 let s = (childResult, childVoidAction)
247 modify (>>childPostBuild)
247 modify (>>childPostBuild)
248− mp <- liftIO $ nodeGetParentNode end
248+ mp <- getParentNode end
249− forM_ mp $ \p -> liftIO $ nodeInsertBefore p (Just df) (Just end)
249+ forM_ mp $ \p -> insertBefore p (Just df) (Just end)
250 return $ Just s
250 return $ Just s
251 That Nothing -> return Nothing -- Deleting non-existent child
251 That Nothing -> return Nothing -- Deleting non-existent child
252 That (Just v) -> do -- Creating new child
252 That (Just v) -> do -- Creating new child
253− Just df <- liftIO $ documentCreateDocumentFragment doc
253+ Just df <- createDocumentFragment doc
254 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
254 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
255 let s = (childResult, childVoidAction)
255 let s = (childResult, childVoidAction)
256 modify (>>childPostBuild)
256 modify (>>childPostBuild)
257 let placeholder = case Map.lookupGT k curState of
257 let placeholder = case Map.lookupGT k curState of
258 Nothing -> endPlaceholder
258 Nothing -> endPlaceholder
259 Just (_, ((_, (start, _)), _)) -> start
259 Just (_, ((_, (start, _)), _)) -> start
260− mp <- liftIO $ nodeGetParentNode placeholder
260+ mp <- getParentNode placeholder
261− forM_ mp $ \p -> liftIO $ nodeInsertBefore p (Just df) (Just placeholder)
261+ forM_ mp $ \p -> insertBefore p (Just df) (Just placeholder)
262 return $ Just s
262 return $ Just s
263 This state -> do -- No change
263 This state -> do -- No change
264 return $ Just state
264 return $ Just state
@@ -304,40 +304,40 @@ selectViewListWithKey_ selection vals mkChild = liftM (fmap fst) $ selectViewLis
304-- | s and e must both be children of the same node and s must precede e
304-- | s and e must both be children of the same node and s must precede e
305deleteBetweenExclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
305deleteBetweenExclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
306deleteBetweenExclusive s e = do
306deleteBetweenExclusive s e = do
307− 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
307+ 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
308 case mCurrentParent of
308 case mCurrentParent of
309 Nothing -> return () --TODO: Is this the right behavior?
309 Nothing -> return () --TODO: Is this the right behavior?
310 Just currentParent -> do
310 Just currentParent -> do
311 let go = do
311 let go = do
312− Just x <- nodeGetPreviousSibling e -- This can't be Nothing because we should hit 's' first
312+ Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
313 when (toNode s /= toNode x) $ do
313 when (toNode s /= toNode x) $ do
314− _ <- nodeRemoveChild currentParent $ Just x
314+ _ <- removeChild currentParent $ Just x
318-- | s and e must both be children of the same node and s must precede e
318-- | s and e must both be children of the same node and s must precede e
319deleteBetweenInclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
319deleteBetweenInclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
320deleteBetweenInclusive s e = do
320deleteBetweenInclusive s e = do
321− 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
321+ 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
322 case mCurrentParent of
322 case mCurrentParent of
323 Nothing -> return () --TODO: Is this the right behavior?
323 Nothing -> return () --TODO: Is this the right behavior?
324 Just currentParent -> do
324 Just currentParent -> do
325 let go = do
325 let go = do
326− Just x <- nodeGetPreviousSibling e -- This can't be Nothing because we should hit 's' first
326+ Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
327− _ <- nodeRemoveChild currentParent $ Just x
327+ _ <- removeChild currentParent $ Just x
328 when (toNode s /= toNode x) go
328 when (toNode s /= toNode x) go
330− _ <- nodeRemoveChild currentParent $ Just e
330+ _ <- removeChild currentParent $ Just e
331 return ()
331 return ()
333--------------------------------------------------------------------------------
333--------------------------------------------------------------------------------
334-- Adapters
334-- Adapters
335--------------------------------------------------------------------------------
335--------------------------------------------------------------------------------
337−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)
337+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)
338wrapDomEvent element elementOnevent getValue = wrapDomEventMaybe element elementOnevent $ liftM Just getValue
338wrapDomEvent element elementOnevent getValue = wrapDomEventMaybe element elementOnevent $ liftM Just getValue
340−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)
340+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)
341wrapDomEventMaybe element elementOnevent getValue = do
341wrapDomEventMaybe element elementOnevent getValue = do
342 postGui <- askPostGui
342 postGui <- askPostGui
343 runWithActions <- askRunWithActions
343 runWithActions <- askRunWithActions
@@ -378,11 +378,11 @@ data EventTag
378 | MouseoutTag
378 | MouseoutTag
379 | MouseoverTag
379 | MouseoverTag
380 | MouseupTag
380 | MouseupTag
381−-- | 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
381+ | MousewheelTag
382 | ScrollTag
382 | ScrollTag
383 | SelectTag
383 | SelectTag
384 | SubmitTag
384 | SubmitTag
385−-- | WheelTag -- See MousewheelTag
385+ | WheelTag
386 | BeforecutTag
386 | BeforecutTag
388 | BeforecopyTag
388 | BeforecopyTag
@@ -426,11 +426,11 @@ data EventName :: EventTag -> * where
426 Mouseout :: EventName 'MouseoutTag
426 Mouseout :: EventName 'MouseoutTag
427 Mouseover :: EventName 'MouseoverTag
427 Mouseover :: EventName 'MouseoverTag
428 Mouseup :: EventName 'MouseupTag
428 Mouseup :: EventName 'MouseupTag
429− --Mousewheel :: EventName 'MousewheelTag
429+ Mousewheel :: EventName 'MousewheelTag
430 Scroll :: EventName 'ScrollTag
430 Scroll :: EventName 'ScrollTag
431 Select :: EventName 'SelectTag
431 Select :: EventName 'SelectTag
432 Submit :: EventName 'SubmitTag
432 Submit :: EventName 'SubmitTag
433− --Wheel :: EventName 'WheelTag
433+ Wheel :: EventName 'WheelTag
434 Beforecut :: EventName 'BeforecutTag
434 Beforecut :: EventName 'BeforecutTag
435 Cut :: EventName 'CutTag
435 Cut :: EventName 'CutTag
436 Beforecopy :: EventName 'BeforecopyTag
436 Beforecopy :: EventName 'BeforecopyTag
@@ -447,8 +447,8 @@ data EventName :: EventTag -> * where
448type family EventType en where
448type family EventType en where
449 EventType 'AbortTag = UIEvent
449 EventType 'AbortTag = UIEvent
450− EventType 'BlurTag = UIEvent
450+ EventType 'BlurTag = FocusEvent
451− EventType 'ChangeTag = UIEvent
451+ EventType 'ChangeTag = DOM.Event
452 EventType 'ClickTag = MouseEvent
452 EventType 'ClickTag = MouseEvent
453 EventType 'ContextmenuTag = MouseEvent
453 EventType 'ContextmenuTag = MouseEvent
454 EventType 'DblclickTag = MouseEvent
454 EventType 'DblclickTag = MouseEvent
@@ -460,87 +460,87 @@ type family EventType en where
460 EventType 'DragstartTag = MouseEvent
460 EventType 'DragstartTag = MouseEvent
461 EventType 'DropTag = MouseEvent
461 EventType 'DropTag = MouseEvent
462 EventType 'ErrorTag = UIEvent
462 EventType 'ErrorTag = UIEvent
463− EventType 'FocusTag = UIEvent
463+ EventType 'FocusTag = FocusEvent
464− EventType 'InputTag = UIEvent
464+ EventType 'InputTag = DOM.Event
465− EventType 'InvalidTag = UIEvent
465+ EventType 'InvalidTag = DOM.Event
466− EventType 'KeydownTag = UIEvent
466+ EventType 'KeydownTag = KeyboardEvent
467− EventType 'KeypressTag = UIEvent
467+ EventType 'KeypressTag = KeyboardEvent
468− EventType 'KeyupTag = UIEvent
468+ EventType 'KeyupTag = KeyboardEvent
469 EventType 'LoadTag = UIEvent
469 EventType 'LoadTag = UIEvent
470 EventType 'MousedownTag = MouseEvent
470 EventType 'MousedownTag = MouseEvent
471− EventType 'MouseenterTag = UIEvent
471+ EventType 'MouseenterTag = MouseEvent
472− EventType 'MouseleaveTag = UIEvent
472+ EventType 'MouseleaveTag = MouseEvent
473 EventType 'MousemoveTag = MouseEvent
473 EventType 'MousemoveTag = MouseEvent
474 EventType 'MouseoutTag = MouseEvent
474 EventType 'MouseoutTag = MouseEvent
475 EventType 'MouseoverTag = MouseEvent
475 EventType 'MouseoverTag = MouseEvent
476 EventType 'MouseupTag = MouseEvent
476 EventType 'MouseupTag = MouseEvent
477− --EventType 'MousewheelTag = MouseEvent
477+ EventType 'MousewheelTag = MouseEvent
478 EventType 'ScrollTag = UIEvent
478 EventType 'ScrollTag = UIEvent
479 EventType 'SelectTag = UIEvent
479 EventType 'SelectTag = UIEvent
480− EventType 'SubmitTag = UIEvent
480+ EventType 'SubmitTag = DOM.Event
481− --EventType 'WheelTag = UIEvent
481+ EventType 'WheelTag = WheelEvent
482− EventType 'BeforecutTag = UIEvent
482+ EventType 'BeforecutTag = DOM.Event
483− EventType 'CutTag = UIEvent
483+ EventType 'CutTag = DOM.Event
484− EventType 'BeforecopyTag = UIEvent
484+ EventType 'BeforecopyTag = DOM.Event
485− EventType 'CopyTag = UIEvent
485+ EventType 'CopyTag = DOM.Event
486− EventType 'BeforepasteTag = UIEvent
486+ EventType 'BeforepasteTag = DOM.Event
487− EventType 'PasteTag = UIEvent
487+ EventType 'PasteTag = DOM.Event
488− EventType 'ResetTag = UIEvent
488+ EventType 'ResetTag = DOM.Event
489− EventType 'SearchTag = UIEvent
489+ EventType 'SearchTag = DOM.Event
490− EventType 'SelectstartTag = UIEvent
490+ EventType 'SelectstartTag = DOM.Event
491− EventType 'TouchstartTag = UIEvent
491+ EventType 'TouchstartTag = TouchEvent
492− EventType 'TouchmoveTag = UIEvent
492+ EventType 'TouchmoveTag = TouchEvent
493− EventType 'TouchendTag = UIEvent
493+ EventType 'TouchendTag = TouchEvent
494− EventType 'TouchcancelTag = UIEvent
494+ EventType 'TouchcancelTag = TouchEvent
496−onEventName :: IsElement e => EventName en -> e -> EventM (EventType en) e () -> IO (IO ())
496+onEventName :: IsElement e => EventName en -> e -> EventM e (EventType en) () -> IO (IO ())
497−onEventName en = case en of
497+onEventName en e = case en of
498− Abort -> elementOnabort
498+ Abort -> on e E.abort
499− Blur -> elementOnblur
499+ Blur -> on e E.blurEvent
500− Change -> elementOnchange
500+ Change -> on e E.change
501− Click -> elementOnclick
501+ Click -> on e E.click
502− Contextmenu -> elementOncontextmenu
502+ Contextmenu -> on e E.contextMenu
503− Dblclick -> elementOndblclick
503+ Dblclick -> on e E.dblClick
504− Drag -> elementOndrag
504+ Drag -> on e E.drag
505− Dragend -> elementOndragend
505+ Dragend -> on e E.dragEnd
506− Dragenter -> elementOndragenter
506+ Dragenter -> on e E.dragEnter
507− Dragleave -> elementOndragleave
507+ Dragleave -> on e E.dragLeave
508− Dragover -> elementOndragover
508+ Dragover -> on e E.dragOver
509− Dragstart -> elementOndragstart
509+ Dragstart -> on e E.dragStart
510− Drop -> elementOndrop
510+ Drop -> on e E.drop
511− Error -> elementOnerror
511+ Error -> on e E.error
512− Focus -> elementOnfocus
512+ Focus -> on e E.focusEvent
513− Input -> elementOninput
513+ Input -> on e E.input
514− Invalid -> elementOninvalid
514+ Invalid -> on e E.invalid
515− Keydown -> elementOnkeydown
515+ Keydown -> on e E.keyDown
516− Keypress -> elementOnkeypress
516+ Keypress -> on e E.keyPress
517− Keyup -> elementOnkeyup
517+ Keyup -> on e E.keyUp
518− Load -> elementOnload
518+ Load -> on e E.load
519− Mousedown -> elementOnmousedown
519+ Mousedown -> on e E.mouseDown
520− Mouseenter -> elementOnmouseenter
520+ Mouseenter -> on e E.mouseEnter
521− Mouseleave -> elementOnmouseleave
521+ Mouseleave -> on e E.mouseLeave
522− Mousemove -> elementOnmousemove
522+ Mousemove -> on e E.mouseMove
523− Mouseout -> elementOnmouseout
523+ Mouseout -> on e E.mouseOut
524− Mouseover -> elementOnmouseover
524+ Mouseover -> on e E.mouseOver
525− Mouseup -> elementOnmouseup
525+ Mouseup -> on e E.mouseUp
526− --Mousewheel -> elementOnmousewheel
526+ Mousewheel -> on e E.mouseWheel
527− Scroll -> elementOnscroll
527+ Scroll -> on e E.scroll
528− Select -> elementOnselect
528+ Select -> on e E.select
529− Submit -> elementOnsubmit
529+ Submit -> on e E.submit
530− --Wheel -> elementOnwheel
530+ Wheel -> on e E.wheel
531− Beforecut -> elementOnbeforecut
531+ Beforecut -> on e E.beforeCut
532− Cut -> elementOncut
532+ Cut -> on e E.cut
533− Beforecopy -> elementOnbeforecopy
533+ Beforecopy -> on e E.beforeCopy
534− Copy -> elementOncopy
534+ Copy -> on e E.copy
535− Beforepaste -> elementOnbeforepaste
535+ Beforepaste -> on e E.beforePaste
536− Paste -> elementOnpaste
536+ Paste -> on e E.paste
537− Reset -> elementOnreset
537+ Reset -> on e E.reset
538− Search -> elementOnsearch
538+ Search -> on e E.search
539− Selectstart -> elementOnselectstart
539+ Selectstart -> on e E.selectStart
540− Touchstart -> elementOntouchstart
540+ Touchstart -> on e E.touchStart
541− Touchmove -> elementOntouchmove
541+ Touchmove -> on e E.touchMove
542− Touchend -> elementOntouchend
542+ Touchend -> on e E.touchEnd
543− Touchcancel -> elementOntouchcancel
543+ Touchcancel -> on e E.touchCancel
545newtype EventResult en = EventResult { unEventResult :: EventResultType en }
545newtype EventResult en = EventResult { unEventResult :: EventResultType en }
@@ -590,41 +590,40 @@ type family EventResultType (en :: EventTag) :: * where
590 EventResultType 'TouchendTag = ()
590 EventResultType 'TouchendTag = ()
591 EventResultType 'TouchcancelTag = ()
591 EventResultType 'TouchcancelTag = ()
593−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))
593+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))
594wrapDomEventsMaybe element handlers = do
594wrapDomEventsMaybe element handlers = do
595 postGui <- askPostGui
595 postGui <- askPostGui
596 runWithActions <- askRunWithActions
596 runWithActions <- askRunWithActions
597 e <- newFanEventWithTrigger $ \(WrapArg en) et -> do
597 e <- newFanEventWithTrigger $ \(WrapArg en) et -> do
598− unsubscribe <- liftIO $ (onEventName en) element $ do
598+ unsubscribe <- onEventName en element $ do
599 mv <- handlers en
599 mv <- handlers en
600 forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> v]
600 forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> v]
601 return $ liftIO $ do
601 return $ liftIO $ do
602 unsubscribe
602 unsubscribe
603 return $! e
603 return $! e
605−getKeyEvent :: EventM UIEvent e Int
605+getKeyEvent :: EventM e KeyboardEvent Int
606getKeyEvent = do
606getKeyEvent = do
607 e <- event
607 e <- event
608− liftIO $ do
608+ which <- getWhich e
609− which <- uiEventGetWhich e
610− if which /= 0 then return which else do
609+ if which /= 0 then return which else do
611− charCode <- uiEventGetCharCode e
610+ charCode <- getCharCode e
612− if charCode /= 0 then return charCode else
611+ if charCode /= 0 then return charCode else
613− uiEventGetKeyCode e
612+ getKeyCode e
615−getMouseEventCoords :: EventM MouseEvent e (Int, Int)
614+getMouseEventCoords :: EventM e MouseEvent (Int, Int)
616getMouseEventCoords = do
615getMouseEventCoords = do
617 e <- event
616 e <- event
618− liftIO $ bisequence (mouseEventGetClientX e, mouseEventGetClientY e)
617+ bisequence (getX e, getY e)
620−defaultDomEventHandler :: IsElement e => e -> EventName en -> EventM (EventType en) e (Maybe (EventResult en))
619+defaultDomEventHandler :: IsElement e => e -> EventName en -> EventM e (EventType en) (Maybe (EventResult en))
621defaultDomEventHandler e evt = liftM (Just . EventResult) $ case evt of
620defaultDomEventHandler e evt = liftM (Just . EventResult) $ case evt of
622 Click -> return ()
621 Click -> return ()
623 Dblclick -> return ()
622 Dblclick -> return ()
624 Keypress -> getKeyEvent
623 Keypress -> getKeyEvent
624+ Scroll -> getScrollTop e
625 Keydown -> getKeyEvent
625 Keydown -> getKeyEvent
626 Keyup -> getKeyEvent
626 Keyup -> getKeyEvent
627− Scroll -> liftIO $ elementGetScrollTop e
628 Mousemove -> getMouseEventCoords
627 Mousemove -> getMouseEventCoords
629 Mouseup -> getMouseEventCoords
628 Mouseup -> getMouseEventCoords
630 Mousedown -> getMouseEventCoords
629 Mousedown -> getMouseEventCoords
@@ -664,7 +663,7 @@ defaultDomEventHandler e evt = liftM (Just . EventResult) $ case evt of
664 Touchend -> return ()
663 Touchend -> return ()
665 Touchcancel -> return ()
664 Touchcancel -> return ()
667−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)
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 Element (EventType en) (Maybe (EventResult en))) -> Element -> m (El t)
668wrapElement eh e = do
667wrapElement eh e = do
669 es <- wrapDomEventsMaybe e $ eh e
668 es <- wrapDomEventsMaybe e $ eh e
670 return $ El e es
669 return $ El e es
@@ -749,17 +748,15 @@ simpleList xs mkChild = mapDyn (map snd . Map.toList) =<< flip list mkChild =<<
749elDynHtml' :: MonadWidget t m => String -> Dynamic t String -> m (El t)
748elDynHtml' :: MonadWidget t m => String -> Dynamic t String -> m (El t)
750elDynHtml' elementTag html = do
749elDynHtml' elementTag html = do
751 e <- buildEmptyElement elementTag (Map.empty :: Map String String)
750 e <- buildEmptyElement elementTag (Map.empty :: Map String String)
752− let h = castToHTMLElement e
753− schedulePostBuild $ liftIO . htmlElementSetInnerHTML h =<< sample (current html)
751+ schedulePostBuild $ setInnerHTML e . Just =<< sample (current html)
754− addVoidAction $ fmap (liftIO . htmlElementSetInnerHTML h) $ updated html
752+ addVoidAction $ fmap (setInnerHTML e . Just) $ updated html
755 wrapElement defaultDomEventHandler e
753 wrapElement defaultDomEventHandler e
757elDynHtmlAttr' :: MonadWidget t m => String -> Map String String -> Dynamic t String -> m (El t)
755elDynHtmlAttr' :: MonadWidget t m => String -> Map String String -> Dynamic t String -> m (El t)
758elDynHtmlAttr' elementTag attrs html = do
756elDynHtmlAttr' elementTag attrs html = do
759 e <- buildEmptyElement elementTag attrs
757 e <- buildEmptyElement elementTag attrs
760− let h = castToHTMLElement e
761− schedulePostBuild $ liftIO . htmlElementSetInnerHTML h =<< sample (current html)
758+ schedulePostBuild $ setInnerHTML e . Just =<< sample (current html)
762− addVoidAction $ fmap (liftIO . htmlElementSetInnerHTML h) $ updated html
759+ addVoidAction $ fmap (setInnerHTML e . Just) $ updated html
763 wrapElement defaultDomEventHandler e
760 wrapElement defaultDomEventHandler e
765data Link t
762data Link t
@@ -784,7 +781,7 @@ class HasDomEvent t a where
784 domEvent :: EventName en -> a -> Event t (EventResultType en)
781 domEvent :: EventName en -> a -> Event t (EventResultType en)
786instance Reflex t => HasDomEvent t (El t) where
783instance Reflex t => HasDomEvent t (El t) where
787− domEvent en e = fmap unEventResult $ select (_el_events e) (WrapArg en)
784+ domEvent en e = fmap unEventResult $ Reflex.select (_el_events e) (WrapArg en)
789linkClass :: MonadWidget t m => String -> String -> m (Link t)
786linkClass :: MonadWidget t m => String -> String -> m (Link t)
790linkClass s c = do
787linkClass s c = do
@@ -859,7 +856,7 @@ tabDisplay ulClass activeClass tabItems = do
859 _ <- listWithKey dTabs (\k dTab -> do
856 _ <- listWithKey dTabs (\k dTab -> do
860 dAttrs <- mapDyn (\sel -> do
857 dAttrs <- mapDyn (\sel -> do
861 let t1 = listToMaybe $ Map.keys tabItems
858 let t1 = listToMaybe $ Map.keys tabItems
862− if sel == Just k || (sel == Nothing && t1 == Just k) then Map.empty else Map.singleton "style" "display:none;") dCurrentTab
859+ if sel == Just k || (sel == Nothing && t1 == Just k) then Map.empty else Map.singleton "style" "display:none;") dCurrentTab
863 elDynAttr "div" dAttrs $ dyn =<< mapDyn snd dTab)
860 elDynAttr "div" dAttrs $ dyn =<< mapDyn snd dTab)
864 return ()
861 return ()
@@ -874,7 +871,7 @@ tabDisplay ulClass activeClass tabItems = do
874unsafePlaceElement :: MonadWidget t m => Element -> m (El t)
871unsafePlaceElement :: MonadWidget t m => Element -> m (El t)
875unsafePlaceElement e = do
872unsafePlaceElement e = do
876 p <- askParent
873 p <- askParent
877− _ <- liftIO $ nodeAppendChild p $ Just e
874+ _ <- appendChild p $ Just e
878 wrapElement defaultDomEventHandler e
875 wrapElement defaultDomEventHandler e
880deriveGEq ''EventName
877deriveGEq ''EventName