simvx.core.ui.scene_host¶

SceneHost: a tree running inside another, reached through a node.

A hosted tree (an editor’s game viewport, a game’s arcade cabinet) is never a second destination for input. It is reached through this node, which lives in the host tree and receives input by that tree’s ordinary rules, then forwards what reached it: a pointer while it is over the host’s rect or held by it; a key, typed text or a controller while the host holds focus in a tree that has it. A host that must see an event before its guest (the editor’s F5) uses a capture handler above the host, which runs first.

When input stops reaching the guest it is handed over rather than cut off (SceneTree.input_handover): held actions close with a real edge, pointers cancel, the hover leaves, the text session ends, and nothing presses on arrival. It is per kind: turning forwarding off, or the host leaving its tree, hiding or stopping, hands over everything; losing focus hands over the keys and leaves a drag alone; a pointer leaving the rect unpressed only leaves.

What the guest asks of the platform travels up: its text session opens over the host’s rect in the host tree, its cursor_shape is the host’s while the pointer is over it, and its pointer lock is the host tree’s. What the host’s screen does travels down: the insets over the host’s rect become the guest’s, in its own units.

A host given a node rather than a tree builds the guest itself, sizes it to its own rect and steps it once a frame; a host given a tree someone else steps (the editor’s play mode) leaves stepping to its owner. Drawing the guest is the owner’s too.

Module Contents¶

Classes¶

SceneHost

A node that runs a tree inside the tree it belongs to, and forwards input into it.

Data¶

API¶

simvx.core.ui.scene_host.__all__¶

[‘SceneHost’]

class simvx.core.ui.scene_host.SceneHost(guest: simvx.core.scene_tree.SceneTree | simvx.core.node.Node | None = None, **kwargs: Any)[source]¶

Bases: simvx.core.ui.core.Control

A node that runs a tree inside the tree it belongs to, and forwards input into it.

Example::

class Cabinet(Control):
    def on_ready(self):
        self.host = self.add_child(SceneHost(ArcadeGame(), focus_mode=FocusMode.HOVER))
        self.host.set_anchor_preset(Anchor.FULL_RECT)

    @on_input(Key.ESCAPE, capture=True)    # heard before the guest
    def _leave(self, event):
        self.host.forwarding = False
        return True

Initialization

pointer_filter¶

‘Property(…)’

accepts_pointers¶

‘Property(…)’

focus_mode¶

‘Property(…)’

forwarding¶

‘Property(…)’

property guest: simvx.core.scene_tree.SceneTree | None[source]¶

The tree this host runs. Assigning a node builds a tree for it, owned and stepped here.

to_guest(point) → simvx.core.math.types.Vec2[source]¶

A point in the host tree’s space, in the guest’s screen space.

to_host(point) → simvx.core.math.types.Vec2[source]¶

A point in the guest’s screen space, in the host tree’s space.

on_update(dt: float) → None[source]¶

Step a guest this host built, inside the guest’s own input frame.

size_x¶

‘Property(…)’

size_y¶

‘Property(…)’

min_size_x¶

‘Property(…)’

min_size_y¶

‘Property(…)’

anchor_left¶

‘Property(…)’

anchor_top¶

‘Property(…)’

anchor_right¶

‘Property(…)’

anchor_bottom¶

‘Property(…)’

margin_left¶

‘Property(…)’

margin_top¶

‘Property(…)’

margin_right¶

‘Property(…)’

margin_bottom¶

‘Property(…)’

anchor¶

‘Property(…)’

inset¶

‘Property(…)’

dismiss_on_outside_click¶

‘Property(…)’

clip_contents¶

‘Property(…)’

tooltip¶

‘Property(…)’

cursor_shape¶

‘Property(…)’

pointer_types: frozenset[simvx.core.input.enums.PointerType] | None¶

None

touch_target: bool¶

False

wants_text_input: bool¶

False

size_flags_horizontal¶

‘Property(…)’

size_flags_vertical¶

‘Property(…)’

stretch_ratio¶

‘Property(…)’

max_size¶

‘Property(…)’

property size: simvx.core.math.types.Vec2¶
property min_size: simvx.core.math.types.Vec2¶
content_signature() → object¶
content_uses(chars: str) → bool¶
autosize_to_content() → None¶
property theme: simvx.core.ui.types.Theme | None¶
property mouse_over: bool¶
property disabled: bool¶
get_theme() → simvx.core.ui.types.Theme¶
property viewport_size: simvx.core.math.types.Vec2¶
property viewport_insets: tuple[float, float, float, float]¶
queue_redraw()¶
size_floor() → tuple[float, float]¶
get_minimum_size() → simvx.core.math.types.Vec2¶
add_child(node: simvx.core.node.T) → simvx.core.node.T¶
get_rect() → tuple[float, float, float, float]¶
get_global_rect() → tuple[float, float, float, float]¶
property focus_rect: tuple[float, float, float, float] | None¶
is_point_inside(point) → bool¶
is_hit(event: simvx.core.input.events.PointerEvent) → bool¶
classmethod __init_subclass__(**kwargs)¶
activate() → bool¶
set_focus()¶
focus_next_control()¶
focus_previous_control()¶
set_drag_preview(control: simvx.core.ui.core.Control)¶
property is_overlay_open: bool¶
show_overlay(modality: str = 'light', *, dim: bool | None = None, dismiss: bool | None = None, inert: bool | None = None, owner: simvx.core.ui.core.Control | None = None, initial_focus: simvx.core.ui.core.Control | None = None) → None¶
close_overlay() → None¶
position¶

‘_SpatialVecProperty(…)’

rotation¶

‘Property(…)’

scale¶

‘_SpatialVecProperty(…)’

top_level¶

‘Property(…)’

z_index¶

‘Property(…)’

z_as_relative¶

‘Property(…)’

render_layer¶

‘Property(…)’

set_render_layer(index: int, enabled: bool = True) → None¶
is_on_render_layer(index: int) → bool¶
property absolute_z_index: int¶
property rotation_degrees: float¶
property world_position: simvx.core.math.types.Vec2¶
property world_rotation: float¶
property world_scale: simvx.core.math.types.Vec2¶
property world_transform: tuple[simvx.core.math.types.Vec2, simvx.core.math.types.Vec2, float]¶
property forward: simvx.core.math.types.Vec2¶
property right: simvx.core.math.types.Vec2¶
translate(offset: tuple[float, float] | numpy.ndarray)¶
rotate(radians: float)¶
rotate_deg(degrees: float)¶
look_at(target: tuple[float, float] | numpy.ndarray)¶
to_global(point) → simvx.core.math.types.Vec2¶
to_local(point) → simvx.core.math.types.Vec2¶
transform_points(points: list[simvx.core.math.types.Vec2]) → list[simvx.core.math.types.Vec2]¶
wrap_screen(margin: float = 20)¶
post_processed¶

‘Property(…)’

property transform_render_dirty: bool¶
strict_errors: ClassVar[bool]¶

True

dev_checks: ClassVar[bool]¶

None

dev_warnings: ClassVar[bool]¶

None

freeze_check_interval: ClassVar[float]¶

1.0

script_error_raised¶

‘Signal(…)’

dynamic: bool¶

False

visible¶

‘Property(…)’

update_mode¶

‘Property(…)’

drag_threshold¶

‘Property(…)’

focus_entered¶

‘Signal(…)’

focus_exited¶

‘Signal(…)’

__properties__: ClassVar[dict[str, simvx.core.descriptors.Property]]¶

None

property name: str¶
property visible_in_tree: bool¶
property input_player: simvx.core.input.players.InputPlayer¶
property input_context: simvx.core.input.contexts.InputContext | None¶
reset_error() → None¶
remove_child(node: simvx.core.node.Node) → None¶
reparent(new_parent: simvx.core.node.Node)¶
node_at(path, default=_NO_DEFAULT)¶
find(target, *, direct: bool = False)¶
find_all(target, *, direct: bool = False)¶
expect(target, *, direct: bool = False)¶
ancestor(target)¶
walk(*, include_self: bool = True) → collections.abc.Iterator[simvx.core.node.Node]¶
property path: str¶
property is_scene_root: bool¶
add_to_group(group: str)¶
remove_from_group(group: str)¶
is_in_group(group: str) → bool¶
on_ready() → None¶
on_enter_tree() → None¶
on_exit_tree() → None¶
on_fixed_update(dt: float) → None¶
on_draw(canvas) → None¶
on_draw_3d(gizmos) → None¶
on_picked(event: simvx.core.input.events.PickEvent) → bool | None¶
start_coroutine(gen: simvx.core.descriptors.Coroutine) → simvx.core.descriptors.CoroutineHandle¶
stop_coroutine(gen_or_handle)¶
property focused: bool¶
drag_threshold_for(pointer_type: simvx.core.input.enums.PointerType | str) → float¶
grab_focus() → None¶
release_focus() → None¶
capture_pointer(pointer_id: int | None = None) → None¶
release_pointer(pointer_id: int | None = None) → None¶
property render_dirty: bool¶
clear_children()¶
destroy()¶
property destroying: bool¶
call_deferred(method: collections.abc.Callable[..., Any], *args: Any) → None¶
property app¶
property tree: simvx.core.scene_tree.SceneTree¶
property physics¶
property physics_2d¶
__getitem__(key: str)¶
classmethod get_properties() → dict[str, simvx.core.descriptors.Property]¶
__repr__()¶