module Engine.Events.MouseButton
( ClickHandler
, callback
, handler
) where
import RIO
import Geomancy (Vec2)
import UnliftIO.Resource (ReleaseKey)
import Engine.Events.Sink (Sink)
import Engine.Types (StageRIO)
import Engine.Window.MouseButton (ModifierKeys, MouseButton, MouseButtonState)
import Engine.Window.MouseButton qualified as MouseButton
import Engine.Worker qualified as Worker
type ClickHandler e st =
Sink e st ->
Vec2 ->
(ModifierKeys, MouseButtonState, MouseButton) ->
StageRIO st ()
callback
:: ( Worker.HasOutput cursor
, Worker.GetOutput cursor ~ Vec2
)
=> cursor
-> ClickHandler e st
-> Sink e st
-> StageRIO st ReleaseKey
callback :: forall cursor e st.
(HasOutput cursor, GetOutput cursor ~ Vec2) =>
cursor -> ClickHandler e st -> Sink e st -> StageRIO st ReleaseKey
callback cursor
cursorP ClickHandler e st
eventHandler = forall st. Callback st -> StageRIO st ReleaseKey
MouseButton.callback forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall cursor e st.
(HasOutput cursor, GetOutput cursor ~ Vec2) =>
cursor
-> ClickHandler e st
-> Sink e st
-> (ModifierKeys, MouseButtonState, MouseButton)
-> StageRIO st ()
handler cursor
cursorP ClickHandler e st
eventHandler
handler
:: ( Worker.HasOutput cursor
, Worker.GetOutput cursor ~ Vec2
)
=> cursor
-> ClickHandler e st
-> Sink e st
-> (ModifierKeys, MouseButtonState, MouseButton)
-> StageRIO st ()
handler :: forall cursor e st.
(HasOutput cursor, GetOutput cursor ~ Vec2) =>
cursor
-> ClickHandler e st
-> Sink e st
-> (ModifierKeys, MouseButtonState, MouseButton)
-> StageRIO st ()
handler cursor
cursorP ClickHandler e st
eventHandler Sink e st
sink (ModifierKeys, MouseButtonState, MouseButton)
buttonEvent = do
Vec2
cursorPos <- forall worker (m :: * -> *).
(HasOutput worker, MonadIO m) =>
worker -> m (GetOutput worker)
Worker.getOutputData cursor
cursorP
forall (m :: * -> *) env.
(MonadIO m, MonadReader env m, HasLogFunc env, HasCallStack) =>
Utf8Builder -> m ()
logDebug forall a b. (a -> b) -> a -> b
$ Utf8Builder
"MouseButton event: " forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> Utf8Builder
displayShow (Vec2
cursorPos, (ModifierKeys, MouseButtonState, MouseButton)
buttonEvent)
ClickHandler e st
eventHandler Sink e st
sink Vec2
cursorPos (ModifierKeys, MouseButtonState, MouseButton)
buttonEvent