@@ -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 scheduleFollowup newChildBuiltTriggerRef (result, voidActions)
164 scheduleFollowup 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))
@@ -224,13 +224,13 @@ listHoldWithKey initialVals valsChanged mkChild = do
224 result <- mkChild k v
224 result <- mkChild k v
225 childEnd <- text' ""
225 childEnd <- text' ""
226 return (result, (childStart, childEnd))
226 return (result, (childStart, childEnd))
227− Just dfOrig <- liftIO $ documentCreateDocumentFragment doc
227+ Just dfOrig <- createDocumentFragment doc
228 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
228 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 stateRef <- liftIO $ newIORef initialState
229 stateRef <- liftIO $ newIORef initialState
230 children <- holdDyn initialState newChildren
230 children <- holdDyn initialState newChildren
231 tellWidgetOutput =<< mapDyn (fmap snd) children
231 tellWidgetOutput =<< mapDyn (fmap snd) children
232− mpOrig <- liftIO $ nodeGetParentNode endPlaceholder
232+ mpOrig <- getParentNode endPlaceholder
233− forM_ mpOrig $ \pOrig -> liftIO $ nodeInsertBefore pOrig (Just dfOrig) (Just endPlaceholder)
233+ forM_ mpOrig $ \pOrig -> insertBefore pOrig (Just dfOrig) (Just endPlaceholder)
234 addVoidAction $ flip fmap valsChanged $ \newVals -> do
234 addVoidAction $ flip fmap valsChanged $ \newVals -> do
235 curState <- liftIO $ readIORef stateRef
235 curState <- liftIO $ readIORef stateRef
236 --TODO: Should we remove the parent from the DOM first to avoid reflows?
236 --TODO: Should we remove the parent from the DOM first to avoid reflows?
@@ -240,24 +240,24 @@ listHoldWithKey initialVals valsChanged mkChild = do
240 return Nothing
240 return Nothing
241 These ((_, (start, end)), _) (Just v) -> do -- Replacing existing child
241 These ((_, (start, end)), _) (Just v) -> do -- Replacing existing child
242 liftIO $ deleteBetweenExclusive start end
242 liftIO $ deleteBetweenExclusive start end
243− Just df <- liftIO $ documentCreateDocumentFragment doc
243+ Just df <- createDocumentFragment doc
244 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
244 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
245 let s = (childResult, childVoidAction)
245 let s = (childResult, childVoidAction)
246 modify (>>childPostBuild)
246 modify (>>childPostBuild)
247− mp <- liftIO $ nodeGetParentNode end
247+ mp <- getParentNode end
248− forM_ mp $ \p -> liftIO $ nodeInsertBefore p (Just df) (Just end)
248+ forM_ mp $ \p -> insertBefore p (Just df) (Just end)
249 return $ Just s
249 return $ Just s
250 That Nothing -> return Nothing -- Deleting non-existent child
250 That Nothing -> return Nothing -- Deleting non-existent child
251 That (Just v) -> do -- Creating new child
251 That (Just v) -> do -- Creating new child
252− Just df <- liftIO $ documentCreateDocumentFragment doc
252+ Just df <- createDocumentFragment doc
253 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
253 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
254 let s = (childResult, childVoidAction)
254 let s = (childResult, childVoidAction)
255 modify (>>childPostBuild)
255 modify (>>childPostBuild)
256 let placeholder = case Map.lookupGT k curState of
256 let placeholder = case Map.lookupGT k curState of
257 Nothing -> endPlaceholder
257 Nothing -> endPlaceholder
258 Just (_, ((_, (start, _)), _)) -> start
258 Just (_, ((_, (start, _)), _)) -> start
259− mp <- liftIO $ nodeGetParentNode placeholder
259+ mp <- getParentNode placeholder
260− forM_ mp $ \p -> liftIO $ nodeInsertBefore p (Just df) (Just placeholder)
260+ forM_ mp $ \p -> insertBefore p (Just df) (Just placeholder)
261 return $ Just s
261 return $ Just s
262 This state -> do -- No change
262 This state -> do -- No change
263 return $ Just state
263 return $ Just state
@@ -303,47 +303,56 @@ selectViewListWithKey_ selection vals mkChild = liftM (fmap fst) $ selectViewLis
303-- | s and e must both be children of the same node and s must precede e
303-- | s and e must both be children of the same node and s must precede e
304deleteBetweenExclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
304deleteBetweenExclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
305deleteBetweenExclusive s e = do
305deleteBetweenExclusive 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
307 case mCurrentParent of
307 case mCurrentParent of
308 Nothing -> return () --TODO: Is this the right behavior?
308 Nothing -> return () --TODO: Is this the right behavior?
309 Just currentParent -> do
309 Just currentParent -> do
310 let go = do
310 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
312 when (toNode s /= toNode x) $ do
312 when (toNode s /= toNode x) $ do
313− _ <- nodeRemoveChild currentParent $ Just x
313+ _ <- removeChild currentParent $ Just x
317-- | s and e must both be children of the same node and s must precede e
317-- | s and e must both be children of the same node and s must precede e
318deleteBetweenInclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
318deleteBetweenInclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
319deleteBetweenInclusive s e = do
319deleteBetweenInclusive 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
321 case mCurrentParent of
321 case mCurrentParent of
322 Nothing -> return () --TODO: Is this the right behavior?
322 Nothing -> return () --TODO: Is this the right behavior?
323 Just currentParent -> do
323 Just currentParent -> do
324 let go = do
324 let go = do
325− Just x <- nodeGetPreviousSibling e -- This can't be Nothing because we should hit 's' first
325+ Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
326− _ <- nodeRemoveChild currentParent $ Just x
326+ _ <- removeChild currentParent $ Just x
327 when (toNode s /= toNode x) go
327 when (toNode s /= toNode x) go
329− _ <- nodeRemoveChild currentParent $ Just e
329+ _ <- removeChild currentParent $ Just e
330 return ()
330 return ()
332+nodeClear :: IsNode self => self -> IO ()
334+ mfc <- getFirstChild n
336+ Nothing -> return ()
338+ _ <- removeChild n $ Just fc
332--------------------------------------------------------------------------------
341--------------------------------------------------------------------------------
333-- Adapters
342-- Adapters
334--------------------------------------------------------------------------------
343--------------------------------------------------------------------------------
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)
337wrapDomEvent element elementOnevent getValue = wrapDomEventMaybe element elementOnevent $ liftM Just getValue
346wrapDomEvent element elementOnevent getValue = wrapDomEventMaybe element elementOnevent $ liftM Just getValue
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)
340wrapDomEventMaybe element elementOnevent getValue = do
349wrapDomEventMaybe element elementOnevent getValue = do
341 postGui <- askPostGui
350 postGui <- askPostGui
342 runWithActions <- askRunWithActions
351 runWithActions <- askRunWithActions
343 e <- newEventWithTrigger $ \et -> do
352 e <- newEventWithTrigger $ \et -> do
344 unsubscribe <- {-# SCC "a" #-} liftIO $ {-# SCC "b" #-} elementOnevent element $ {-# SCC "c" #-} do
353 unsubscribe <- {-# SCC "a" #-} liftIO $ {-# SCC "b" #-} elementOnevent element $ {-# SCC "c" #-} do
345 mv <- {-# SCC "d" #-} getValue
354 mv <- {-# SCC "d" #-} getValue
346− forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> v]
355+ forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> Identity v]
347 return $ liftIO $ do
356 return $ liftIO $ do
348 {-# SCC "e" #-} unsubscribe
357 {-# SCC "e" #-} unsubscribe
349 return $! {-# SCC "f" #-} e
358 return $! {-# SCC "f" #-} e
@@ -377,11 +386,11 @@ data EventTag
377 | MouseoutTag
386 | MouseoutTag
378 | MouseoverTag
387 | MouseoverTag
379 | MouseupTag
388 | 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
381 | ScrollTag
390 | ScrollTag
382 | SelectTag
391 | SelectTag
383 | SubmitTag
392 | SubmitTag
384−-- | WheelTag -- See MousewheelTag
393+ | WheelTag
385 | BeforecutTag
394 | BeforecutTag
387 | BeforecopyTag
396 | BeforecopyTag
@@ -425,11 +434,11 @@ data EventName :: EventTag -> * where
425 Mouseout :: EventName 'MouseoutTag
434 Mouseout :: EventName 'MouseoutTag
426 Mouseover :: EventName 'MouseoverTag
435 Mouseover :: EventName 'MouseoverTag
427 Mouseup :: EventName 'MouseupTag
436 Mouseup :: EventName 'MouseupTag
428− --Mousewheel :: EventName 'MousewheelTag
437+ Mousewheel :: EventName 'MousewheelTag
429 Scroll :: EventName 'ScrollTag
438 Scroll :: EventName 'ScrollTag
430 Select :: EventName 'SelectTag
439 Select :: EventName 'SelectTag
431 Submit :: EventName 'SubmitTag
440 Submit :: EventName 'SubmitTag
432− --Wheel :: EventName 'WheelTag
441+ Wheel :: EventName 'WheelTag
433 Beforecut :: EventName 'BeforecutTag
442 Beforecut :: EventName 'BeforecutTag
434 Cut :: EventName 'CutTag
443 Cut :: EventName 'CutTag
435 Beforecopy :: EventName 'BeforecopyTag
444 Beforecopy :: EventName 'BeforecopyTag
@@ -446,8 +455,8 @@ data EventName :: EventTag -> * where
447type family EventType en where
456type family EventType en where
448 EventType 'AbortTag = UIEvent
457 EventType 'AbortTag = UIEvent
449− EventType 'BlurTag = UIEvent
458+ EventType 'BlurTag = FocusEvent
450− EventType 'ChangeTag = UIEvent
459+ EventType 'ChangeTag = DOM.Event
451 EventType 'ClickTag = MouseEvent
460 EventType 'ClickTag = MouseEvent
452 EventType 'ContextmenuTag = MouseEvent
461 EventType 'ContextmenuTag = MouseEvent
453 EventType 'DblclickTag = MouseEvent
462 EventType 'DblclickTag = MouseEvent
@@ -459,87 +468,87 @@ type family EventType en where
459 EventType 'DragstartTag = MouseEvent
468 EventType 'DragstartTag = MouseEvent
460 EventType 'DropTag = MouseEvent
469 EventType 'DropTag = MouseEvent
461 EventType 'ErrorTag = UIEvent
470 EventType 'ErrorTag = UIEvent
462− EventType 'FocusTag = UIEvent
471+ EventType 'FocusTag = FocusEvent
463− EventType 'InputTag = UIEvent
472+ EventType 'InputTag = DOM.Event
464− EventType 'InvalidTag = UIEvent
473+ EventType 'InvalidTag = DOM.Event
465− EventType 'KeydownTag = UIEvent
474+ EventType 'KeydownTag = KeyboardEvent
466− EventType 'KeypressTag = UIEvent
475+ EventType 'KeypressTag = KeyboardEvent
467− EventType 'KeyupTag = UIEvent
476+ EventType 'KeyupTag = KeyboardEvent
468 EventType 'LoadTag = UIEvent
477 EventType 'LoadTag = UIEvent
469 EventType 'MousedownTag = MouseEvent
478 EventType 'MousedownTag = MouseEvent
470− EventType 'MouseenterTag = UIEvent
479+ EventType 'MouseenterTag = MouseEvent
471− EventType 'MouseleaveTag = UIEvent
480+ EventType 'MouseleaveTag = MouseEvent
472 EventType 'MousemoveTag = MouseEvent
481 EventType 'MousemoveTag = MouseEvent
473 EventType 'MouseoutTag = MouseEvent
482 EventType 'MouseoutTag = MouseEvent
474 EventType 'MouseoverTag = MouseEvent
483 EventType 'MouseoverTag = MouseEvent
475 EventType 'MouseupTag = MouseEvent
484 EventType 'MouseupTag = MouseEvent
476− --EventType 'MousewheelTag = MouseEvent
485+ EventType 'MousewheelTag = MouseEvent
477 EventType 'ScrollTag = UIEvent
486 EventType 'ScrollTag = UIEvent
478 EventType 'SelectTag = UIEvent
487 EventType 'SelectTag = UIEvent
479− EventType 'SubmitTag = UIEvent
488+ EventType 'SubmitTag = DOM.Event
480− --EventType 'WheelTag = UIEvent
489+ EventType 'WheelTag = WheelEvent
481− EventType 'BeforecutTag = UIEvent
490+ EventType 'BeforecutTag = DOM.Event
482− EventType 'CutTag = UIEvent
491+ EventType 'CutTag = DOM.Event
483− EventType 'BeforecopyTag = UIEvent
492+ EventType 'BeforecopyTag = DOM.Event
484− EventType 'CopyTag = UIEvent
493+ EventType 'CopyTag = DOM.Event
485− EventType 'BeforepasteTag = UIEvent
494+ EventType 'BeforepasteTag = DOM.Event
486− EventType 'PasteTag = UIEvent
495+ EventType 'PasteTag = DOM.Event
487− EventType 'ResetTag = UIEvent
496+ EventType 'ResetTag = DOM.Event
488− EventType 'SearchTag = UIEvent
497+ EventType 'SearchTag = DOM.Event
489− EventType 'SelectstartTag = UIEvent
498+ EventType 'SelectstartTag = DOM.Event
490− EventType 'TouchstartTag = UIEvent
499+ EventType 'TouchstartTag = TouchEvent
491− EventType 'TouchmoveTag = UIEvent
500+ EventType 'TouchmoveTag = TouchEvent
492− EventType 'TouchendTag = UIEvent
501+ EventType 'TouchendTag = TouchEvent
493− EventType 'TouchcancelTag = UIEvent
502+ EventType 'TouchcancelTag = TouchEvent
495−onEventName :: IsElement e => EventName en -> e -> EventM (EventType en) e () -> IO (IO ())
504+onEventName :: IsElement e => EventName en -> e -> EventM e (EventType en) () -> IO (IO ())
496−onEventName en = case en of
505+onEventName en e = case en of
497− Abort -> elementOnabort
506+ Abort -> on e E.abort
498− Blur -> elementOnblur
507+ Blur -> on e E.blurEvent
499− Change -> elementOnchange
508+ Change -> on e E.change
500− Click -> elementOnclick
509+ Click -> on e E.click
501− Contextmenu -> elementOncontextmenu
510+ Contextmenu -> on e E.contextMenu
502− Dblclick -> elementOndblclick
511+ Dblclick -> on e E.dblClick
503− Drag -> elementOndrag
512+ Drag -> on e E.drag
504− Dragend -> elementOndragend
513+ Dragend -> on e E.dragEnd
505− Dragenter -> elementOndragenter
514+ Dragenter -> on e E.dragEnter
506− Dragleave -> elementOndragleave
515+ Dragleave -> on e E.dragLeave
507− Dragover -> elementOndragover
516+ Dragover -> on e E.dragOver
508− Dragstart -> elementOndragstart
517+ Dragstart -> on e E.dragStart
509− Drop -> elementOndrop
518+ Drop -> on e E.drop
510− Error -> elementOnerror
519+ Error -> on e E.error
511− Focus -> elementOnfocus
520+ Focus -> on e E.focusEvent
512− Input -> elementOninput
521+ Input -> on e E.input
513− Invalid -> elementOninvalid
522+ Invalid -> on e E.invalid
514− Keydown -> elementOnkeydown
523+ Keydown -> on e E.keyDown
515− Keypress -> elementOnkeypress
524+ Keypress -> on e E.keyPress
516− Keyup -> elementOnkeyup
525+ Keyup -> on e E.keyUp
517− Load -> elementOnload
526+ Load -> on e E.load
518− Mousedown -> elementOnmousedown
527+ Mousedown -> on e E.mouseDown
519− Mouseenter -> elementOnmouseenter
528+ Mouseenter -> on e E.mouseEnter
520− Mouseleave -> elementOnmouseleave
529+ Mouseleave -> on e E.mouseLeave
521− Mousemove -> elementOnmousemove
530+ Mousemove -> on e E.mouseMove
522− Mouseout -> elementOnmouseout
531+ Mouseout -> on e E.mouseOut
523− Mouseover -> elementOnmouseover
532+ Mouseover -> on e E.mouseOver
524− Mouseup -> elementOnmouseup
533+ Mouseup -> on e E.mouseUp
525− --Mousewheel -> elementOnmousewheel
534+ Mousewheel -> on e E.mouseWheel
526− Scroll -> elementOnscroll
535+ Scroll -> on e E.scroll
527− Select -> elementOnselect
536+ Select -> on e E.select
528− Submit -> elementOnsubmit
537+ Submit -> on e E.submit
529− --Wheel -> elementOnwheel
538+ Wheel -> on e E.wheel
530− Beforecut -> elementOnbeforecut
539+ Beforecut -> on e E.beforeCut
531− Cut -> elementOncut
540+ Cut -> on e E.cut
532− Beforecopy -> elementOnbeforecopy
541+ Beforecopy -> on e E.beforeCopy
533− Copy -> elementOncopy
542+ Copy -> on e E.copy
534− Beforepaste -> elementOnbeforepaste
543+ Beforepaste -> on e E.beforePaste
535− Paste -> elementOnpaste
544+ Paste -> on e E.paste
536− Reset -> elementOnreset
545+ Reset -> on e E.reset
537− Search -> elementOnsearch
546+ Search -> on e E.search
538− Selectstart -> elementOnselectstart
547+ Selectstart -> on e E.selectStart
539− Touchstart -> elementOntouchstart
548+ Touchstart -> on e E.touchStart
540− Touchmove -> elementOntouchmove
549+ Touchmove -> on e E.touchMove
541− Touchend -> elementOntouchend
550+ Touchend -> on e E.touchEnd
542− Touchcancel -> elementOntouchcancel
551+ Touchcancel -> on e E.touchCancel
544newtype EventResult en = EventResult { unEventResult :: EventResultType en }
553newtype EventResult en = EventResult { unEventResult :: EventResultType en }
@@ -588,42 +597,43 @@ type family EventResultType (en :: EventTag) :: * where
588 EventResultType 'TouchmoveTag = ()
597 EventResultType 'TouchmoveTag = ()
589 EventResultType 'TouchendTag = ()
598 EventResultType 'TouchendTag = ()
590 EventResultType 'TouchcancelTag = ()
599 EventResultType 'TouchcancelTag = ()
600+ EventResultType 'MousewheelTag = ()
601+ EventResultType 'WheelTag = ()
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))
593wrapDomEventsMaybe element handlers = do
604wrapDomEventsMaybe element handlers = do
594 postGui <- askPostGui
605 postGui <- askPostGui
595 runWithActions <- askRunWithActions
606 runWithActions <- askRunWithActions
596 e <- newFanEventWithTrigger $ \(WrapArg en) et -> do
607 e <- newFanEventWithTrigger $ \(WrapArg en) et -> do
597− unsubscribe <- liftIO $ (onEventName en) element $ do
608+ unsubscribe <- onEventName en element $ do
598 mv <- handlers en
609 mv <- handlers en
599− forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> v]
610+ forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> Identity v]
600 return $ liftIO $ do
611 return $ liftIO $ do
601 unsubscribe
612 unsubscribe
602 return $! e
613 return $! e
604−getKeyEvent :: EventM UIEvent e Int
615+getKeyEvent :: EventM e KeyboardEvent Int
605getKeyEvent = do
616getKeyEvent = do
606 e <- event
617 e <- event
607− liftIO $ do
618+ which <- getWhich e
608− which <- uiEventGetWhich e
609− if which /= 0 then return which else do
619+ if which /= 0 then return which else do
610− charCode <- uiEventGetCharCode e
620+ charCode <- getCharCode e
611− if charCode /= 0 then return charCode else
621+ if charCode /= 0 then return charCode else
612− uiEventGetKeyCode e
622+ getKeyCode e
614−getMouseEventCoords :: EventM MouseEvent e (Int, Int)
624+getMouseEventCoords :: EventM e MouseEvent (Int, Int)
615getMouseEventCoords = do
625getMouseEventCoords = do
616 e <- event
626 e <- event
617− liftIO $ bisequence (mouseEventGetClientX e, mouseEventGetClientY e)
627+ bisequence (getX e, getY e)
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))
620defaultDomEventHandler e evt = liftM (Just . EventResult) $ case evt of
630defaultDomEventHandler e evt = liftM (Just . EventResult) $ case evt of
621 Click -> return ()
631 Click -> return ()
622 Dblclick -> return ()
632 Dblclick -> return ()
623 Keypress -> getKeyEvent
633 Keypress -> getKeyEvent
634+ Scroll -> getScrollTop e
624 Keydown -> getKeyEvent
635 Keydown -> getKeyEvent
625 Keyup -> getKeyEvent
636 Keyup -> getKeyEvent
626− Scroll -> liftIO $ elementGetScrollTop e
627 Mousemove -> getMouseEventCoords
637 Mousemove -> getMouseEventCoords
628 Mouseup -> getMouseEventCoords
638 Mouseup -> getMouseEventCoords
629 Mousedown -> getMouseEventCoords
639 Mousedown -> getMouseEventCoords
@@ -662,8 +672,10 @@ defaultDomEventHandler e evt = liftM (Just . EventResult) $ case evt of
662 Touchmove -> return ()
672 Touchmove -> return ()
663 Touchend -> return ()
673 Touchend -> return ()
664 Touchcancel -> return ()
674 Touchcancel -> return ()
675+ Mousewheel -> return ()
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)
667wrapElement eh e = do
679wrapElement eh e = do
668 es <- wrapDomEventsMaybe e $ eh e
680 es <- wrapDomEventsMaybe e $ eh e
669 return $ El e es
681 return $ El e es
@@ -748,17 +760,15 @@ simpleList xs mkChild = mapDyn (map snd . Map.toList) =<< flip list mkChild =<<
748elDynHtml' :: MonadWidget t m => String -> Dynamic t String -> m (El t)
760elDynHtml' :: MonadWidget t m => String -> Dynamic t String -> m (El t)
749elDynHtml' elementTag html = do
761elDynHtml' elementTag html = do
750 e <- buildEmptyElement elementTag (Map.empty :: Map String String)
762 e <- buildEmptyElement elementTag (Map.empty :: Map String String)
751− let h = castToHTMLElement e
752− schedulePostBuild $ liftIO . htmlElementSetInnerHTML h =<< sample (current html)
763+ schedulePostBuild $ setInnerHTML e . Just =<< sample (current html)
753− addVoidAction $ fmap (liftIO . htmlElementSetInnerHTML h) $ updated html
764+ addVoidAction $ fmap (setInnerHTML e . Just) $ updated html
754 wrapElement defaultDomEventHandler e
765 wrapElement defaultDomEventHandler e
756elDynHtmlAttr' :: MonadWidget t m => String -> Map String String -> Dynamic t String -> m (El t)
767elDynHtmlAttr' :: MonadWidget t m => String -> Map String String -> Dynamic t String -> m (El t)
757elDynHtmlAttr' elementTag attrs html = do
768elDynHtmlAttr' elementTag attrs html = do
758 e <- buildEmptyElement elementTag attrs
769 e <- buildEmptyElement elementTag attrs
759− let h = castToHTMLElement e
760− schedulePostBuild $ liftIO . htmlElementSetInnerHTML h =<< sample (current html)
770+ schedulePostBuild $ setInnerHTML e . Just =<< sample (current html)
761− addVoidAction $ fmap (liftIO . htmlElementSetInnerHTML h) $ updated html
771+ addVoidAction $ fmap (setInnerHTML e . Just) $ updated html
762 wrapElement defaultDomEventHandler e
772 wrapElement defaultDomEventHandler e
764data Link t
774data Link t
@@ -783,7 +793,7 @@ class HasDomEvent t a where
783 domEvent :: EventName en -> a -> Event t (EventResultType en)
793 domEvent :: EventName en -> a -> Event t (EventResultType en)
785instance Reflex t => HasDomEvent t (El t) where
795instance 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)
788linkClass :: MonadWidget t m => String -> String -> m (Link t)
798linkClass :: MonadWidget t m => String -> String -> m (Link t)
789linkClass s c = do
799linkClass s c = do
@@ -871,7 +881,7 @@ tabDisplay ulClass activeClass tabItems = do
871unsafePlaceElement :: MonadWidget t m => Element -> m (El t)
881unsafePlaceElement :: MonadWidget t m => Element -> m (El t)
872unsafePlaceElement e = do
882unsafePlaceElement e = do
873 p <- askParent
883 p <- askParent
874− _ <- liftIO $ nodeAppendChild p $ Just e
884+ _ <- appendChild p $ Just e
875 wrapElement defaultDomEventHandler e
885 wrapElement defaultDomEventHandler e
877deriveGEq ''EventName
887deriveGEq ''EventName