gloss-1.0.0.0: Graphics/Gloss/Internals/Interface/ViewPort/Command.hs
{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE PatternGuards #-}
module Graphics.Gloss.Internals.Interface.ViewPort.Command
( Command (..)
, defaultCommandConfig
, isCommand )
where
import Data.Map (Map)
import qualified Graphics.UI.GLUT as GLUT
import qualified Data.Map as Map
-- | The commands suported by the view controller
data Command
= CRestore
| CTranslate
| CRotate
-- bump zoom
| CBumpZoomOut
| CBumpZoomIn
-- bump translate
| CBumpLeft
| CBumpRight
| CBumpUp
| CBumpDown
-- bump rotate
| CBumpClockwise
| CBumpCClockwise
deriving (Show, Eq, Ord)
-- | The default commands
defaultCommandConfig
= [ (CRestore,
[ (GLUT.Char 'r', Nothing) ])
, (CTranslate,
[ ( GLUT.MouseButton GLUT.LeftButton
, Just (GLUT.Modifiers { GLUT.shift = GLUT.Up, GLUT.ctrl = GLUT.Up, GLUT.alt = GLUT.Up }))
])
, (CRotate,
[ ( GLUT.MouseButton GLUT.RightButton
, Nothing)
, ( GLUT.MouseButton GLUT.LeftButton
, Just (GLUT.Modifiers { GLUT.shift = GLUT.Up, GLUT.ctrl = GLUT.Down, GLUT.alt = GLUT.Up }))
])
-- bump zoom
, (CBumpZoomOut,
[ (GLUT.MouseButton GLUT.WheelDown, Nothing)
, (GLUT.SpecialKey GLUT.KeyPageDown, Nothing) ])
, (CBumpZoomIn,
[ (GLUT.MouseButton GLUT.WheelUp, Nothing)
, (GLUT.SpecialKey GLUT.KeyPageUp, Nothing)] )
-- bump translate
, (CBumpLeft,
[ (GLUT.SpecialKey GLUT.KeyLeft, Nothing) ])
, (CBumpRight,
[ (GLUT.SpecialKey GLUT.KeyRight, Nothing) ])
, (CBumpUp,
[ (GLUT.SpecialKey GLUT.KeyUp, Nothing) ])
, (CBumpDown,
[ (GLUT.SpecialKey GLUT.KeyDown, Nothing) ])
-- bump rotate
, (CBumpClockwise,
[ (GLUT.SpecialKey GLUT.KeyHome, Nothing) ])
, (CBumpCClockwise,
[ (GLUT.SpecialKey GLUT.KeyEnd, Nothing) ])
]
isCommand commands c key keyMods
| Just csMatch <- Map.lookup c commands
= or $ map (isCommand2 c key keyMods) csMatch
| otherwise
= False
isCommand2 c key keyMods cMatch
| (keyC, mModsC) <- cMatch
, keyC == key
, case mModsC of
Nothing -> True
Just modsC -> modsC == keyMods
= True
| otherwise
= False