Skip to content

Commit

Permalink
Merge pull request #45 from labuzm/input_properties
Browse files Browse the repository at this point in the history
introduce typed_property
  • Loading branch information
labuzm committed Dec 6, 2019
2 parents 890c38b + 33fa225 commit bee2414
Show file tree
Hide file tree
Showing 11 changed files with 162 additions and 90 deletions.
2 changes: 1 addition & 1 deletion demos/basic/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion demos/fonts/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion demos/physics/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions demos/physics2/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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.),
)
Expand Down
4 changes: 2 additions & 2 deletions demos/scenes/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion demos/timers/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion demos/transitions/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
164 changes: 109 additions & 55 deletions kaa/input.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -337,6 +337,22 @@ class EventType(IntEnum):
controller_remapped = <uint32_t>CEventType.controller_remapped


class WindowEventType(IntEnum):
shown = <uint32_t>CWindowEventType.shown,
hidden = <uint32_t>CWindowEventType.hidden,
exposed = <uint32_t>CWindowEventType.exposed,
moved = <uint32_t>CWindowEventType.moved,
resized = <uint32_t>CWindowEventType.resized,
minimized = <uint32_t>CWindowEventType.minimized,
maximized = <uint32_t>CWindowEventType.maximized,
restored = <uint32_t>CWindowEventType.restored,
enter = <uint32_t>CWindowEventType.enter,
leave = <uint32_t>CWindowEventType.leave,
focus_gained = <uint32_t>CWindowEventType.focus_gained,
focus_lost = <uint32_t>CWindowEventType.focus_lost,
close = <uint32_t>CWindowEventType.close


class CompoundEventType(IntEnum):
window = <uint32_t>CCompoundEventType.window
system = <uint32_t>CCompoundEventType.system
Expand All @@ -350,14 +366,31 @@ class CompoundControllerAxis(IntEnum):
right_stick = <uint32_t>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()
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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(
Expand All @@ -471,15 +519,17 @@ cdef class MouseEvent(_BaseEvent):
<CMouseButton>(<uint32_t>(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):
Expand All @@ -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(
Expand All @@ -511,19 +562,22 @@ cdef class ControllerEvent(_BaseEvent):
<CControllerButton>(<uint32_t>(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(
<CControllerAxis>(<uint32_t>(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
Expand Down
5 changes: 4 additions & 1 deletion kaa/input.py
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
from ._kaa import Keycode, MouseButton, ControllerButton, ControllerAxis
from ._kaa import (
Keycode, MouseButton, ControllerButton, ControllerAxis, Event,
SystemEvent, WindowEvent, KeyboardEvent, MouseEvent, ControllerEvent
)

0 comments on commit bee2414

Please sign in to comment.