{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  Miso.Event.Types
-- Copyright   :  (C) 2016-2018 David M. Johnson
-- License     :  BSD3-style (see the file LICENSE)
-- Maintainer  :  David M. Johnson <djohnson.m@gmail.com>
-- Stability   :  experimental
-- Portability :  non-portable
----------------------------------------------------------------------------
module Miso.Event.Types where

import qualified Data.Map as M
import           GHC.Generics
import           GHCJS.Marshal (ToJSVal)
import           Miso.String
import           Data.Aeson (FromJSON)

-- | Type useful for both KeyCode and additional key press information.
data KeyInfo
  = KeyInfo
  { KeyInfo -> KeyCode
keyCode :: !KeyCode
  , KeyInfo -> Bool
shiftKey, KeyInfo -> Bool
metaKey, KeyInfo -> Bool
ctrlKey, KeyInfo -> Bool
altKey :: !Bool
  } deriving (Int -> KeyInfo -> ShowS
[KeyInfo] -> ShowS
KeyInfo -> String
(Int -> KeyInfo -> ShowS)
-> (KeyInfo -> String) -> ([KeyInfo] -> ShowS) -> Show KeyInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KeyInfo] -> ShowS
$cshowList :: [KeyInfo] -> ShowS
show :: KeyInfo -> String
$cshow :: KeyInfo -> String
showsPrec :: Int -> KeyInfo -> ShowS
$cshowsPrec :: Int -> KeyInfo -> ShowS
Show, KeyInfo -> KeyInfo -> Bool
(KeyInfo -> KeyInfo -> Bool)
-> (KeyInfo -> KeyInfo -> Bool) -> Eq KeyInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: KeyInfo -> KeyInfo -> Bool
$c/= :: KeyInfo -> KeyInfo -> Bool
== :: KeyInfo -> KeyInfo -> Bool
$c== :: KeyInfo -> KeyInfo -> Bool
Eq)

-- | Type used for Keyboard events.
--
-- See <https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#Browser_compatibility>
newtype KeyCode = KeyCode Int
  deriving (Int -> KeyCode -> ShowS
[KeyCode] -> ShowS
KeyCode -> String
(Int -> KeyCode -> ShowS)
-> (KeyCode -> String) -> ([KeyCode] -> ShowS) -> Show KeyCode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KeyCode] -> ShowS
$cshowList :: [KeyCode] -> ShowS
show :: KeyCode -> String
$cshow :: KeyCode -> String
showsPrec :: Int -> KeyCode -> ShowS
$cshowsPrec :: Int -> KeyCode -> ShowS
Show, KeyCode -> KeyCode -> Bool
(KeyCode -> KeyCode -> Bool)
-> (KeyCode -> KeyCode -> Bool) -> Eq KeyCode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: KeyCode -> KeyCode -> Bool
$c/= :: KeyCode -> KeyCode -> Bool
== :: KeyCode -> KeyCode -> Bool
$c== :: KeyCode -> KeyCode -> Bool
Eq, Eq KeyCode
Eq KeyCode
-> (KeyCode -> KeyCode -> Ordering)
-> (KeyCode -> KeyCode -> Bool)
-> (KeyCode -> KeyCode -> Bool)
-> (KeyCode -> KeyCode -> Bool)
-> (KeyCode -> KeyCode -> Bool)
-> (KeyCode -> KeyCode -> KeyCode)
-> (KeyCode -> KeyCode -> KeyCode)
-> Ord KeyCode
KeyCode -> KeyCode -> Bool
KeyCode -> KeyCode -> Ordering
KeyCode -> KeyCode -> KeyCode
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: KeyCode -> KeyCode -> KeyCode
$cmin :: KeyCode -> KeyCode -> KeyCode
max :: KeyCode -> KeyCode -> KeyCode
$cmax :: KeyCode -> KeyCode -> KeyCode
>= :: KeyCode -> KeyCode -> Bool
$c>= :: KeyCode -> KeyCode -> Bool
> :: KeyCode -> KeyCode -> Bool
$c> :: KeyCode -> KeyCode -> Bool
<= :: KeyCode -> KeyCode -> Bool
$c<= :: KeyCode -> KeyCode -> Bool
< :: KeyCode -> KeyCode -> Bool
$c< :: KeyCode -> KeyCode -> Bool
compare :: KeyCode -> KeyCode -> Ordering
$ccompare :: KeyCode -> KeyCode -> Ordering
$cp1Ord :: Eq KeyCode
Ord, Value -> Parser [KeyCode]
Value -> Parser KeyCode
(Value -> Parser KeyCode)
-> (Value -> Parser [KeyCode]) -> FromJSON KeyCode
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [KeyCode]
$cparseJSONList :: Value -> Parser [KeyCode]
parseJSON :: Value -> Parser KeyCode
$cparseJSON :: Value -> Parser KeyCode
FromJSON)

-- | Type used for Checkbox events.
newtype Checked = Checked Bool
  deriving (Int -> Checked -> ShowS
[Checked] -> ShowS
Checked -> String
(Int -> Checked -> ShowS)
-> (Checked -> String) -> ([Checked] -> ShowS) -> Show Checked
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Checked] -> ShowS
$cshowList :: [Checked] -> ShowS
show :: Checked -> String
$cshow :: Checked -> String
showsPrec :: Int -> Checked -> ShowS
$cshowsPrec :: Int -> Checked -> ShowS
Show, Checked -> Checked -> Bool
(Checked -> Checked -> Bool)
-> (Checked -> Checked -> Bool) -> Eq Checked
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Checked -> Checked -> Bool
$c/= :: Checked -> Checked -> Bool
== :: Checked -> Checked -> Bool
$c== :: Checked -> Checked -> Bool
Eq, Eq Checked
Eq Checked
-> (Checked -> Checked -> Ordering)
-> (Checked -> Checked -> Bool)
-> (Checked -> Checked -> Bool)
-> (Checked -> Checked -> Bool)
-> (Checked -> Checked -> Bool)
-> (Checked -> Checked -> Checked)
-> (Checked -> Checked -> Checked)
-> Ord Checked
Checked -> Checked -> Bool
Checked -> Checked -> Ordering
Checked -> Checked -> Checked
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Checked -> Checked -> Checked
$cmin :: Checked -> Checked -> Checked
max :: Checked -> Checked -> Checked
$cmax :: Checked -> Checked -> Checked
>= :: Checked -> Checked -> Bool
$c>= :: Checked -> Checked -> Bool
> :: Checked -> Checked -> Bool
$c> :: Checked -> Checked -> Bool
<= :: Checked -> Checked -> Bool
$c<= :: Checked -> Checked -> Bool
< :: Checked -> Checked -> Bool
$c< :: Checked -> Checked -> Bool
compare :: Checked -> Checked -> Ordering
$ccompare :: Checked -> Checked -> Ordering
$cp1Ord :: Eq Checked
Ord, Value -> Parser [Checked]
Value -> Parser Checked
(Value -> Parser Checked)
-> (Value -> Parser [Checked]) -> FromJSON Checked
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Checked]
$cparseJSONList :: Value -> Parser [Checked]
parseJSON :: Value -> Parser Checked
$cparseJSON :: Value -> Parser Checked
FromJSON)

-- | Options for handling event propagation.
data Options = Options {
    Options -> Bool
preventDefault :: Bool
  , Options -> Bool
stopPropagation :: Bool
  } deriving (Int -> Options -> ShowS
[Options] -> ShowS
Options -> String
(Int -> Options -> ShowS)
-> (Options -> String) -> ([Options] -> ShowS) -> Show Options
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Options] -> ShowS
$cshowList :: [Options] -> ShowS
show :: Options -> String
$cshow :: Options -> String
showsPrec :: Int -> Options -> ShowS
$cshowsPrec :: Int -> Options -> ShowS
Show, Options -> Options -> Bool
(Options -> Options -> Bool)
-> (Options -> Options -> Bool) -> Eq Options
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Options -> Options -> Bool
$c/= :: Options -> Options -> Bool
== :: Options -> Options -> Bool
$c== :: Options -> Options -> Bool
Eq, (forall x. Options -> Rep Options x)
-> (forall x. Rep Options x -> Options) -> Generic Options
forall x. Rep Options x -> Options
forall x. Options -> Rep Options x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Options x -> Options
$cfrom :: forall x. Options -> Rep Options x
Generic)

instance ToJSVal Options

-- | Default value for 'Options'.
--
-- > defaultOptions = Options { preventDefault = False, stopPropagation = False }
defaultOptions :: Options
defaultOptions :: Options
defaultOptions = Bool -> Bool -> Options
Options Bool
False Bool
False

-- | Related to using drop-related events
newtype AllowDrop = AllowDrop Bool
  deriving (Int -> AllowDrop -> ShowS
[AllowDrop] -> ShowS
AllowDrop -> String
(Int -> AllowDrop -> ShowS)
-> (AllowDrop -> String)
-> ([AllowDrop] -> ShowS)
-> Show AllowDrop
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AllowDrop] -> ShowS
$cshowList :: [AllowDrop] -> ShowS
show :: AllowDrop -> String
$cshow :: AllowDrop -> String
showsPrec :: Int -> AllowDrop -> ShowS
$cshowsPrec :: Int -> AllowDrop -> ShowS
Show, AllowDrop -> AllowDrop -> Bool
(AllowDrop -> AllowDrop -> Bool)
-> (AllowDrop -> AllowDrop -> Bool) -> Eq AllowDrop
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AllowDrop -> AllowDrop -> Bool
$c/= :: AllowDrop -> AllowDrop -> Bool
== :: AllowDrop -> AllowDrop -> Bool
$c== :: AllowDrop -> AllowDrop -> Bool
Eq, Value -> Parser [AllowDrop]
Value -> Parser AllowDrop
(Value -> Parser AllowDrop)
-> (Value -> Parser [AllowDrop]) -> FromJSON AllowDrop
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [AllowDrop]
$cparseJSONList :: Value -> Parser [AllowDrop]
parseJSON :: Value -> Parser AllowDrop
$cparseJSON :: Value -> Parser AllowDrop
FromJSON)

-- | Default delegated events
defaultEvents :: M.Map MisoString Bool
defaultEvents :: Map MisoString Bool
defaultEvents = [(MisoString, Bool)] -> Map MisoString Bool
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [
    (MisoString
"blur", Bool
True)
  , (MisoString
"change", Bool
False)
  , (MisoString
"click", Bool
False)
  , (MisoString
"dblclick", Bool
False)
  , (MisoString
"focus", Bool
False)
  , (MisoString
"input", Bool
False)
  , (MisoString
"keydown", Bool
False)
  , (MisoString
"keypress", Bool
False)
  , (MisoString
"keyup", Bool
False)
  , (MisoString
"mouseup", Bool
False)
  , (MisoString
"mousedown", Bool
False)
  , (MisoString
"mouseenter", Bool
True)
  , (MisoString
"mouseleave", Bool
False)
  , (MisoString
"mouseover", Bool
False)
  , (MisoString
"mouseout", Bool
False)
  , (MisoString
"dragstart", Bool
False)
  , (MisoString
"dragover", Bool
False)
  , (MisoString
"dragend", Bool
False)
  , (MisoString
"dragenter", Bool
False)
  , (MisoString
"dragleave", Bool
False)
  , (MisoString
"drag", Bool
False)
  , (MisoString
"drop", Bool
False)
  , (MisoString
"submit", Bool
False)
  ]