diff --git a/demos/basic/main.py b/demos/basic/main.py index 9c393f73..7d5f250a 100644 --- a/demos/basic/main.py +++ b/demos/basic/main.py @@ -61,7 +61,7 @@ def __init__(self, sound_path, music_path): def update(self, dt): for event in self.input.events(): - if event.system and event.system.is_quit(): + if event.system and event.system.quit: self.engine.quit() keyboard = event.keyboard diff --git a/demos/fonts/main.py b/demos/fonts/main.py index 223e8e28..c5c96e3f 100644 --- a/demos/fonts/main.py +++ b/demos/fonts/main.py @@ -14,7 +14,7 @@ def __init__(self): def update(self, dt): for event in self.input.events(): - if event.system and event.system.is_quit(): + if event.system and event.system.quit: self.engine.quit() keyboard = event.keyboard diff --git a/demos/physics/main.py b/demos/physics/main.py index a9b17a5c..aa8090bf 100644 --- a/demos/physics/main.py +++ b/demos/physics/main.py @@ -136,7 +136,7 @@ def handle_collision(self, arbiter, p1, p2): def update(self, dt): for event in self.input.events(): - if event.system and event.system.is_quit(): + if event.system and event.system.quit: self.engine.quit() keyboard = event.keyboard diff --git a/demos/physics2/main.py b/demos/physics2/main.py index 476462e3..d0672508 100644 --- a/demos/physics2/main.py +++ b/demos/physics2/main.py @@ -113,9 +113,9 @@ def delete_object(self): def update(self, dt): for event in self.input.events(): - if event.system and event.system.is_quit(): + if event.system and event.system.quit: self.engine.quit() - + keyboard = event.keyboard if keyboard: if keyboard.is_pressing(Keycode.n): @@ -144,7 +144,7 @@ def update(self, dt): if event.mouse and event.mouse.is_pressing(MouseButton.left): self.spawn_object( position=self.camera.unproject_position( - event.get_mouse_position(), + event.mouse.position, ), velocity=Vector(0., 0.), ) diff --git a/demos/scenes/main.py b/demos/scenes/main.py index ae1d55f6..30ab62cb 100644 --- a/demos/scenes/main.py +++ b/demos/scenes/main.py @@ -32,7 +32,7 @@ def on_enter(self): def update(self, dt): for event in self.input.events(): - if event.system and event.system.is_quit(): + if event.system and event.system.quit: self.engine.quit() keyboard = event.keyboard @@ -64,7 +64,7 @@ def on_enter(self): def update(self, dt): for event in self.input.events(): - if event.system and event.system.is_quit(): + if event.system and event.system.quit: self.engine.quit() keyboard = event.keyboard diff --git a/demos/timers/main.py b/demos/timers/main.py index 0a981190..cc0f8120 100644 --- a/demos/timers/main.py +++ b/demos/timers/main.py @@ -47,7 +47,7 @@ def spawn(self): def update(self, dt): for event in self.input.events(): - if event.system and event.system.is_quit(): + if event.system and event.system.quit: self.engine.quit() keyboard = event.keyboard diff --git a/demos/transitions/main.py b/demos/transitions/main.py index 526a0f6f..e98f706c 100644 --- a/demos/transitions/main.py +++ b/demos/transitions/main.py @@ -88,7 +88,7 @@ def __init__(self): def update(self, dt): for event in self.input.events(): - if event.system and event.system.is_quit(): + if event.system and event.system.quit: self.engine.quit() if self.input.keyboard.is_pressed(Keycode.q): diff --git a/kaa/input.pxi b/kaa/input.pxi index 0348db10..f38aaa2c 100644 --- a/kaa/input.pxi +++ b/kaa/input.pxi @@ -7,7 +7,7 @@ from libcpp.vector cimport vector from .kaacore.engine cimport CEngine, get_c_engine from .kaacore.input cimport ( CKeycode, CMouseButton, CControllerButton, CControllerAxis, - CCompoundControllerAxis, CCompoundEventType, CEventType, + CCompoundControllerAxis, CCompoundEventType, CEventType, CWindowEventType, CSystemEvent, CWindowEvent, CKeyboardEvent, CMouseEvent, CControllerEvent, CEvent, CInputManager, CSystemManager, CKeyboardManager, CMouseManager, CControllerManager, CControllerID @@ -337,6 +337,22 @@ class EventType(IntEnum): controller_remapped = CEventType.controller_remapped +class WindowEventType(IntEnum): + shown = CWindowEventType.shown, + hidden = CWindowEventType.hidden, + exposed = CWindowEventType.exposed, + moved = CWindowEventType.moved, + resized = CWindowEventType.resized, + minimized = CWindowEventType.minimized, + maximized = CWindowEventType.maximized, + restored = CWindowEventType.restored, + enter = CWindowEventType.enter, + leave = CWindowEventType.leave, + focus_gained = CWindowEventType.focus_gained, + focus_lost = CWindowEventType.focus_lost, + close = CWindowEventType.close + + class CompoundEventType(IntEnum): window = CCompoundEventType.window system = CCompoundEventType.system @@ -350,14 +366,31 @@ class CompoundControllerAxis(IntEnum): right_stick = CCompoundControllerAxis.right_stick +cdef class _TypedReadOnlyProperty: + cdef: + object get_fun + object event_type + + def __init__(self, event_type, get_fun): + self.event_type = event_type + self.get_fun = get_fun + + def __get__(self, obj, klass): + if obj is None: + return self.event_type + return self.get_fun(obj) + + +cdef typed_property(object event_type): + def decorator(fun): + return _TypedReadOnlyProperty(event_type, fun) + return decorator + + @cython.freelist(EVENT_FREELIST_SIZE) cdef class _BaseEvent: cdef CEvent c_event - @property - def type(self): - return EventType(self.c_event.type()) - @property def timestamp(self): return self.c_event.timestamp() @@ -371,11 +404,13 @@ cdef class SystemEvent(_BaseEvent): instance.c_event = c_event return instance - def is_quit(self): - return self.c_event.system().is_quit() + @typed_property(EventType.quit) + def quit(self): + return self.c_event.system().quit() - def is_clipboard_updated(self): - return self.c_event.system().is_clipboard_updated() + @typed_property(EventType.clipboard_updated) + def clipboard_updated(self): + return self.c_event.system().clipboard_updated() @cython.final @@ -386,49 +421,61 @@ cdef class WindowEvent(_BaseEvent): instance.c_event = c_event return instance - @property - def size(self): - return Vector.from_c_vector(self.c_event.window().size()) + @typed_property(WindowEventType.shown) + def shown(self): + return self.c_event.window().shown() - @property - def position(self): - return Vector.from_c_vector(self.c_event.window().position()) - - def is_shown(self): - return self.c_event.window().is_shown() + @typed_property(WindowEventType.exposed) + def exposed(self): + return self.c_event.window().exposed() - def is_exposed(self): - return self.c_event.window().is_exposed() + @typed_property(WindowEventType.moved) + def moved(self): + return self.c_event.window().moved() - def is_moved(self): - return self.c_event.window().is_moved() - - def is_resized(self): - return self.c_event.window().is_resized() + @typed_property(WindowEventType.resized) + def resized(self): + return self.c_event.window().resized() - def is_minimized(self): - return self.c_event.window().is_minimized() + @typed_property(WindowEventType.minimized) + def minimized(self): + return self.c_event.window().minimized() - def is_maximized(self): - return self.c_event.window().is_maximized() + @typed_property(WindowEventType.maximized) + def maximized(self): + return self.c_event.window().maximized() - def is_restored(self): - return self.c_event.window().is_restored() + @typed_property(WindowEventType.restored) + def restored(self): + return self.c_event.window().restored() - def is_enter(self): - return self.c_event.window().is_enter() + @typed_property(WindowEventType.enter) + def enter(self): + return self.c_event.window().enter() + + @typed_property(WindowEventType.leave) + def leave(self): + return self.c_event.window().leave() - def is_leave(self): - return self.c_event.window().is_leave() + @typed_property(WindowEventType.focus_gained) + def focus_gained(self): + return self.c_event.window().focus_gained() - def is_focus_gained(self): - return self.c_event.window().is_focus_gained() + @typed_property(WindowEventType.focus_lost) + def focus_lost(self): + return self.c_event.window().focus_lost() - def is_focus_lost(self): - return self.c_event.window().is_focus_lost() + @typed_property(WindowEventType.close) + def close(self): + return self.c_event.window().close() - def is_close(self): - return self.c_event.window().is_close() + @property + def size(self): + return Vector.from_c_vector(self.c_event.window().size()) + + @property + def position(self): + return Vector.from_c_vector(self.c_event.window().position()) @cython.final @@ -458,8 +505,9 @@ cdef class MouseEvent(_BaseEvent): instance.c_event = c_event return instance - def is_button(self): - return self.c_event.mouse().is_button() + @typed_property((EventType.mouse_button_down, EventType.mouse_button_up)) + def button(self): + return self.c_event.mouse().button() def is_pressing(self, mb not None): return self.c_event.mouse().is_pressing( @@ -471,15 +519,17 @@ cdef class MouseEvent(_BaseEvent): ((mb.value)) ) - def is_motion(self): - return self.c_event.mouse().is_motion() + @typed_property(EventType.mouse_motion) + def motion(self): + return self.c_event.mouse().motion() @property def position(self): return Vector.from_c_vector(self.c_event.mouse().position()) - def is_wheel(self): - return self.c_event.mouse().is_wheel() + @typed_property(EventType.mouse_wheel) + def wheel(self): + return self.c_event.mouse().wheel() @property def scroll(self): @@ -498,8 +548,9 @@ cdef class ControllerEvent(_BaseEvent): def id(self): return self.c_event.controller().id() - def is_button(self): - return self.c_event.controller().is_button() + @typed_property((EventType.controller_button_down, EventType.controller_button_up)) + def button(self): + return self.c_event.controller().button() def is_pressing(self, cb not None): return self.c_event.controller().is_pressing( @@ -511,19 +562,22 @@ cdef class ControllerEvent(_BaseEvent): ((cb.value)) ) - def is_axis(self): - return self.c_event.controller().is_axis() + @typed_property(EventType.controller_axis_motion) + def axis(self): + return self.c_event.controller().axis() def axis_motion(self, ca not None): return self.c_event.controller().axis_motion( ((ca.value)) ) - def is_added(self): - return self.c_event.controller().is_added() + @typed_property(EventType.controller_added) + def added(self): + return self.c_event.controller().added() - def is_removed(self): - return self.c_event.controller().is_removed() + @typed_property(EventType.controller_removed) + def removed(self): + return self.c_event.controller().removed() @cython.final diff --git a/kaa/input.py b/kaa/input.py index a5375983..3277daea 100644 --- a/kaa/input.py +++ b/kaa/input.py @@ -1 +1,4 @@ -from ._kaa import Keycode, MouseButton, ControllerButton, ControllerAxis +from ._kaa import ( + Keycode, MouseButton, ControllerButton, ControllerAxis, Event, + SystemEvent, WindowEvent, KeyboardEvent, MouseEvent, ControllerEvent +) diff --git a/kaa/kaacore/input.pxd b/kaa/kaacore/input.pxd index df34ebc2..a26970c1 100644 --- a/kaa/kaacore/input.pxd +++ b/kaa/kaacore/input.pxd @@ -319,7 +319,22 @@ cdef extern from "kaacore/input.h" nogil: controller_button_up "kaacore::EventType::controller_button_up", controller_added "kaacore::EventType::controller_added", controller_removed "kaacore::EventType::controller_removed", - controller_remapped "kaacore::EventType::controller_remapped", + controller_remapped "kaacore::EventType::controller_remapped" + + cdef enum CWindowEventType "kaacore::WindowEventType": + shown "kaacore::WindowEventType::shown", + hidden "kaacore::WindowEventType::hidden", + exposed "kaacore::WindowEventType::exposed", + moved "kaacore::WindowEventType::moved", + resized "kaacore::WindowEventType::resized", + minimized "kaacore::WindowEventType::minimized", + maximized "kaacore::WindowEventType::maximized", + restored "kaacore::WindowEventType::restored", + enter "kaacore::WindowEventType::enter", + leave "kaacore::WindowEventType::leave", + focus_gained "kaacore::WindowEventType::focus_gained", + focus_lost "kaacore::WindowEventType::focus_lost", + close "kaacore::WindowEventType::close" cdef enum CCompoundEventType "kaacore::CompoundEventType": window "kaacore::CompoundEventType::window", @@ -333,35 +348,35 @@ cdef extern from "kaacore/input.h" nogil: right_stick "kaacore::CompoundControllerAxis::right_stick" cdef cppclass CSystemEvent "kaacore::SystemEvent": - bint is_quit() \ + bint quit() \ except +raise_py_error - bint is_clipboard_updated() \ + bint clipboard_updated() \ except +raise_py_error cdef cppclass CWindowEvent "kaacore::WindowEvent": - bint is_shown() \ + bint shown() \ except +raise_py_error - bint is_exposed() \ + bint exposed() \ except +raise_py_error - bint is_moved() \ + bint moved() \ except +raise_py_error - bint is_resized() \ + bint resized() \ except +raise_py_error - bint is_minimized() \ + bint minimized() \ except +raise_py_error - bint is_maximized() \ + bint maximized() \ except +raise_py_error - bint is_restored() \ + bint restored() \ except +raise_py_error - bint is_enter() \ + bint enter() \ except +raise_py_error - bint is_leave() \ + bint leave() \ except +raise_py_error - bint is_focus_gained() \ + bint focus_gained() \ except +raise_py_error - bint is_focus_lost() \ + bint focus_lost() \ except +raise_py_error - bint is_close() \ + bint close() \ except +raise_py_error CVector size() \ except +raise_py_error @@ -375,11 +390,11 @@ cdef extern from "kaacore/input.h" nogil: except +raise_py_error cdef cppclass CMouseEvent "kaacore::MouseEvent": - bint is_button() \ + bint button() \ except +raise_py_error - bint is_motion() \ + bint motion() \ except +raise_py_error - bint is_wheel() \ + bint wheel() \ except +raise_py_error bint is_pressing(CMouseButton mb) \ except +raise_py_error @@ -391,15 +406,15 @@ cdef extern from "kaacore/input.h" nogil: except +raise_py_error cdef cppclass CControllerEvent "kaacore::ControllerEvent": - bint is_button() \ + bint button() \ except +raise_py_error - bint is_axis() \ + bint axis() \ except +raise_py_error - bint is_added() \ + bint added() \ except +raise_py_error - bint is_removed() \ + bint removed() \ except +raise_py_error - bint is_remapped() \ + bint remapped() \ except +raise_py_error int32_t id() \ except +raise_py_error diff --git a/kaacore b/kaacore index ed05ba26..7ff29968 160000 --- a/kaacore +++ b/kaacore @@ -1 +1 @@ -Subproject commit ed05ba263b44c6cadfa73c2fe97826af8da9f76f +Subproject commit 7ff29968ff5a6944af6b2adacffe0c2cd4d5088f