module GraphRewriting.GL.Menu (LabelledTree (..), setupMenu) where
import Prelude.Unicode
import Graphics.UI.GLUT as GLUT
import qualified Graphics.Rendering.OpenGL as GL
import GraphRewriting.GL.Global
import Data.IORef
import Control.Monad
import Data.Functor
import Control.Applicative
menuItemHeight = 20
font = Fixed9By15
setupMenu ∷ IORef (GlobalVars n) → IO ()
setupMenu globalVars = do
c ← liftM canvas $ readIORef globalVars
ruleTree ← getRules <$> readIORef globalVars
charWidth ← stringWidth font "0"
let cols = fromIntegral $ maximum $ map length $ lines $ showRuleTree ruleTree
let winWidth = (cols + 1) * min 10 charWidth
let ruleListLength = numNodes ruleTree
let winSize = Size winWidth (fromIntegral $ menuItemHeight * ruleListLength)
menu ← createSubWindow c (GL.Position 0 0) winSize
modifyIORef globalVars $ \x -> x {menu=menu}
clearColor $= (Color4 1 1 1 0 ∷ Color4 GLclampf)
GLUT.cursor $= GLUT.LeftArrow
selectRule 0 globalVars
displayCallback $= displayMenu globalVars
keyboardMouseCallback $= Just (inputCallback $ menuClick menu globalVars)
where
displayMenu globalVars = do
gv <- readIORef globalVars
clear [ColorBuffer]
color (Color3 0 0 0 ∷ Color3 GLfloat)
ruleTree ← getRules <$> readIORef globalVars
let ruleListLength = numNodes ruleTree
let displayLine line i = do
gv <- readIORef globalVars
if i ≡ selectedRule gv
then GL.color (GL.Color3 1 0 0 ∷ GL.Color3 GL.GLfloat)
else GL.color (GL.Color3 0 0 0 ∷ GL.Color3 GL.GLfloat)
windowPos (Vertex2 0 (fromIntegral $ (ruleListLength i 1) * menuItemHeight + 5) ∷ Vertex2 GLint)
renderString font line
zipWithM_ displayLine (lines $ showRuleTree ruleTree) [0..]
swapBuffers
inputCallback handler (MouseButton button) Up modifiers (Position x y) = do
let idx = fromIntegral y `div` menuItemHeight
handler button idx
inputCallback _ _ _ _ _ = return ()
menuClick menu globalVars LeftButton idx = do
modifyIORef globalVars $ \x -> x {selectedRule = idx}
gv <- readIORef globalVars
selectRule idx globalVars
redisplay menu
menuClick menu globalVars RightButton idx = do
gv <- readIORef globalVars
_ ← applyLeafRules id idx globalVars
highlight globalVars
menuClick _ _ _ _ = return ()