From 0cb8e4757077be15196b22cb65762f9189c2827b Mon Sep 17 00:00:00 2001
From: Jens Nolte <jens@nightmarestudio.de>
Date: Thu, 12 Mar 2020 00:51:54 +0100
Subject: [PATCH] Invalidate SignalBlock on click

---
 src/QBar/BlockHelper.hs | 33 +++++++++++++++++++++++++--------
 1 file changed, 25 insertions(+), 8 deletions(-)

diff --git a/src/QBar/BlockHelper.hs b/src/QBar/BlockHelper.hs
index 2109db0..c69ad73 100644
--- a/src/QBar/BlockHelper.hs
+++ b/src/QBar/BlockHelper.hs
@@ -10,11 +10,11 @@ import QBar.Time
 import Control.Concurrent.Async
 import qualified Control.Concurrent.Event as Event
 import Control.Concurrent.STM.TChan
+import Control.Monad.State (StateT, evalStateT, get, put)
 import Data.Either (isRight)
 import Pipes
-import Pipes.Core
 import Pipes.Concurrent
-
+import Pipes.Core
 
 data Signal a = RegularSignal | UserSignal a | EventSignal BlockEvent
   deriving (Show, Eq)
@@ -130,25 +130,44 @@ runSignalBlockConfiguration SignalBlockConfiguration{initialize, signalThread, s
           Event.set signalEvent
 
         signalPipe :: Proxy (Signal p) BlockUpdate () BlockUpdate BarIO ExitBlock
-        signalPipe = forever $ do
+        signalPipe = do
+          initial <- request RegularSignal
+          yield initial
+          evalStateT stateSignalPipe initial
+        stateSignalPipe :: StateT BlockUpdate (Proxy (Signal p) BlockUpdate () BlockUpdate BarIO) ExitBlock
+        stateSignalPipe = forever $ do
           -- Handle all queued events
           eventHandled <- sendQueuedEvents
 
           -- If there was no queued event signal a regular event
-          unless eventHandled $ yield =<< request RegularSignal
+          unless eventHandled $ outputAndStore RegularSignal
 
           -- Wait for next event
           liftIO $ Event.wait signalEvent
           liftIO $ Event.clear signalEvent
 
           where
-            sendQueuedEvents :: Proxy (Signal p) BlockUpdate () BlockUpdate BarIO Bool
+            sendQueuedEvents :: StateT BlockUpdate (Proxy (Signal p) BlockUpdate () BlockUpdate BarIO) Bool
             sendQueuedEvents = do
               maybeSignal <- liftIO . atomically $ tryReadTChan signalChan
               case maybeSignal of
-                Just signal -> (yield =<< request signal) >> sendQueuedEvents >> return True
+                Just signal -> do
+                  case signal of
+                    EventSignal _ -> do
+                      (state, _) <- get
+                      lift $ yield (invalidateBlockState state, UserUpdate)
+                    _ -> return ()
+                  outputAndStore signal
+                  void $ sendQueuedEvents
+                  return True
                 Nothing -> return False
 
+            outputAndStore :: Signal p -> StateT BlockUpdate (Proxy (Signal p) BlockUpdate () BlockUpdate BarIO) ()
+            outputAndStore signal = do
+              value <- lift $ request signal
+              put value
+              lift $ yield value
+
 
         intervalTimer :: BarIO ()
         intervalTimer = do
@@ -175,8 +194,6 @@ runSignalBlockConfiguration SignalBlockConfiguration{initialize, signalThread, s
               liftIO $ Event.set signalEvent
 
 
-
-
 -- |Converts a 'PollBlock' to a 'Block' by running it whenever the 'defaultInterval' is triggered.
 runPollBlock :: PollBlock -> Block
 runPollBlock = runPollBlock' defaultInterval
-- 
GitLab