summaryrefslogtreecommitdiff
path: root/txtgameengine/input
diff options
context:
space:
mode:
Diffstat (limited to 'txtgameengine/input')
-rw-r--r--txtgameengine/input/__init__.py0
-rw-r--r--txtgameengine/input/callbacks.py31
-rw-r--r--txtgameengine/input/keyboard.py52
3 files changed, 83 insertions, 0 deletions
diff --git a/txtgameengine/input/__init__.py b/txtgameengine/input/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/txtgameengine/input/__init__.py
diff --git a/txtgameengine/input/callbacks.py b/txtgameengine/input/callbacks.py
new file mode 100644
index 0000000..476c103
--- /dev/null
+++ b/txtgameengine/input/callbacks.py
@@ -0,0 +1,31 @@
+import typing
+from .keyboard import ModKey, KeyboardCallback, KeyboardEvent, KeyboardCallbackBuilder
+
+if typing.TYPE_CHECKING:
+ from ..app import TxtGameApp
+
+
+class CallbackHandler:
+ def __init__(self, app: 'TxtGameApp'):
+ self.app = app
+ self.keyboard_callbacks: typing.List[KeyboardCallback] = []
+
+ def register_keyboard_callback(self, callback: KeyboardCallback):
+ self.keyboard_callbacks.append(callback)
+
+ def get_keyboard_input_callback(self, window: typing.Any, keycode: int, scancode: int, action: int, mod_keys: int):
+ event = KeyboardEvent(window, keycode, scancode, action, ModKey(mod_keys))
+ for callback in self.keyboard_callbacks:
+ if event.mod_keys == callback.required_mod_keys:
+ continue
+
+ callback.callback(event)
+
+ def get_mouse_move_callback(self, window: typing.Any, pos_x: float, pos_y: float):
+ pass
+
+ def get_mouse_click_callback(self, window: typing.Any, button: int, action: int, mod_keys: int):
+ pass
+
+ def keyboard_callback(self) -> KeyboardCallbackBuilder:
+ return KeyboardCallbackBuilder(self.app)
diff --git a/txtgameengine/input/keyboard.py b/txtgameengine/input/keyboard.py
new file mode 100644
index 0000000..1938016
--- /dev/null
+++ b/txtgameengine/input/keyboard.py
@@ -0,0 +1,52 @@
+from enum import IntFlag
+import glfw
+import typing
+from dataclasses import dataclass
+
+if typing.TYPE_CHECKING:
+ from ..scenes import Scene
+
+ SceneLike = typing.TypeAlias('SceneLike', typing.Union[Scene, typing.Type[Scene]])
+
+
+class ModKey(IntFlag):
+ SHIFT = glfw.MOD_SHIFT
+ CONTROL = glfw.MOD_CONTROL
+ ALT = glfw.MOD_ALT
+ SUPER = glfw.MOD_SUPER
+
+
+@dataclass
+class KeyboardEvent:
+ window: typing.Any
+ keycode: int
+ scancode: int
+ action: int
+ mod_keys: int
+
+ def has_modkey(self, modkey: ModKey):
+ return bool(self.mod_keys & modkey)
+
+
+class KeyboardCallbackBuilder:
+ def __init__(self, app):
+ self.app = app
+ self.scene = None
+ self.required_mod_keys = ModKey(0)
+
+ def build(self, callback: typing.Callable[[KeyboardEvent], None]):
+ KeyboardCallback(self.required_mod_keys, callback)
+
+ def only_in_scene(self, scene: 'SceneLike'):
+ self.scene = scene
+ return self
+
+ def with_mod_key(self, mod_key: ModKey):
+ self.required_mod_keys |= mod_key
+ return self
+
+
+class KeyboardCallback:
+ def __init__(self, required_mod_keys, callback: typing.Callable[[KeyboardEvent], None]):
+ self.required_mod_keys = required_mod_keys
+ self.callback = callback