simvx.editor.panels.properties

Inspector Panel – Property editor for the selected node.

Reads Property descriptors from the selected node’s class hierarchy and creates appropriate editor widgets (Slider, SpinBox, CheckBox, DropDown, TextEdit, ColourPicker) for each property. All property changes go through the undo system via PropertyCommand.

Layout: +———————————-+ | TypeName [ Make Custom Class ]| | Name: [ editable name field ] | +———————————-+ | v Class | | | | [ Edit ] | +———————————-+ | v Instance | | Visible [x] | | Position X [ ] Y [ ] Z [ ] | | speed [=====|——-] 5.0 | +———————————-+

The Class section auto-collapses to a single “Built-in” line when the node’s class lives under simvx.core.* (the existing “Make Custom Class” promote button in the header carries the only actionable affordance in that case). For user-defined subclasses it surfaces an “Edit class file” button that calls state.workspace.open_file(path, line=...).

The Instance section header is suppressed when the underlying node has no displayable property groups (e.g. plain Node without any descriptors).

The section-building logic lives behind this facade in two private siblings: _properties_class_section (Class metadata + Make-Custom-Class promotion) and _properties_instance_section (per-node editable sections, property handlers, and section management). They are mixed into PropertiesPanel, so all methods remain on the class.

Module Contents

Classes

PropertiesPanel

Property editor panel for the currently selected node.

API

class simvx.editor.panels.properties.PropertiesPanel(editor_state=None, **kwargs)[source]

Bases: simvx.editor.panels._properties_class_section._ClassSectionMixin, simvx.editor.panels._properties_instance_section._InstanceSectionMixin, simvx.editor.panels.inspector_script.ScriptSectionMixin, simvx.core.Control

Property editor panel for the currently selected node.

Subscribes to state.selection_changed and rebuilds its contents whenever the selection changes. Each Property on the selected node is mapped to an appropriate editor widget. Property edits are pushed to the undo stack as PropertyCommand instances.

Args: editor_state: The central State instance.

Initialization

property_changed

‘Signal(…)’

on_ready()[source]

Connect to editor state signals.

inspect(node: simvx.core.Node | None)[source]

Public API: display properties for the given node (or clear if None).

on_process(dt: float)[source]

Reflow vertical layout when size changes or content is dirty.

on_draw(renderer)[source]
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(…)’

modal

‘Property(…)’

dismiss_on_outside_click

‘Property(…)’

pause_tree_when_modal

‘Property(…)’

top_level

‘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_minimum_size() simvx.core.math.types.Vec2
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)
show_modal()
close_modal()
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)
strict_errors: ClassVar[bool]

True

script_error_raised

‘Signal(…)’

classmethod __init_subclass__(**kwargs)
property name: str
property process_mode: simvx.core.descriptors.ProcessMode
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
find_child(name: str, recursive: bool = False) simvx.core.node.Node | None
find(target: type | str, recursive: bool = True) simvx.core.node.Node | None
find_all(node_type: type, recursive: bool = True) list
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_enter_tree() None
on_exit_tree() None
on_physics_process(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)
clear_children()
destroy()
property app
property tree: simvx.core.scene_tree.SceneTree
__getitem__(key: str)
classmethod get_properties() dict[str, simvx.core.descriptors.Property]
__repr__()