{-# LANGUAGE RecordWildCards #-}
module Potato.Flow.Controller.Input (
KeyModifier(..)
, KeyboardData(..)
, KeyboardKey(..)
, MouseButton(..)
, MouseDragState(..)
, LMouseData(..)
, MouseDrag(..)
, mouseDrag_isActive
, newDrag
, continueDrag
, cancelDrag
, mouseDragDelta
, RelMouseDrag(..)
, toRelMouseDrag
) where
import Relude
import Potato.Flow.Math
import Potato.Flow.OwlState
import Control.Exception (assert)
import Data.Default
data KeyModifier = KeyModifier_Shift | KeyModifier_Alt | KeyModifier_Ctrl deriving (Int -> KeyModifier -> ShowS
[KeyModifier] -> ShowS
KeyModifier -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KeyModifier] -> ShowS
$cshowList :: [KeyModifier] -> ShowS
show :: KeyModifier -> String
$cshow :: KeyModifier -> String
showsPrec :: Int -> KeyModifier -> ShowS
$cshowsPrec :: Int -> KeyModifier -> ShowS
Show, KeyModifier -> KeyModifier -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: KeyModifier -> KeyModifier -> Bool
$c/= :: KeyModifier -> KeyModifier -> Bool
== :: KeyModifier -> KeyModifier -> Bool
$c== :: KeyModifier -> KeyModifier -> Bool
Eq)
data KeyboardData = KeyboardData KeyboardKey [KeyModifier] deriving (Int -> KeyboardData -> ShowS
[KeyboardData] -> ShowS
KeyboardData -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KeyboardData] -> ShowS
$cshowList :: [KeyboardData] -> ShowS
show :: KeyboardData -> String
$cshow :: KeyboardData -> String
showsPrec :: Int -> KeyboardData -> ShowS
$cshowsPrec :: Int -> KeyboardData -> ShowS
Show)
data KeyboardKey =
KeyboardKey_Esc
| KeyboardKey_Return
| KeyboardKey_Space
| KeyboardKey_Delete
| KeyboardKey_Backspace
| KeyboardKey_Left
| KeyboardKey_Right
| KeyboardKey_Up
| KeyboardKey_Down
| KeyboardKey_Home
| KeyboardKey_End
| KeyboardKey_PageUp
| KeyboardKey_PageDown
| KeyboardKey_Char Char
| KeyboardKey_Paste Text
| KeyboardKey_Scroll Int
deriving (Int -> KeyboardKey -> ShowS
[KeyboardKey] -> ShowS
KeyboardKey -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [KeyboardKey] -> ShowS
$cshowList :: [KeyboardKey] -> ShowS
show :: KeyboardKey -> String
$cshow :: KeyboardKey -> String
showsPrec :: Int -> KeyboardKey -> ShowS
$cshowsPrec :: Int -> KeyboardKey -> ShowS
Show, KeyboardKey -> KeyboardKey -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: KeyboardKey -> KeyboardKey -> Bool
$c/= :: KeyboardKey -> KeyboardKey -> Bool
== :: KeyboardKey -> KeyboardKey -> Bool
$c== :: KeyboardKey -> KeyboardKey -> Bool
Eq)
data MouseButton = MouseButton_Left | MouseButton_Middle | MouseButton_Right deriving (Int -> MouseButton -> ShowS
[MouseButton] -> ShowS
MouseButton -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MouseButton] -> ShowS
$cshowList :: [MouseButton] -> ShowS
show :: MouseButton -> String
$cshow :: MouseButton -> String
showsPrec :: Int -> MouseButton -> ShowS
$cshowsPrec :: Int -> MouseButton -> ShowS
Show, MouseButton -> MouseButton -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MouseButton -> MouseButton -> Bool
$c/= :: MouseButton -> MouseButton -> Bool
== :: MouseButton -> MouseButton -> Bool
$c== :: MouseButton -> MouseButton -> Bool
Eq)
data MouseDragState = MouseDragState_Down | MouseDragState_Dragging | MouseDragState_Up | MouseDragState_Cancelled deriving (Int -> MouseDragState -> ShowS
[MouseDragState] -> ShowS
MouseDragState -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MouseDragState] -> ShowS
$cshowList :: [MouseDragState] -> ShowS
show :: MouseDragState -> String
$cshow :: MouseDragState -> String
showsPrec :: Int -> MouseDragState -> ShowS
$cshowsPrec :: Int -> MouseDragState -> ShowS
Show, MouseDragState -> MouseDragState -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MouseDragState -> MouseDragState -> Bool
$c/= :: MouseDragState -> MouseDragState -> Bool
== :: MouseDragState -> MouseDragState -> Bool
$c== :: MouseDragState -> MouseDragState -> Bool
Eq)
data LMouseData = LMouseData {
LMouseData -> XY
_lMouseData_position :: XY
, LMouseData -> Bool
_lMouseData_isRelease :: Bool
, LMouseData -> MouseButton
_lMouseData_button :: MouseButton
, LMouseData -> [KeyModifier]
_lMouseData_modifiers :: [KeyModifier]
, LMouseData -> Bool
_lMouseData_isLayerMouse :: Bool
} deriving (Int -> LMouseData -> ShowS
[LMouseData] -> ShowS
LMouseData -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LMouseData] -> ShowS
$cshowList :: [LMouseData] -> ShowS
show :: LMouseData -> String
$cshow :: LMouseData -> String
showsPrec :: Int -> LMouseData -> ShowS
$cshowsPrec :: Int -> LMouseData -> ShowS
Show, LMouseData -> LMouseData -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: LMouseData -> LMouseData -> Bool
$c/= :: LMouseData -> LMouseData -> Bool
== :: LMouseData -> LMouseData -> Bool
$c== :: LMouseData -> LMouseData -> Bool
Eq)
data MouseDrag = MouseDrag {
MouseDrag -> XY
_mouseDrag_from :: XY
, MouseDrag -> MouseButton
_mouseDrag_button :: MouseButton
, MouseDrag -> [KeyModifier]
_mouseDrag_modifiers :: [KeyModifier]
, MouseDrag -> XY
_mouseDrag_to :: XY
, MouseDrag -> MouseDragState
_mouseDrag_state :: MouseDragState
, MouseDrag -> Bool
_mouseDrag_isLayerMouse :: Bool
} deriving (Int -> MouseDrag -> ShowS
[MouseDrag] -> ShowS
MouseDrag -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MouseDrag] -> ShowS
$cshowList :: [MouseDrag] -> ShowS
show :: MouseDrag -> String
$cshow :: MouseDrag -> String
showsPrec :: Int -> MouseDrag -> ShowS
$cshowsPrec :: Int -> MouseDrag -> ShowS
Show, MouseDrag -> MouseDrag -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MouseDrag -> MouseDrag -> Bool
$c/= :: MouseDrag -> MouseDrag -> Bool
== :: MouseDrag -> MouseDrag -> Bool
$c== :: MouseDrag -> MouseDrag -> Bool
Eq)
mouseDrag_isActive :: MouseDrag -> Bool
mouseDrag_isActive :: MouseDrag -> Bool
mouseDrag_isActive MouseDrag {Bool
[KeyModifier]
XY
MouseDragState
MouseButton
_mouseDrag_isLayerMouse :: Bool
_mouseDrag_state :: MouseDragState
_mouseDrag_to :: XY
_mouseDrag_modifiers :: [KeyModifier]
_mouseDrag_button :: MouseButton
_mouseDrag_from :: XY
_mouseDrag_isLayerMouse :: MouseDrag -> Bool
_mouseDrag_state :: MouseDrag -> MouseDragState
_mouseDrag_to :: MouseDrag -> XY
_mouseDrag_modifiers :: MouseDrag -> [KeyModifier]
_mouseDrag_button :: MouseDrag -> MouseButton
_mouseDrag_from :: MouseDrag -> XY
..} = case MouseDragState
_mouseDrag_state of
MouseDragState
MouseDragState_Down -> Bool
True
MouseDragState
MouseDragState_Dragging -> Bool
True
MouseDragState
_ -> Bool
False
instance Default MouseDrag where
def :: MouseDrag
def = MouseDrag {
_mouseDrag_from :: XY
_mouseDrag_from = XY
0
, _mouseDrag_button :: MouseButton
_mouseDrag_button = MouseButton
MouseButton_Left
, _mouseDrag_modifiers :: [KeyModifier]
_mouseDrag_modifiers = []
, _mouseDrag_to :: XY
_mouseDrag_to = XY
0
, _mouseDrag_state :: MouseDragState
_mouseDrag_state = MouseDragState
MouseDragState_Up
, _mouseDrag_isLayerMouse :: Bool
_mouseDrag_isLayerMouse = Bool
False
}
newDrag :: LMouseData -> MouseDrag
newDrag :: LMouseData -> MouseDrag
newDrag LMouseData {Bool
[KeyModifier]
XY
MouseButton
_lMouseData_isLayerMouse :: Bool
_lMouseData_modifiers :: [KeyModifier]
_lMouseData_button :: MouseButton
_lMouseData_isRelease :: Bool
_lMouseData_position :: XY
_lMouseData_isLayerMouse :: LMouseData -> Bool
_lMouseData_modifiers :: LMouseData -> [KeyModifier]
_lMouseData_button :: LMouseData -> MouseButton
_lMouseData_isRelease :: LMouseData -> Bool
_lMouseData_position :: LMouseData -> XY
..} = forall a. (?callStack::CallStack) => Bool -> a -> a
assert (Bool -> Bool
not Bool
_lMouseData_isRelease) forall a b. (a -> b) -> a -> b
$ MouseDrag {
_mouseDrag_from :: XY
_mouseDrag_from = XY
_lMouseData_position
, _mouseDrag_button :: MouseButton
_mouseDrag_button = MouseButton
_lMouseData_button
, _mouseDrag_modifiers :: [KeyModifier]
_mouseDrag_modifiers = [KeyModifier]
_lMouseData_modifiers
, _mouseDrag_to :: XY
_mouseDrag_to = XY
_lMouseData_position
, _mouseDrag_state :: MouseDragState
_mouseDrag_state = MouseDragState
MouseDragState_Down
, _mouseDrag_isLayerMouse :: Bool
_mouseDrag_isLayerMouse = Bool
_lMouseData_isLayerMouse
}
continueDrag :: LMouseData -> MouseDrag -> MouseDrag
continueDrag :: LMouseData -> MouseDrag -> MouseDrag
continueDrag LMouseData {Bool
[KeyModifier]
XY
MouseButton
_lMouseData_isLayerMouse :: Bool
_lMouseData_modifiers :: [KeyModifier]
_lMouseData_button :: MouseButton
_lMouseData_isRelease :: Bool
_lMouseData_position :: XY
_lMouseData_isLayerMouse :: LMouseData -> Bool
_lMouseData_modifiers :: LMouseData -> [KeyModifier]
_lMouseData_button :: LMouseData -> MouseButton
_lMouseData_isRelease :: LMouseData -> Bool
_lMouseData_position :: LMouseData -> XY
..} MouseDrag
md = MouseDrag
md {
_mouseDrag_to :: XY
_mouseDrag_to = XY
_lMouseData_position
, _mouseDrag_state :: MouseDragState
_mouseDrag_state = if Bool
_lMouseData_isRelease
then MouseDragState
MouseDragState_Up
else MouseDragState
MouseDragState_Dragging
, _mouseDrag_modifiers :: [KeyModifier]
_mouseDrag_modifiers = [KeyModifier]
_lMouseData_modifiers
}
cancelDrag :: MouseDrag -> MouseDrag
cancelDrag :: MouseDrag -> MouseDrag
cancelDrag MouseDrag
md = MouseDrag
md { _mouseDrag_state :: MouseDragState
_mouseDrag_state = case MouseDrag -> MouseDragState
_mouseDrag_state MouseDrag
md of
MouseDragState
MouseDragState_Up -> MouseDragState
MouseDragState_Up
MouseDragState
_ -> MouseDragState
MouseDragState_Cancelled
}
mouseDragDelta :: MouseDrag -> MouseDrag -> XY
mouseDragDelta :: MouseDrag -> MouseDrag -> XY
mouseDragDelta MouseDrag
md MouseDrag
prev = (MouseDrag -> XY
_mouseDrag_to MouseDrag
md) forall a. Num a => a -> a -> a
- (MouseDrag -> XY
_mouseDrag_to MouseDrag
prev)
newtype RelMouseDrag = RelMouseDrag MouseDrag deriving (Int -> RelMouseDrag -> ShowS
[RelMouseDrag] -> ShowS
RelMouseDrag -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RelMouseDrag] -> ShowS
$cshowList :: [RelMouseDrag] -> ShowS
show :: RelMouseDrag -> String
$cshow :: RelMouseDrag -> String
showsPrec :: Int -> RelMouseDrag -> ShowS
$cshowsPrec :: Int -> RelMouseDrag -> ShowS
Show)
toRelMouseDrag :: OwlPFState -> XY -> MouseDrag -> RelMouseDrag
toRelMouseDrag :: OwlPFState -> XY -> MouseDrag -> RelMouseDrag
toRelMouseDrag OwlPFState
pfs XY
pan MouseDrag
md = MouseDrag -> RelMouseDrag
RelMouseDrag forall a b. (a -> b) -> a -> b
$ MouseDrag
md {
_mouseDrag_from :: XY
_mouseDrag_from = OwlPFState -> XY -> XY
owlPFState_toCanvasCoordinates OwlPFState
pfs (MouseDrag -> XY
_mouseDrag_from MouseDrag
md) forall a. Num a => a -> a -> a
- XY
pan
, _mouseDrag_to :: XY
_mouseDrag_to = OwlPFState -> XY -> XY
owlPFState_toCanvasCoordinates OwlPFState
pfs (MouseDrag -> XY
_mouseDrag_to MouseDrag
md) forall a. Num a => a -> a -> a
- XY
pan
}