on develop help sign in
Add ability to update textNode from an Event reusing same node.
commit056617109e9d63fb196c930b605929780a1ccb64 authorLuigy Leon <luigy@outlook.com> dateThu 21 Jul 2016, 16:01 (10 years ago) parentfc4ad78
4 files changed+15−12
src/Reflex/Dom/Builder/Class.hs+5−3 src/Reflex/Dom/Builder/Immediate.hs+4−3 src/Reflex/Dom/Builder/Static.hs+3−2 src/Reflex/Dom/Widget/Basic.hs+3−4
src/Reflex/Dom/Builder/Class.hs+5−3
@@ -64,13 +64,15 @@ class (Monad m, Reflex t, Deletable t m, DomSpace (DomBuilderSpace m)) => DomBui
6464type Namespace = Text
6565
6666data TextNodeConfig t
67− = TextNodeConfig { _textNodeConfig_contents :: Text
67+ = TextNodeConfig { _textNodeConfig_initialContents :: Text
68+ , _textNodeConfig_setContents :: Event t Text
6869 }
6970
70−instance Default (TextNodeConfig t) where
71+instance (Reflex t) => Default (TextNodeConfig t) where
7172 {-# INLINABLE def #-}
7273 def = TextNodeConfig
73− { _textNodeConfig_contents = mempty
74+ { _textNodeConfig_initialContents = mempty
75+ , _textNodeConfig_setContents = never
7476 }
7577
7678data TextNode t = TextNode
src/Reflex/Dom/Builder/Immediate.hs+4−3
@@ -47,7 +47,7 @@ import qualified GHCJS.DOM.HTMLInputElement as Input
4747import qualified GHCJS.DOM.HTMLTextAreaElement as TextArea
4848import GHCJS.DOM.MouseEvent
4949import GHCJS.DOM.Node (appendChild, getOwnerDocument, getParentNode, getPreviousSibling, insertBefore,
50− removeChild, toNode)
50+ removeChild, toNode, setNodeValue)
5151import GHCJS.DOM.Types (FocusEvent, IsElement, IsEvent, IsNode, KeyboardEvent, Node, ToDOMString, TouchEvent,
5252 WheelEvent, castToHTMLInputElement, castToHTMLTextAreaElement)
5353import qualified GHCJS.DOM.Types as DOM
@@ -202,8 +202,9 @@ instance DomSpace GhcjsDomSpace where
202202instance SupportsImmediateDomBuilder t m => DomBuilder t (ImmediateDomBuilderT t m) where
203203 type DomBuilderSpace (ImmediateDomBuilderT t m) = GhcjsDomSpace
204204 {-# INLINABLE textNode #-}
205− textNode (TextNodeConfig contents) = do
206− _ <- textNodeInternal contents
205+ textNode (TextNodeConfig initialContents eSetContents) = do
206+ n <- textNodeInternal initialContents
207+ lift $ performEvent_ $ ffor eSetContents $ \t -> setNodeValue n (Just t)
207208 return TextNode
208209 {-# INLINABLE element #-}
209210 element elementTag cfg child = fst <$> makeElement elementTag cfg child
src/Reflex/Dom/Builder/Static.hs+3−2
@@ -119,8 +119,9 @@ instance DomSpace StaticDomSpace where
119119instance SupportsStaticDomBuilder t m => DomBuilder t (StaticDomBuilderT t m) where
120120 type DomBuilderSpace (StaticDomBuilderT t m) = StaticDomSpace
121121 {-# INLINABLE textNode #-}
122− textNode (TextNodeConfig contents) = StaticDomBuilderT $ do
123− modify $ (:) $ constant $ BL.toStrict $ toLazyByteString $ fromHtmlEscapedText contents
122+ textNode (TextNodeConfig initialContents setContents) = StaticDomBuilderT $ do
123+ let escape = BL.toStrict . toLazyByteString . fromHtmlEscapedText
124+ modify . (:) <=< hold (escape initialContents) $ fmap escape setContents
124125 return TextNode
125126
126127 {-# INLINABLE element #-}
src/Reflex/Dom/Widget/Basic.hs+3−4
@@ -85,16 +85,15 @@ listHoldWithKey initialChildren modifyChildren buildChild = do
8585 return $ fmap (fmap (fst . unChildResult)) augmentedResults
8686
8787text :: DomBuilder t m => Text -> m ()
88−text t = void $ textNode $ def & textNodeConfig_contents .~ t
88+text t = void $ textNode $ def & textNodeConfig_initialContents .~ t
8989
90−dynText :: (PostBuild t m, DomBuilder t m) => Dynamic t Text -> m ()
90+dynText :: forall t m. (PostBuild t m, DomBuilder t m) => Dynamic t Text -> m ()
9191dynText t = do
9292 postBuild <- getPostBuild
93− _ <- widgetHoldInternal (return ()) $ text <$> leftmost
93+ void $ textNode $ (def :: TextNodeConfig t) & textNodeConfig_setContents .~ leftmost
9494 [ updated t
9595 , tag (current t) postBuild
9696 ]
97− return ()
9897
9998display :: (PostBuild t m, DomBuilder t m, Show a) => Dynamic t a -> m ()
10099display = dynText . fmap (T.pack . show)