Source code for simvx.core.events
"""Input event types for the node tree."""
from __future__ import annotations
import logging
log = logging.getLogger(__name__)
# ============================================================================
# InputEvent — Delivered to pickable nodes on mouse click
# ============================================================================
[docs]
class InputEvent:
"""Mouse click event delivered to 3D nodes via input_event().
Attributes:
screen_pos: Click position in screen pixels.
button: Mouse button (1=left, 2=middle, 3=right).
ray_origin: World-space ray origin.
ray_direction: World-space ray direction (normalized).
distance: Distance along ray to the hit point.
"""
__slots__ = ('screen_pos', 'button', 'ray_origin', 'ray_direction', 'distance')
def __init__(self, screen_pos: tuple[float, float], button: int,
ray_origin: tuple[float, float, float],
ray_direction: tuple[float, float, float],
distance: float = 0.0):
self.screen_pos = screen_pos
self.button = button
self.ray_origin = ray_origin
self.ray_direction = ray_direction
self.distance = distance
# ============================================================================
# TreeInputEvent — Propagated through the node tree via input()/unhandled_input()
# ============================================================================
[docs]
class TreeInputEvent:
"""Input event propagated through the node tree.
Set ``handled = True`` in ``input()`` to stop propagation to later nodes.
``unhandled_input()`` is still called on remaining nodes regardless.
Attributes:
type: Event kind — "key", "mouse_button", "mouse_motion", "scroll".
key: Key name (for key events).
pressed: True on press, False on release (key/mouse_button events).
button: Mouse button number (1=left, 2=right, 3=middle).
position: Mouse position in screen pixels (mouse events).
delta: Motion delta (mouse_motion) or scroll offset (scroll).
handled: Set True to consume the event (stops ``input()`` propagation).
"""
__slots__ = ('type', 'key', 'pressed', 'button', 'position', 'delta', 'handled')
def __init__(
self,
type: str,
*,
key: str = "",
pressed: bool = False,
button: int = 0,
position: tuple[float, float] = (0.0, 0.0),
delta: tuple[float, float] = (0.0, 0.0),
):
self.type = type
self.key = key
self.pressed = pressed
self.button = button
self.position = position
self.delta = delta
self.handled = False
[docs]
def __repr__(self) -> str:
parts = [f"type={self.type!r}"]
if self.key:
parts.append(f"key={self.key!r}")
if self.button:
parts.append(f"button={self.button}")
if self.pressed:
parts.append("pressed=True")
return f"TreeInputEvent({', '.join(parts)})"