module Haste.Events.MouseEvents (
MouseEvent (..), MouseData (..), MouseButton (..)
) where
import Haste.Events.Core
import Haste.Foreign
#if __GLASGOW_HASKELL__ < 710
import Control.Applicative
#endif
data MouseButton = MouseLeft | MouseMiddle | MouseRight
deriving (Show, Eq, Enum)
instance FromAny MouseButton where
fromAny = fmap toEnum . fromAny
data MouseData = MouseData {
mouseCoords :: !(Int, Int),
mouseButton :: !(Maybe MouseButton),
mouseWheelDeltas :: !(Double, Double, Double)
}
data MouseEvent
= Click
| DblClick
| MouseDown
| MouseUp
| MouseMove
| MouseOver
| MouseOut
| Wheel
instance Event MouseEvent where
type EventData MouseEvent = MouseData
eventName Click = "click"
eventName DblClick = "dblclick"
eventName MouseDown = "mousedown"
eventName MouseUp = "mouseup"
eventName MouseMove = "mousemove"
eventName MouseOver = "mouseover"
eventName MouseOut = "mouseout"
eventName Wheel = "wheel"
eventData Wheel e =
MouseData <$> jsGetMouseCoords e
<*> pure Nothing
<*> ((,,) <$> (get e "deltaX")
<*> (get e "deltaY")
<*> (get e "deltaZ"))
eventData _ e =
MouseData <$> jsGetMouseCoords e
<*> get e "button"
<*> pure (0,0,0)
jsGetMouseCoords :: JSAny -> IO (Int, Int)
jsGetMouseCoords = ffi "jsGetMouseCoords"