@@ -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
@@ -130,7 +130,7 @@ display a = dynText =<< mapDyn show a
130--TODO: Should this be renamed to 'widgetView' for consistency with 'widgetHold'?
130--TODO: Should this be renamed to 'widgetView' for consistency with 'widgetHold'?
131-- | Given a Dynamic of widget-creating actions, create a widget that is recreated whenever the Dynamic updates.
131-- | Given a Dynamic of widget-creating actions, create a widget that is recreated whenever the Dynamic updates.
132-- The returned Event of widget results occurs when the Dynamic does.
132-- The returned Event of widget results occurs when the Dynamic does.
133−-- Note: Often, the type 'a' is an Event, in which case the return value is an Event-of-Events that would typically be flattened.
133+-- Note: Often, the type 'a' is an Event, in which case the return value is an Event-of-Events that would typically be flattened (via 'switchPromptly').
134dyn :: MonadWidget t m => Dynamic t (m a) -> m (Event t a)
134dyn :: MonadWidget t m => Dynamic t (m a) -> m (Event t a)
135dyn child = do
135dyn child = do
136 postBuild <- getPostBuild
136 postBuild <- getPostBuild
@@ -158,17 +158,15 @@ widgetHoldInternal child0 newChild = do
158 tellWidgetOutput childOutput
158 tellWidgetOutput childOutput
159 doc <- askDocument
159 doc <- askDocument
160 runWidget <- getRunWidget
160 runWidget <- getRunWidget
162− Just df <- liftIO $ documentCreateDocumentFragment doc
163− (result, postBuild, voidActions) <- runWidget df c
164− runFrameWithTriggerRef newChildBuiltTriggerRef (result, voidActions)
166− mp' <- liftIO $ nodeGetParentNode endPlaceholder
167− forM_ mp' $ \p' -> liftIO $ nodeInsertBefore p' (Just df) (Just endPlaceholder)
169 addVoidAction $ ffor newChild $ \c -> do
161 addVoidAction $ ffor newChild $ \c -> do
162+ Just df <- createDocumentFragment doc
163+ (result, postBuild, voidActions) <- runWidget df c
164+ runFrameWithTriggerRef newChildBuiltTriggerRef (result, voidActions)
170 liftIO $ deleteBetweenExclusive startPlaceholder endPlaceholder
166 liftIO $ deleteBetweenExclusive startPlaceholder endPlaceholder
171− build c
167+ mp' <- getParentNode endPlaceholder
168+ forM_ mp' $ \p' -> insertBefore p' (Just df) (Just endPlaceholder)
172 return (result0, fmap fst newChildBuilt)
170 return (result0, fmap fst newChildBuilt)
174diffMapNoEq :: (Ord k) => Map k v -> Map k v -> Map k (Maybe v)
172diffMapNoEq :: (Ord k) => Map k v -> Map k v -> Map k (Maybe v)
@@ -209,7 +207,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
207 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
208 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 ->
209 listHoldWithKey initialVals (attachWith (flip (Map.differenceWith relevantDiff)) (current sentVals) valsChanged) $ \k v ->
212− mkChild k v $ select childValChangedSelector $ Const2 k
210+ 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.
212-- | 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))
213listHoldWithKey :: (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 +222,13 @@ listHoldWithKey initialVals valsChanged mkChild = do
224 result <- mkChild k v
222 result <- mkChild k v
225 childEnd <- text' ""
223 childEnd <- text' ""
226 return (result, (childStart, childEnd))
224 return (result, (childStart, childEnd))
227− Just dfOrig <- liftIO $ documentCreateDocumentFragment doc
225+ 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
226 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
227 stateRef <- liftIO $ newIORef initialState
230 children <- holdDyn initialState newChildren
228 children <- holdDyn initialState newChildren
231 tellWidgetOutput =<< mapDyn (fmap snd) children
229 tellWidgetOutput =<< mapDyn (fmap snd) children
232− mpOrig <- liftIO $ nodeGetParentNode endPlaceholder
230+ mpOrig <- liftIO $ getParentNode endPlaceholder
233− forM_ mpOrig $ \pOrig -> liftIO $ nodeInsertBefore pOrig (Just dfOrig) (Just endPlaceholder)
231+ forM_ mpOrig $ \pOrig -> liftIO $ insertBefore pOrig (Just dfOrig) (Just endPlaceholder)
234 addVoidAction $ flip fmap valsChanged $ \newVals -> do
232 addVoidAction $ flip fmap valsChanged $ \newVals -> do
235 curState <- liftIO $ readIORef stateRef
233 curState <- liftIO $ readIORef stateRef
236 --TODO: Should we remove the parent from the DOM first to avoid reflows?
234 --TODO: Should we remove the parent from the DOM first to avoid reflows?
@@ -240,24 +238,24 @@ listHoldWithKey initialVals valsChanged mkChild = do
240 return Nothing
238 return Nothing
241 These ((_, (start, end)), _) (Just v) -> do -- Replacing existing child
239 These ((_, (start, end)), _) (Just v) -> do -- Replacing existing child
242 liftIO $ deleteBetweenExclusive start end
240 liftIO $ deleteBetweenExclusive start end
243− Just df <- liftIO $ documentCreateDocumentFragment doc
241+ Just df <- createDocumentFragment doc
244 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
242 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
245 let s = (childResult, childVoidAction)
243 let s = (childResult, childVoidAction)
246 modify (>>childPostBuild)
244 modify (>>childPostBuild)
247− mp <- liftIO $ nodeGetParentNode end
245+ mp <- getParentNode end
248− forM_ mp $ \p -> liftIO $ nodeInsertBefore p (Just df) (Just end)
246+ forM_ mp $ \p -> insertBefore p (Just df) (Just end)
249 return $ Just s
247 return $ Just s
250 That Nothing -> return Nothing -- Deleting non-existent child
248 That Nothing -> return Nothing -- Deleting non-existent child
251 That (Just v) -> do -- Creating new child
249 That (Just v) -> do -- Creating new child
252− Just df <- liftIO $ documentCreateDocumentFragment doc
250+ Just df <- createDocumentFragment doc
253 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
251 (childResult, childPostBuild, childVoidAction) <- lift $ buildChild df k v
254 let s = (childResult, childVoidAction)
252 let s = (childResult, childVoidAction)
255 modify (>>childPostBuild)
253 modify (>>childPostBuild)
256 let placeholder = case Map.lookupGT k curState of
254 let placeholder = case Map.lookupGT k curState of
257 Nothing -> endPlaceholder
255 Nothing -> endPlaceholder
258 Just (_, ((_, (start, _)), _)) -> start
256 Just (_, ((_, (start, _)), _)) -> start
259− mp <- liftIO $ nodeGetParentNode placeholder
257+ mp <- getParentNode placeholder
260− forM_ mp $ \p -> liftIO $ nodeInsertBefore p (Just df) (Just placeholder)
258+ forM_ mp $ \p -> insertBefore p (Just df) (Just placeholder)
261 return $ Just s
259 return $ Just s
262 This state -> do -- No change
260 This state -> do -- No change
263 return $ Just state
261 return $ Just state
@@ -303,47 +301,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
301-- | s and e must both be children of the same node and s must precede e
304deleteBetweenExclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
302deleteBetweenExclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
305deleteBetweenExclusive s e = do
303deleteBetweenExclusive 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
304+ 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
305 case mCurrentParent of
308 Nothing -> return () --TODO: Is this the right behavior?
306 Nothing -> return () --TODO: Is this the right behavior?
309 Just currentParent -> do
307 Just currentParent -> do
310 let go = do
308 let go = do
311− Just x <- nodeGetPreviousSibling e -- This can't be Nothing because we should hit 's' first
309+ Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
312 when (toNode s /= toNode x) $ do
310 when (toNode s /= toNode x) $ do
313− _ <- nodeRemoveChild currentParent $ Just x
311+ _ <- removeChild currentParent $ Just x
317-- | s and e must both be children of the same node and s must precede e
315-- | s and e must both be children of the same node and s must precede e
318deleteBetweenInclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
316deleteBetweenInclusive :: (IsNode start, IsNode end) => start -> end -> IO ()
319deleteBetweenInclusive s e = do
317deleteBetweenInclusive 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
318+ 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
319 case mCurrentParent of
322 Nothing -> return () --TODO: Is this the right behavior?
320 Nothing -> return () --TODO: Is this the right behavior?
323 Just currentParent -> do
321 Just currentParent -> do
324 let go = do
322 let go = do
325− Just x <- nodeGetPreviousSibling e -- This can't be Nothing because we should hit 's' first
323+ Just x <- getPreviousSibling e -- This can't be Nothing because we should hit 's' first
326− _ <- nodeRemoveChild currentParent $ Just x
324+ _ <- removeChild currentParent $ Just x
327 when (toNode s /= toNode x) go
325 when (toNode s /= toNode x) go
329− _ <- nodeRemoveChild currentParent $ Just e
327+ _ <- removeChild currentParent $ Just e
330 return ()
328 return ()
330+nodeClear :: IsNode self => self -> IO ()
332+ mfc <- getFirstChild n
334+ Nothing -> return ()
336+ _ <- removeChild n $ Just fc
332--------------------------------------------------------------------------------
339--------------------------------------------------------------------------------
333-- Adapters
340-- Adapters
334--------------------------------------------------------------------------------
341--------------------------------------------------------------------------------
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)
343+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
344wrapDomEvent 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)
346+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
347wrapDomEventMaybe element elementOnevent getValue = do
341 postGui <- askPostGui
348 postGui <- askPostGui
342 runWithActions <- askRunWithActions
349 runWithActions <- askRunWithActions
343 e <- newEventWithTrigger $ \et -> do
350 e <- newEventWithTrigger $ \et -> do
344 unsubscribe <- {-# SCC "a" #-} liftIO $ {-# SCC "b" #-} elementOnevent element $ {-# SCC "c" #-} do
351 unsubscribe <- {-# SCC "a" #-} liftIO $ {-# SCC "b" #-} elementOnevent element $ {-# SCC "c" #-} do
345 mv <- {-# SCC "d" #-} getValue
352 mv <- {-# SCC "d" #-} getValue
346− forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> v]
353+ forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> Identity v]
347 return $ liftIO $ do
354 return $ liftIO $ do
348 {-# SCC "e" #-} unsubscribe
355 {-# SCC "e" #-} unsubscribe
349 return $! {-# SCC "f" #-} e
356 return $! {-# SCC "f" #-} e
@@ -377,11 +384,11 @@ data EventTag
377 | MouseoutTag
384 | MouseoutTag
378 | MouseoverTag
385 | MouseoverTag
379 | MouseupTag
386 | 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
387+ | MousewheelTag
381 | ScrollTag
388 | ScrollTag
382 | SelectTag
389 | SelectTag
383 | SubmitTag
390 | SubmitTag
384−-- | WheelTag -- See MousewheelTag
391+ | WheelTag
385 | BeforecutTag
392 | BeforecutTag
387 | BeforecopyTag
394 | BeforecopyTag
@@ -425,11 +432,11 @@ data EventName :: EventTag -> * where
425 Mouseout :: EventName 'MouseoutTag
432 Mouseout :: EventName 'MouseoutTag
426 Mouseover :: EventName 'MouseoverTag
433 Mouseover :: EventName 'MouseoverTag
427 Mouseup :: EventName 'MouseupTag
434 Mouseup :: EventName 'MouseupTag
428− --Mousewheel :: EventName 'MousewheelTag
435+ Mousewheel :: EventName 'MousewheelTag
429 Scroll :: EventName 'ScrollTag
436 Scroll :: EventName 'ScrollTag
430 Select :: EventName 'SelectTag
437 Select :: EventName 'SelectTag
431 Submit :: EventName 'SubmitTag
438 Submit :: EventName 'SubmitTag
432− --Wheel :: EventName 'WheelTag
439+ Wheel :: EventName 'WheelTag
433 Beforecut :: EventName 'BeforecutTag
440 Beforecut :: EventName 'BeforecutTag
434 Cut :: EventName 'CutTag
441 Cut :: EventName 'CutTag
435 Beforecopy :: EventName 'BeforecopyTag
442 Beforecopy :: EventName 'BeforecopyTag
@@ -446,8 +453,8 @@ data EventName :: EventTag -> * where
447type family EventType en where
454type family EventType en where
448 EventType 'AbortTag = UIEvent
455 EventType 'AbortTag = UIEvent
449− EventType 'BlurTag = UIEvent
456+ EventType 'BlurTag = FocusEvent
450− EventType 'ChangeTag = UIEvent
457+ EventType 'ChangeTag = DOM.Event
451 EventType 'ClickTag = MouseEvent
458 EventType 'ClickTag = MouseEvent
452 EventType 'ContextmenuTag = MouseEvent
459 EventType 'ContextmenuTag = MouseEvent
453 EventType 'DblclickTag = MouseEvent
460 EventType 'DblclickTag = MouseEvent
@@ -459,87 +466,87 @@ type family EventType en where
459 EventType 'DragstartTag = MouseEvent
466 EventType 'DragstartTag = MouseEvent
460 EventType 'DropTag = MouseEvent
467 EventType 'DropTag = MouseEvent
461 EventType 'ErrorTag = UIEvent
468 EventType 'ErrorTag = UIEvent
462− EventType 'FocusTag = UIEvent
469+ EventType 'FocusTag = FocusEvent
463− EventType 'InputTag = UIEvent
470+ EventType 'InputTag = DOM.Event
464− EventType 'InvalidTag = UIEvent
471+ EventType 'InvalidTag = DOM.Event
465− EventType 'KeydownTag = UIEvent
472+ EventType 'KeydownTag = KeyboardEvent
466− EventType 'KeypressTag = UIEvent
473+ EventType 'KeypressTag = KeyboardEvent
467− EventType 'KeyupTag = UIEvent
474+ EventType 'KeyupTag = KeyboardEvent
468 EventType 'LoadTag = UIEvent
475 EventType 'LoadTag = UIEvent
469 EventType 'MousedownTag = MouseEvent
476 EventType 'MousedownTag = MouseEvent
470− EventType 'MouseenterTag = UIEvent
477+ EventType 'MouseenterTag = MouseEvent
471− EventType 'MouseleaveTag = UIEvent
478+ EventType 'MouseleaveTag = MouseEvent
472 EventType 'MousemoveTag = MouseEvent
479 EventType 'MousemoveTag = MouseEvent
473 EventType 'MouseoutTag = MouseEvent
480 EventType 'MouseoutTag = MouseEvent
474 EventType 'MouseoverTag = MouseEvent
481 EventType 'MouseoverTag = MouseEvent
475 EventType 'MouseupTag = MouseEvent
482 EventType 'MouseupTag = MouseEvent
476− --EventType 'MousewheelTag = MouseEvent
483+ EventType 'MousewheelTag = MouseEvent
477 EventType 'ScrollTag = UIEvent
484 EventType 'ScrollTag = UIEvent
478 EventType 'SelectTag = UIEvent
485 EventType 'SelectTag = UIEvent
479− EventType 'SubmitTag = UIEvent
486+ EventType 'SubmitTag = DOM.Event
480− --EventType 'WheelTag = UIEvent
487+ EventType 'WheelTag = WheelEvent
481− EventType 'BeforecutTag = UIEvent
488+ EventType 'BeforecutTag = DOM.Event
482− EventType 'CutTag = UIEvent
489+ EventType 'CutTag = DOM.Event
483− EventType 'BeforecopyTag = UIEvent
490+ EventType 'BeforecopyTag = DOM.Event
484− EventType 'CopyTag = UIEvent
491+ EventType 'CopyTag = DOM.Event
485− EventType 'BeforepasteTag = UIEvent
492+ EventType 'BeforepasteTag = DOM.Event
486− EventType 'PasteTag = UIEvent
493+ EventType 'PasteTag = DOM.Event
487− EventType 'ResetTag = UIEvent
494+ EventType 'ResetTag = DOM.Event
488− EventType 'SearchTag = UIEvent
495+ EventType 'SearchTag = DOM.Event
489− EventType 'SelectstartTag = UIEvent
496+ EventType 'SelectstartTag = DOM.Event
490− EventType 'TouchstartTag = UIEvent
497+ EventType 'TouchstartTag = TouchEvent
491− EventType 'TouchmoveTag = UIEvent
498+ EventType 'TouchmoveTag = TouchEvent
492− EventType 'TouchendTag = UIEvent
499+ EventType 'TouchendTag = TouchEvent
493− EventType 'TouchcancelTag = UIEvent
500+ EventType 'TouchcancelTag = TouchEvent
495−onEventName :: IsElement e => EventName en -> e -> EventM (EventType en) e () -> IO (IO ())
502+onEventName :: IsElement e => EventName en -> e -> EventM e (EventType en) () -> IO (IO ())
496−onEventName en = case en of
503+onEventName en e = case en of
497− Abort -> elementOnabort
504+ Abort -> on e E.abort
498− Blur -> elementOnblur
505+ Blur -> on e E.blurEvent
499− Change -> elementOnchange
506+ Change -> on e E.change
500− Click -> elementOnclick
507+ Click -> on e E.click
501− Contextmenu -> elementOncontextmenu
508+ Contextmenu -> on e E.contextMenu
502− Dblclick -> elementOndblclick
509+ Dblclick -> on e E.dblClick
503− Drag -> elementOndrag
510+ Drag -> on e E.drag
504− Dragend -> elementOndragend
511+ Dragend -> on e E.dragEnd
505− Dragenter -> elementOndragenter
512+ Dragenter -> on e E.dragEnter
506− Dragleave -> elementOndragleave
513+ Dragleave -> on e E.dragLeave
507− Dragover -> elementOndragover
514+ Dragover -> on e E.dragOver
508− Dragstart -> elementOndragstart
515+ Dragstart -> on e E.dragStart
509− Drop -> elementOndrop
516+ Drop -> on e E.drop
510− Error -> elementOnerror
517+ Error -> on e E.error
511− Focus -> elementOnfocus
518+ Focus -> on e E.focusEvent
512− Input -> elementOninput
519+ Input -> on e E.input
513− Invalid -> elementOninvalid
520+ Invalid -> on e E.invalid
514− Keydown -> elementOnkeydown
521+ Keydown -> on e E.keyDown
515− Keypress -> elementOnkeypress
522+ Keypress -> on e E.keyPress
516− Keyup -> elementOnkeyup
523+ Keyup -> on e E.keyUp
517− Load -> elementOnload
524+ Load -> on e E.load
518− Mousedown -> elementOnmousedown
525+ Mousedown -> on e E.mouseDown
519− Mouseenter -> elementOnmouseenter
526+ Mouseenter -> on e E.mouseEnter
520− Mouseleave -> elementOnmouseleave
527+ Mouseleave -> on e E.mouseLeave
521− Mousemove -> elementOnmousemove
528+ Mousemove -> on e E.mouseMove
522− Mouseout -> elementOnmouseout
529+ Mouseout -> on e E.mouseOut
523− Mouseover -> elementOnmouseover
530+ Mouseover -> on e E.mouseOver
524− Mouseup -> elementOnmouseup
531+ Mouseup -> on e E.mouseUp
525− --Mousewheel -> elementOnmousewheel
532+ Mousewheel -> on e E.mouseWheel
526− Scroll -> elementOnscroll
533+ Scroll -> on e E.scroll
527− Select -> elementOnselect
534+ Select -> on e E.select
528− Submit -> elementOnsubmit
535+ Submit -> on e E.submit
529− --Wheel -> elementOnwheel
536+ Wheel -> on e E.wheel
530− Beforecut -> elementOnbeforecut
537+ Beforecut -> on e E.beforeCut
531− Cut -> elementOncut
538+ Cut -> on e E.cut
532− Beforecopy -> elementOnbeforecopy
539+ Beforecopy -> on e E.beforeCopy
533− Copy -> elementOncopy
540+ Copy -> on e E.copy
534− Beforepaste -> elementOnbeforepaste
541+ Beforepaste -> on e E.beforePaste
535− Paste -> elementOnpaste
542+ Paste -> on e E.paste
536− Reset -> elementOnreset
543+ Reset -> on e E.reset
537− Search -> elementOnsearch
544+ Search -> on e E.search
538− Selectstart -> elementOnselectstart
545+ Selectstart -> on e E.selectStart
539− Touchstart -> elementOntouchstart
546+ Touchstart -> on e E.touchStart
540− Touchmove -> elementOntouchmove
547+ Touchmove -> on e E.touchMove
541− Touchend -> elementOntouchend
548+ Touchend -> on e E.touchEnd
542− Touchcancel -> elementOntouchcancel
549+ Touchcancel -> on e E.touchCancel
544newtype EventResult en = EventResult { unEventResult :: EventResultType en }
551newtype EventResult en = EventResult { unEventResult :: EventResultType en }
@@ -588,42 +595,43 @@ type family EventResultType (en :: EventTag) :: * where
588 EventResultType 'TouchmoveTag = ()
595 EventResultType 'TouchmoveTag = ()
589 EventResultType 'TouchendTag = ()
596 EventResultType 'TouchendTag = ()
590 EventResultType 'TouchcancelTag = ()
597 EventResultType 'TouchcancelTag = ()
598+ EventResultType 'MousewheelTag = ()
599+ 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))
601+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
602wrapDomEventsMaybe element handlers = do
594 postGui <- askPostGui
603 postGui <- askPostGui
595 runWithActions <- askRunWithActions
604 runWithActions <- askRunWithActions
596 e <- newFanEventWithTrigger $ \(WrapArg en) et -> do
605 e <- newFanEventWithTrigger $ \(WrapArg en) et -> do
597− unsubscribe <- liftIO $ (onEventName en) element $ do
606+ unsubscribe <- onEventName en element $ do
598 mv <- handlers en
607 mv <- handlers en
599− forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> v]
608+ forM_ mv $ \v -> liftIO $ postGui $ runWithActions [et :=> Identity v]
600 return $ liftIO $ do
609 return $ liftIO $ do
601 unsubscribe
610 unsubscribe
602 return $! e
611 return $! e
604−getKeyEvent :: EventM UIEvent e Int
613+getKeyEvent :: EventM e KeyboardEvent Int
605getKeyEvent = do
614getKeyEvent = do
606 e <- event
615 e <- event
607− liftIO $ do
616+ which <- getWhich e
608− which <- uiEventGetWhich e
609− if which /= 0 then return which else do
617+ if which /= 0 then return which else do
610− charCode <- uiEventGetCharCode e
618+ charCode <- getCharCode e
611− if charCode /= 0 then return charCode else
619+ if charCode /= 0 then return charCode else
612− uiEventGetKeyCode e
620+ getKeyCode e
614−getMouseEventCoords :: EventM MouseEvent e (Int, Int)
622+getMouseEventCoords :: EventM e MouseEvent (Int, Int)
615getMouseEventCoords = do
623getMouseEventCoords = do
616 e <- event
624 e <- event
617− liftIO $ bisequence (mouseEventGetClientX e, mouseEventGetClientY e)
625+ bisequence (getX e, getY e)
619−defaultDomEventHandler :: IsElement e => e -> EventName en -> EventM (EventType en) e (Maybe (EventResult en))
627+defaultDomEventHandler :: IsElement e => e -> EventName en -> EventM e (EventType en) (Maybe (EventResult en))
620defaultDomEventHandler e evt = liftM (Just . EventResult) $ case evt of
628defaultDomEventHandler e evt = liftM (Just . EventResult) $ case evt of
621 Click -> return ()
629 Click -> return ()
622 Dblclick -> return ()
630 Dblclick -> return ()
623 Keypress -> getKeyEvent
631 Keypress -> getKeyEvent
632+ Scroll -> getScrollTop e
624 Keydown -> getKeyEvent
633 Keydown -> getKeyEvent
625 Keyup -> getKeyEvent
634 Keyup -> getKeyEvent
626− Scroll -> liftIO $ elementGetScrollTop e
627 Mousemove -> getMouseEventCoords
635 Mousemove -> getMouseEventCoords
628 Mouseup -> getMouseEventCoords
636 Mouseup -> getMouseEventCoords
629 Mousedown -> getMouseEventCoords
637 Mousedown -> getMouseEventCoords
@@ -662,8 +670,10 @@ defaultDomEventHandler e evt = liftM (Just . EventResult) $ case evt of
662 Touchmove -> return ()
670 Touchmove -> return ()
663 Touchend -> return ()
671 Touchend -> return ()
664 Touchcancel -> return ()
672 Touchcancel -> return ()
673+ 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)
676+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
677wrapElement eh e = do
668 es <- wrapDomEventsMaybe e $ eh e
678 es <- wrapDomEventsMaybe e $ eh e
669 return $ El e es
679 return $ El e es
@@ -748,17 +758,15 @@ simpleList xs mkChild = mapDyn (map snd . Map.toList) =<< flip list mkChild =<<
748elDynHtml' :: MonadWidget t m => String -> Dynamic t String -> m (El t)
758elDynHtml' :: MonadWidget t m => String -> Dynamic t String -> m (El t)
749elDynHtml' elementTag html = do
759elDynHtml' elementTag html = do
750 e <- buildEmptyElement elementTag (Map.empty :: Map String String)
760 e <- buildEmptyElement elementTag (Map.empty :: Map String String)
751− let h = castToHTMLElement e
752− schedulePostBuild $ liftIO . htmlElementSetInnerHTML h =<< sample (current html)
761+ schedulePostBuild $ setInnerHTML e . Just =<< sample (current html)
753− addVoidAction $ fmap (liftIO . htmlElementSetInnerHTML h) $ updated html
762+ addVoidAction $ fmap (setInnerHTML e . Just) $ updated html
754 wrapElement defaultDomEventHandler e
763 wrapElement defaultDomEventHandler e
756elDynHtmlAttr' :: MonadWidget t m => String -> Map String String -> Dynamic t String -> m (El t)
765elDynHtmlAttr' :: MonadWidget t m => String -> Map String String -> Dynamic t String -> m (El t)
757elDynHtmlAttr' elementTag attrs html = do
766elDynHtmlAttr' elementTag attrs html = do
758 e <- buildEmptyElement elementTag attrs
767 e <- buildEmptyElement elementTag attrs
759− let h = castToHTMLElement e
760− schedulePostBuild $ liftIO . htmlElementSetInnerHTML h =<< sample (current html)
768+ schedulePostBuild $ setInnerHTML e . Just =<< sample (current html)
761− addVoidAction $ fmap (liftIO . htmlElementSetInnerHTML h) $ updated html
769+ addVoidAction $ fmap (setInnerHTML e . Just) $ updated html
762 wrapElement defaultDomEventHandler e
770 wrapElement defaultDomEventHandler e
764data Link t
772data Link t
@@ -783,7 +791,7 @@ class HasDomEvent t a where
783 domEvent :: EventName en -> a -> Event t (EventResultType en)
791 domEvent :: EventName en -> a -> Event t (EventResultType en)
785instance Reflex t => HasDomEvent t (El t) where
793instance Reflex t => HasDomEvent t (El t) where
786− domEvent en e = fmap unEventResult $ select (_el_events e) (WrapArg en)
794+ domEvent en e = fmap unEventResult $ Reflex.select (_el_events e) (WrapArg en)
788linkClass :: MonadWidget t m => String -> String -> m (Link t)
796linkClass :: MonadWidget t m => String -> String -> m (Link t)
789linkClass s c = do
797linkClass s c = do
@@ -795,7 +803,7 @@ link s = linkClass s ""
796button :: MonadWidget t m => String -> m (Event t ())
804button :: MonadWidget t m => String -> m (Event t ())
797button s = do
805button s = do
798− (e, _) <- el' "button" $ text s
806+ (e, _) <- elAttr' "button" (Map.singleton "type" "button") $ text s
799 return $ domEvent Click e
807 return $ domEvent Click e
801newtype Workflow t m a = Workflow { unWorkflow :: m (a, Event t (Workflow t m a)) }
809newtype Workflow t m a = Workflow { unWorkflow :: m (a, Event t (Workflow t m a)) }
@@ -811,6 +819,9 @@ workflowView w0 = do
811 eReplace <- liftM switch $ hold never $ fmap snd eResult
819 eReplace <- liftM switch $ hold never $ fmap snd eResult
812 return $ fmap fst eResult
820 return $ fmap fst eResult
822+mapWorkflow :: (MonadWidget t m) => (a -> b) -> Workflow t m a -> Workflow t m b
823+mapWorkflow f (Workflow x) = Workflow (fmap (\(v,e) -> (f v, fmap (mapWorkflow f) e)) x)
814divClass :: forall t m a. MonadWidget t m => String -> m a -> m a
825divClass :: forall t m a. MonadWidget t m => String -> m a -> m a
815divClass = elClass "div"
826divClass = elClass "div"
@@ -858,7 +869,7 @@ tabDisplay ulClass activeClass tabItems = do
858 _ <- listWithKey dTabs (\k dTab -> do
869 _ <- listWithKey dTabs (\k dTab -> do
859 dAttrs <- mapDyn (\sel -> do
870 dAttrs <- mapDyn (\sel -> do
860 let t1 = listToMaybe $ Map.keys tabItems
871 let t1 = listToMaybe $ Map.keys tabItems
861− if sel == Just k || (sel == Nothing && t1 == Just k) then Map.empty else Map.singleton "style" "display:none;") dCurrentTab
872+ if sel == Just k || (sel == Nothing && t1 == Just k) then Map.empty else Map.singleton "style" "display:none;") dCurrentTab
862 elDynAttr "div" dAttrs $ dyn =<< mapDyn snd dTab)
873 elDynAttr "div" dAttrs $ dyn =<< mapDyn snd dTab)
863 return ()
874 return ()
@@ -873,7 +884,7 @@ tabDisplay ulClass activeClass tabItems = do
873unsafePlaceElement :: MonadWidget t m => Element -> m (El t)
884unsafePlaceElement :: MonadWidget t m => Element -> m (El t)
874unsafePlaceElement e = do
885unsafePlaceElement e = do
875 p <- askParent
886 p <- askParent
876− _ <- liftIO $ nodeAppendChild p $ Just e
887+ _ <- appendChild p $ Just e
877 wrapElement defaultDomEventHandler e
888 wrapElement defaultDomEventHandler e
879deriveGEq ''EventName
890deriveGEq ''EventName