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)})"