module EventFlags (buttonClickFlag , changeMStateAllEventxClick) where import Graphics.Rendering.OpenGL import Graphics.UI.GLUT import States import VectorMaps import PositionMaps import Control.Applicative import qualified Data.Map as Map ------クリックに対してボタンフラグを認めるかの判定 buttonClickFlag :: EventKey -> MState -> DState -> KState -> Bool buttonClickFlag ekey mst dst kst = let rButton = (Map.lookup ekey (eButtons dst)) in case rButton of Nothing -> False Just x -> if (buttonClickConti x mst) then buttonClick x dst kst else False ------クリックによってMStateイベントの変更 changeMStateEventxClick :: DState -> KState -> MState -> EventKey -> MState changeMStateEventxClick dst kst mst ekey = let ex = (\(Just x) -> x) (Map.lookup ekey (events mst)) exx = Map.insert ekey (changeEventxClick ex (buttonClickFlag ekey mst dst kst)) (events mst) in mStateChangeEvents mst exx ------クリックによってすべてのMStateイベントの変更 changeMStateAllEventxClick :: DState -> KState -> MState -> MState changeMStateAllEventxClick dst kst mst = let ekeys = Map.keys (events mst) in (foldl (changeMStateEventxClick dst kst ) mst ekeys) ------クリックによってイベントの変更 changeEventxClick :: Eventx -> Bool -> Eventx changeEventxClick ex clickB | (eventType ex) == Continue = if clickB then changeEventx ex (not (eventFlag ex)) else ex | (eventType ex) == AppOnce = changeEventx ex clickB ------ボタンをクリックしたかの判定 buttonClick :: EButton -> DState -> KState -> Bool buttonClick eB dst kst = let bWidth = buttonWidth eB bHeight = buttonHeight eB bPos = buttonPosition eB cPos = fmap (getWCoordPos dst) (clickPos kst) in case cPos of Nothing -> False Just cPos' -> ((&&) <$> ((<) <$> (vectorSubtract cPos' bPos) <*> (Vector2 bWidth bHeight)) <*> ((>) <$> (vectorSubtract cPos' bPos) <*> (Vector2 0 0))) == (Vector2 True True) -------ボタン連続入力の可否 buttonClickConti :: EButton -> MState -> Bool buttonClickConti eB mst = let keyM = keyInM mst in if (continuous eB) then True else (fst keyM) /= (snd keyM)