simvx.editor.modal_dialog

Shared modal-dialog scaffolding for the SimVX editor.

The editor hosts a family of small modal dialogs (About, Preferences, Duplicate Node, Rename Class, …) that all register on the engine’s overlay layer in exactly the same way: a "blocking" overlay (dimmed scrim, input scoped to the dialog, the editor stays live behind it), outside-click dismissal, the cancel_requested router signal, and show_overlay() / close_overlay() to drive the registry.

class:

BaseModalDialog centralises that boilerplate so each dialog only declares its own geometry, contents, and result signals. It is a thin

class:

~simvx.core.Panel subclass: the panel background starts fully transparent (so a dialog that paints itself via on_draw or an inner panel is unaffected), and the overlay layer draws the dimmed scrim behind it.

Subclasses typically:

  • set z_index (overlay stacking) and, for full-rect overlays, set_anchor_preset(AnchorPreset.FULL_RECT);

  • call :meth:open_modal to show and :meth:dismiss to hide;

  • override :meth:_on_cancel when an outside click / Escape should emit a cancelled result signal (the default just hides the dialog).

Module Contents

Classes

BaseModalDialog

Base class for the editor’s modal-router dialogs.

Data

API

simvx.editor.modal_dialog.__all__

[‘BaseModalDialog’]

class simvx.editor.modal_dialog.BaseModalDialog(**kwargs)[source]

Bases: simvx.core.Panel

Base class for the editor’s modal-router dialogs.

Centralises the overlay-layer setup (a "blocking" overlay with outside-click dismissal and the cancel_requested wiring) and the show/hide lifecycle (:meth:open_modal / :meth:dismiss). The panel background is transparent by default; subclasses paint their own card via on_draw or an inner :class:~simvx.core.Panel.

The overlay dims the editor and scopes input to the dialog, but the editor stays live behind it (inert=False). Set :attr:PAUSE_TREE_WHEN_MODAL on the subclass to opt into an inert (paused) backdrop instead.

Initialization

PAUSE_TREE_WHEN_MODAL

False

open_modal(*, initial_focus=None) None[source]

Show the dialog and register it as a blocking overlay (dimmed, world live).

initial_focus is the dialog’s primary field to focus on open (None = the first focusable descendant).

dismiss() None[source]

Hide the dialog without emitting a result signal. Idempotent.

style

‘ThemeStyleBox(…)’

property bg_colour
property border_colour
property border_width
get_minimum_size() simvx.core.math.types.Vec2
on_draw(renderer)
size_x

‘Property(…)’

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(…)’

dismiss_on_outside_click

‘Property(…)’

property size: simvx.core.math.types.Vec2
touch_mode: str

‘mouse’

property theme: simvx.core.ui.types.Theme | None
property mouse_over: bool
property focused: bool
property disabled: bool
get_theme() simvx.core.ui.types.Theme
queue_redraw()
get_rect() tuple[float, float, float, float]
get_global_rect() tuple[float, float, float, float]
is_point_inside(point) bool
place_bottom_strip(height: float) None
place_top_strip(height: float) None
set_anchor_preset(preset: simvx.core.ui.enums.AnchorPreset)
set_focus()
grab_focus()
release_focus()
has_focus() bool
focus_next_control()
focus_previous_control()
grab_mouse()
release_mouse()
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(…)’

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)
transform_points(points: list[simvx.core.math.types.Vec2]) list[simvx.core.math.types.Vec2]
draw_polygon(renderer, points: list[simvx.core.math.types.Vec2], closed=True, colour=None)
wrap_screen(margin: float = 20)
hdr

‘Property(…)’

property transform_render_dirty: bool
strict_errors: ClassVar[bool]

True

script_error_raised

‘Signal(…)’

dynamic: bool

False

classmethod __init_subclass__(**kwargs)
property name: str
property update_mode: simvx.core.descriptors.UpdateMode
property visible: bool
reset_error() None
add_child(node: simvx.core.node.Node) simvx.core.node.Node
remove_child(node: simvx.core.node.Node)
reparent(new_parent: simvx.core.node.Node)
get_node(path: str) simvx.core.node.Node
get_node_or_none(path: str) simvx.core.node.Node | None
find(target, *, direct: bool = False)
find_all(target, *, direct: bool = False)
walk(*, include_self: bool = True) collections.abc.Iterator[simvx.core.node.Node]
property path: str
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_update(dt: float) None
on_fixed_update(dt: float) None
on_picked(event: simvx.core.events.InputEvent) None
on_unhandled_input(event: simvx.core.events.TreeInputEvent) None
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle
stop_coroutine(gen_or_handle)
property render_dirty: bool
clear_children()
destroy()
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__()