Skip to content

Commit

Permalink
Fix animation widget raising onFinished event when it is no longer re…
Browse files Browse the repository at this point in the history
…levant (#252)

* fix animation bug

* update animation tests
  • Loading branch information
Deltaspace0 authored Feb 1, 2023
1 parent a9ee596 commit b8d3b82
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 13 deletions.
11 changes: 6 additions & 5 deletions src/Monomer/Widgets/Animation/Fade.hs
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ makeFade isFadeIn config state = widget where
period = 20
steps = fromIntegral $ duration `div` period

finishedReq node = delayedMessage node AnimationFinished duration
finishedReq node ts = delayedMessage node (AnimationFinished ts) duration
renderReq wenv node = req where
widgetId = node ^. L.info . L.widgetId
req = RenderEvery widgetId period (Just steps)
Expand All @@ -167,7 +167,7 @@ makeFade isFadeIn config state = widget where
newNode = node
& L.widget .~ makeFade isFadeIn config (FadeState True ts)
result
| autoStart = resultReqs newNode [finishedReq node, renderReq wenv node]
| autoStart = resultReqs newNode [finishedReq node ts, renderReq wenv node]
| otherwise = resultNode node

merge wenv node oldNode oldState = resultNode newNode where
Expand All @@ -181,16 +181,17 @@ makeFade isFadeIn config state = widget where
widgetId = node ^. L.info . L.widgetId
ts = wenv ^. L.timestamp
startState = FadeState True ts
startReqs = [finishedReq node, renderReq wenv node]
startReqs = [finishedReq node ts, renderReq wenv node]

newNode newState = node
& L.widget .~ makeFade isFadeIn config newState
result = case msg of
AnimationStart -> resultReqs (newNode startState) startReqs
AnimationStop -> resultReqs (newNode def) [RenderStop widgetId]
AnimationFinished
| _fdsRunning state -> resultEvts node (_fdcOnFinished config)
AnimationFinished ts'
| isRelevant -> resultEvts node (_fdcOnFinished config)
| otherwise -> resultNode node
where isRelevant = _fdsRunning state && ts' == _fdsStartTs state

render wenv node renderer = do
saveContext renderer
Expand Down
11 changes: 6 additions & 5 deletions src/Monomer/Widgets/Animation/Slide.hs
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ makeSlide isSlideIn config state = widget where
period = 20
steps = fromIntegral $ duration `div` period

finishedReq node = delayedMessage node AnimationFinished duration
finishedReq node ts = delayedMessage node (AnimationFinished ts) duration
renderReq wenv node = req where
widgetId = node ^. L.info . L.widgetId
req = RenderEvery widgetId period (Just steps)
Expand All @@ -200,7 +200,7 @@ makeSlide isSlideIn config state = widget where
newNode = node
& L.widget .~ makeSlide isSlideIn config (SlideState True ts)
result
| autoStart = resultReqs newNode [finishedReq node, renderReq wenv node]
| autoStart = resultReqs newNode [finishedReq node ts, renderReq wenv node]
| otherwise = resultNode node

merge wenv node oldNode oldState = resultNode newNode where
Expand All @@ -214,16 +214,17 @@ makeSlide isSlideIn config state = widget where
widgetId = node ^. L.info . L.widgetId
ts = wenv ^. L.timestamp
startState = SlideState True ts
startReqs = [finishedReq node, renderReq wenv node]
startReqs = [finishedReq node ts, renderReq wenv node]

newNode newState = node
& L.widget .~ makeSlide isSlideIn config newState
result = case msg of
AnimationStart -> resultReqs (newNode startState) startReqs
AnimationStop -> resultReqs (newNode def) [RenderStop widgetId]
AnimationFinished
| _slsRunning state -> resultEvts node (_slcOnFinished config)
AnimationFinished ts'
| isRelevant -> resultEvts node (_slcOnFinished config)
| otherwise -> resultNode node
where isRelevant = _slsRunning state && ts' == _slsStartTs state

render wenv node renderer = do
saveContext renderer
Expand Down
4 changes: 3 additions & 1 deletion src/Monomer/Widgets/Animation/Types.hs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ Common types for animation widgets.
-}
module Monomer.Widgets.Animation.Types where

import Monomer.Core.WidgetTypes (Millisecond)

-- | Message animation widgets usually support. Controls animation state.
data AnimationMsg
-- | Starts the animation from the beginning, even if it's running.
Expand All @@ -20,5 +22,5 @@ data AnimationMsg
Indicates the animation has finished. This is usually generated by the widget
itself for clean up.
-}
| AnimationFinished
| AnimationFinished Millisecond
deriving (Eq, Show)
2 changes: 1 addition & 1 deletion test/unit/Monomer/Widgets/Animation/FadeSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ handleMessage = describe "handleMessage" $ do
evts AnimationStop `shouldBe` Seq.empty

it "should generate an event if AnimationFinished is received" $
evts AnimationFinished `shouldBe` Seq.singleton OnTestFinished
evts (AnimationFinished 0) `shouldBe` Seq.singleton OnTestFinished

where
wenv = mockWenv ()
Expand Down
2 changes: 1 addition & 1 deletion test/unit/Monomer/Widgets/Animation/SlideSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ handleMessage = describe "handleMessage" $ do
evts AnimationStop `shouldBe` Seq.empty

it "should generate an event if AnimationFinished is received" $
evts AnimationFinished `shouldBe` Seq.singleton OnTestFinished
evts (AnimationFinished 0) `shouldBe` Seq.singleton OnTestFinished

where
wenv = mockWenv ()
Expand Down

0 comments on commit b8d3b82

Please sign in to comment.