module GraphRewriting.GL.Global where
import Graphics.UI.GLUT (addTimerCallback, Window, postRedisplay)
import GraphRewriting.Graph
import GraphRewriting.Graph.Read
import GraphRewriting.Rule
import GraphRewriting.Pattern
import Data.IORef
import GraphRewriting.Layout.RotPortSpec
import Data.Set as Set
import Control.Monad
data GlobalVars n = GlobalVars
{graph ∷ Graph n,
paused ∷ Bool,
selectedRule ∷ Rule n,
highlighted ∷ Set Node,
layoutStep ∷ Rewrite n (),
canvas ∷ Window}
redisplay ∷ Window → IO ()
redisplay = postRedisplay . Just
modifyGraph f globalVars = do
modifyIORef globalVars $ \v → v {graph = f $ graph v}
highlight globalVars
selectRule r globalVars = do
modifyIORef globalVars $ \v → v {selectedRule = r}
highlight globalVars
highlight globalVars = do
gv@GlobalVars {graph = g, selectedRule = rule, highlighted = h, canvas = c} ← readIORef globalVars
let h' = Set.fromList [head match | (match,rewrite) ← runPattern rule g]
writeIORef globalVars $ gv {highlighted = h'}
redisplay c
layoutLoop globalVars = do
gv@GlobalVars {graph = g, paused = p, layoutStep = l, canvas = c} ← readIORef globalVars
when (not p) $ do
examine position (head $ nodes g) `seq` return ()
writeIORef globalVars $ gv {graph = execGraph l g}
redisplay c
addTimerCallback 40 $ layoutLoop globalVars
pause globalVars = modifyIORef globalVars $ \vs → vs {paused = True}
resume globalVars = do
modifyIORef globalVars $ \vs → vs {paused = False}
layoutLoop globalVars