module Termbox.Internal.Mouse
  ( Mouse (..),
    MouseButton
      ( MouseButton,
        LeftClick,
        MiddleClick,
        RightClick,
        ReleaseClick,
        WheelDown,
        WheelUp
      ),
  )
where

import GHC.Generics (Generic)
import Termbox.Bindings.Hs
  ( Tb_key
      ( TB_KEY_MOUSE_LEFT,
        TB_KEY_MOUSE_MIDDLE,
        TB_KEY_MOUSE_RELEASE,
        TB_KEY_MOUSE_RIGHT,
        TB_KEY_MOUSE_WHEEL_DOWN,
        TB_KEY_MOUSE_WHEEL_UP
      ),
  )
import Termbox.Internal.Pos (Pos)

-- | A mouse event.
data Mouse = Mouse
  { Mouse -> MouseButton
button :: !MouseButton,
    Mouse -> Pos
pos :: !Pos
  }
  deriving stock (Mouse -> Mouse -> Bool
(Mouse -> Mouse -> Bool) -> (Mouse -> Mouse -> Bool) -> Eq Mouse
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Mouse -> Mouse -> Bool
== :: Mouse -> Mouse -> Bool
$c/= :: Mouse -> Mouse -> Bool
/= :: Mouse -> Mouse -> Bool
Eq, (forall x. Mouse -> Rep Mouse x)
-> (forall x. Rep Mouse x -> Mouse) -> Generic Mouse
forall x. Rep Mouse x -> Mouse
forall x. Mouse -> Rep Mouse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Mouse -> Rep Mouse x
from :: forall x. Mouse -> Rep Mouse x
$cto :: forall x. Rep Mouse x -> Mouse
to :: forall x. Rep Mouse x -> Mouse
Generic, Eq Mouse
Eq Mouse =>
(Mouse -> Mouse -> Ordering)
-> (Mouse -> Mouse -> Bool)
-> (Mouse -> Mouse -> Bool)
-> (Mouse -> Mouse -> Bool)
-> (Mouse -> Mouse -> Bool)
-> (Mouse -> Mouse -> Mouse)
-> (Mouse -> Mouse -> Mouse)
-> Ord Mouse
Mouse -> Mouse -> Bool
Mouse -> Mouse -> Ordering
Mouse -> Mouse -> Mouse
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
$ccompare :: Mouse -> Mouse -> Ordering
compare :: Mouse -> Mouse -> Ordering
$c< :: Mouse -> Mouse -> Bool
< :: Mouse -> Mouse -> Bool
$c<= :: Mouse -> Mouse -> Bool
<= :: Mouse -> Mouse -> Bool
$c> :: Mouse -> Mouse -> Bool
> :: Mouse -> Mouse -> Bool
$c>= :: Mouse -> Mouse -> Bool
>= :: Mouse -> Mouse -> Bool
$cmax :: Mouse -> Mouse -> Mouse
max :: Mouse -> Mouse -> Mouse
$cmin :: Mouse -> Mouse -> Mouse
min :: Mouse -> Mouse -> Mouse
Ord, Int -> Mouse -> ShowS
[Mouse] -> ShowS
Mouse -> String
(Int -> Mouse -> ShowS)
-> (Mouse -> String) -> ([Mouse] -> ShowS) -> Show Mouse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Mouse -> ShowS
showsPrec :: Int -> Mouse -> ShowS
$cshow :: Mouse -> String
show :: Mouse -> String
$cshowList :: [Mouse] -> ShowS
showList :: [Mouse] -> ShowS
Show)

-- | A mouse button.
newtype MouseButton
  = MouseButton Tb_key
  deriving stock (MouseButton -> MouseButton -> Bool
(MouseButton -> MouseButton -> Bool)
-> (MouseButton -> MouseButton -> Bool) -> Eq MouseButton
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MouseButton -> MouseButton -> Bool
== :: MouseButton -> MouseButton -> Bool
$c/= :: MouseButton -> MouseButton -> Bool
/= :: MouseButton -> MouseButton -> Bool
Eq, Eq MouseButton
Eq MouseButton =>
(MouseButton -> MouseButton -> Ordering)
-> (MouseButton -> MouseButton -> Bool)
-> (MouseButton -> MouseButton -> Bool)
-> (MouseButton -> MouseButton -> Bool)
-> (MouseButton -> MouseButton -> Bool)
-> (MouseButton -> MouseButton -> MouseButton)
-> (MouseButton -> MouseButton -> MouseButton)
-> Ord MouseButton
MouseButton -> MouseButton -> Bool
MouseButton -> MouseButton -> Ordering
MouseButton -> MouseButton -> MouseButton
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
$ccompare :: MouseButton -> MouseButton -> Ordering
compare :: MouseButton -> MouseButton -> Ordering
$c< :: MouseButton -> MouseButton -> Bool
< :: MouseButton -> MouseButton -> Bool
$c<= :: MouseButton -> MouseButton -> Bool
<= :: MouseButton -> MouseButton -> Bool
$c> :: MouseButton -> MouseButton -> Bool
> :: MouseButton -> MouseButton -> Bool
$c>= :: MouseButton -> MouseButton -> Bool
>= :: MouseButton -> MouseButton -> Bool
$cmax :: MouseButton -> MouseButton -> MouseButton
max :: MouseButton -> MouseButton -> MouseButton
$cmin :: MouseButton -> MouseButton -> MouseButton
min :: MouseButton -> MouseButton -> MouseButton
Ord)

instance Show MouseButton where
  show :: MouseButton -> String
show = \case
    MouseButton
LeftClick -> String
"LeftClick"
    MouseButton
MiddleClick -> String
"MiddleClick"
    MouseButton
ReleaseClick -> String
"ReleaseClick"
    MouseButton
RightClick -> String
"RightClick"
    MouseButton
WheelDown -> String
"WheelDown"
    MouseButton
WheelUp -> String
"WheelUp"

pattern LeftClick :: MouseButton
pattern $mLeftClick :: forall {r}. MouseButton -> ((# #) -> r) -> ((# #) -> r) -> r
$bLeftClick :: MouseButton
LeftClick = MouseButton TB_KEY_MOUSE_LEFT

pattern MiddleClick :: MouseButton
pattern $mMiddleClick :: forall {r}. MouseButton -> ((# #) -> r) -> ((# #) -> r) -> r
$bMiddleClick :: MouseButton
MiddleClick = MouseButton TB_KEY_MOUSE_MIDDLE

pattern RightClick :: MouseButton
pattern $mRightClick :: forall {r}. MouseButton -> ((# #) -> r) -> ((# #) -> r) -> r
$bRightClick :: MouseButton
RightClick = MouseButton TB_KEY_MOUSE_RIGHT

pattern ReleaseClick :: MouseButton
pattern $mReleaseClick :: forall {r}. MouseButton -> ((# #) -> r) -> ((# #) -> r) -> r
$bReleaseClick :: MouseButton
ReleaseClick = MouseButton TB_KEY_MOUSE_RELEASE

pattern WheelDown :: MouseButton
pattern $mWheelDown :: forall {r}. MouseButton -> ((# #) -> r) -> ((# #) -> r) -> r
$bWheelDown :: MouseButton
WheelDown = MouseButton TB_KEY_MOUSE_WHEEL_DOWN

pattern WheelUp :: MouseButton
pattern $mWheelUp :: forall {r}. MouseButton -> ((# #) -> r) -> ((# #) -> r) -> r
$bWheelUp :: MouseButton
WheelUp = MouseButton TB_KEY_MOUSE_WHEEL_UP

{-# COMPLETE LeftClick, MiddleClick, ReleaseClick, RightClick, WheelDown, WheelUp #-}