simvx.editor.panels.scene_tree

Scene Tree Panel – hierarchical view of the scene’s node tree.

Displays the node hierarchy from the edited scene, supports selection, right-click context menu, add/delete/duplicate/rename/copy/paste actions, and an Add Node dialog for creating new nodes by type. All mutating operations go through the UndoStack so they are fully reversible.

Module Contents

Classes

SceneTreePanel

Displays and manages the node hierarchy of the edited scene.

Functions

register_addable_type

Register a custom node type so it appears in the Add Node dialog.

Data

API

simvx.editor.panels.scene_tree.__all__

[‘SceneTreePanel’, ‘register_addable_type’]

simvx.editor.panels.scene_tree.register_addable_type(name: str, cls: type, icon: str = '⊕')

Register a custom node type so it appears in the Add Node dialog.

Args: name: Display name in the dialog (e.g. "TicTacToeGame"). cls: The node class to instantiate when selected. icon: Optional text icon (default: circled plus).

class simvx.editor.panels.scene_tree.SceneTreePanel(editor_state: simvx.editor.state.EditorState, **kwargs)

Bases: simvx.core.Control

Displays and manages the node hierarchy of the edited scene.

Features: - TreeView reflecting scene node hierarchy - Text icons per node type - Filter bar in the header - Right-click context menu (Add, Delete, Duplicate, Rename, Copy, Paste) - Keyboard shortcuts (Del, F2, Ctrl+D, Ctrl+C, Ctrl+V) - All mutations go through UndoStack - Syncs with EditorState.selection - Add Node dialog overlay for choosing node type

Signals: node_reparented: Emitted as (node, old_parent, new_parent) after reparent.

Initialization

HEADER_HEIGHT

28.0

node_reparented

‘Signal(…)’

ready()

Wire up signals after the node enters the tree.

open_add_node_dialog()

Open the Add Node type dialog. Can be called externally (e.g. from menus).

reparent_node(node: simvx.core.Node, new_parent: simvx.core.Node)

Reparent node under new_parent with undo support.

process(dt: float)

Update child positions each frame to follow panel size.

draw(renderer)
size_x

‘Property(…)’

size_y

‘Property(…)’

property size: simvx.core.math.types.Vec2
get_theme() simvx.core.ui.core.Theme
get_rect() tuple[float, float, float, float]
get_global_rect() tuple[float, float, float, float]
is_point_inside(point) bool
set_anchor_preset(preset: simvx.core.ui.core.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)
draw_popup(renderer)
is_popup_point_inside(point) bool
popup_input(event)
dismiss_popup()
z_index

‘Property(…)’

z_as_relative

‘Property(…)’

property absolute_z_index: int
property position: simvx.core.math.types.Vec2
property rotation: float
property rotation_degrees: float
property scale: simvx.core.math.types.Vec2
property global_position: simvx.core.math.types.Vec2
property global_rotation: float
property global_scale: simvx.core.math.types.Vec2
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, color=None)
wrap_screen(margin: float = 20)
script_error_raised

‘Signal(…)’

classmethod __init_subclass__(**kwargs)
property name: str
property process_mode: simvx.core.descriptors.ProcessMode
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(node_type: type) simvx.core.node.Node | None
find_all(node_type: type, recursive: bool = True) list
property path: str
add_to_group(group: str)
remove_from_group(group: str)
is_in_group(group: str) bool
enter_tree() None
exit_tree() None
physics_process(dt: float) None
input_event(event: simvx.core.events.InputEvent) None
input(event: simvx.core.events.TreeInputEvent) None
unhandled_input(event: simvx.core.events.TreeInputEvent) None
start_coroutine(gen: simvx.core.descriptors.Coroutine) simvx.core.descriptors.CoroutineHandle
stop_coroutine(gen_or_handle)
destroy()
queue_free

None

property tree: simvx.core.scene_tree.SceneTree
get_tree() simvx.core.scene_tree.SceneTree
__getitem__(key: str)
classmethod get_properties() dict[str, simvx.core.descriptors.Property]
get_settings

None

__repr__()