simvx.editor.panels.section_widgets¶

Shared section and property-row widgets for editor panels.

Provides the primitive UI building blocks used by the inspector, material editor, and other panels that display collapsible property sections:

  • SectionHeader – Clickable toggle bar for collapsible sections

  • Section – Lightweight data-structure grouping header + body rows

  • PropertyRow – Label + widget pair on a single line

  • VectorRow – Multi-component vector editor (Vec2 or Vec3)

  • ResourcePicker – File path display with Browse / Clear buttons

Module Contents¶

Classes¶

SectionHeader

Clickable section header that toggles visibility of its section body.

Section

Logical grouping of a header and its body rows.

PropertyRow

A single property row: label on the left, widget on the right.

VectorRow

Edits a Vec2 or Vec3 with labeled SpinBox widgets per component.

ResourcePicker

Displays a file path with Browse and Clear buttons.

Functions¶

Data¶

API¶

simvx.editor.panels.section_widgets.SECTION_BG¶

(0.18, 0.18, 0.18, 1.0)

simvx.editor.panels.section_widgets.SECTION_HOVER_BG¶

(0.22, 0.22, 0.22, 1.0)

simvx.editor.panels.section_widgets.SECTION_LABEL_COLOUR¶

(0.85, 0.85, 0.85, 1.0)

simvx.editor.panels.section_widgets.SEPARATOR_COLOUR¶

(0.25, 0.25, 0.25, 1.0)

simvx.editor.panels.section_widgets.SECTION_HEADER_HEIGHT()[source]¶
simvx.editor.panels.section_widgets.PADDING()[source]¶
simvx.editor.panels.section_widgets.FONT_SIZE()[source]¶
simvx.editor.panels.section_widgets.ROW_HEIGHT()[source]¶
simvx.editor.panels.section_widgets.LABEL_WIDTH()[source]¶
simvx.editor.panels.section_widgets.INDENT()[source]¶
class simvx.editor.panels.section_widgets.SectionHeader(title: str, collapsed: bool = False, *, label_colour: tuple[float, ...] = SECTION_LABEL_COLOUR, bg_colour: tuple[float, ...] = SECTION_BG, hover_bg_colour: tuple[float, ...] = SECTION_HOVER_BG, separator_colour: tuple[float, ...] = SEPARATOR_COLOUR, **kwargs)[source]¶

Bases: simvx.core.Control

Clickable section header that toggles visibility of its section body.

Initialization

draw(renderer)[source]¶
size_x¶

‘Property(…)’

size_y¶

‘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¶
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)¶
draw_popup(renderer)¶
is_popup_point_inside(point) bool¶
popup_input(event)¶
dismiss_popup()¶
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 position: simvx.core.math.types.Vec2¶
property rotation: float¶
property rotation_degrees: float¶
property scale: simvx.core.math.types.Vec2¶
property world_position: simvx.core.math.types.Vec2¶
property world_rotation: float¶
property world_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, 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¶
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, recursive: bool = True) 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¶
ready() None¶
enter_tree() None¶
exit_tree() None¶
process(dt: float) 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)¶
clear_children()¶
destroy()¶
property app¶
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]¶
__repr__()¶
class simvx.editor.panels.section_widgets.Section(header: simvx.editor.panels.section_widgets.SectionHeader, rows: list[simvx.core.Control])[source]¶

Logical grouping of a header and its body rows.

Not a Control itself – just a data structure tracked by the owning panel. The header and rows are added as children of the panel’s scroll content.

Initialization

__slots__¶

(‘header’, ‘rows’, ‘collapsed’)

toggle(collapsed: bool)[source]¶
class simvx.editor.panels.section_widgets.PropertyRow(label_text: str, widget: simvx.core.Control, **kwargs)[source]¶

Bases: simvx.core.Control

A single property row: label on the left, widget on the right.

Initialization

process(dt: float)[source]¶
draw(renderer)[source]¶
size_x¶

‘Property(…)’

size_y¶

‘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¶
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)¶
draw_popup(renderer)¶
is_popup_point_inside(point) bool¶
popup_input(event)¶
dismiss_popup()¶
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 position: simvx.core.math.types.Vec2¶
property rotation: float¶
property rotation_degrees: float¶
property scale: simvx.core.math.types.Vec2¶
property world_position: simvx.core.math.types.Vec2¶
property world_rotation: float¶
property world_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, 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¶
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, recursive: bool = True) 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¶
ready() None¶
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)¶
clear_children()¶
destroy()¶
property app¶
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]¶
__repr__()¶
class simvx.editor.panels.section_widgets.VectorRow(label_text: str, components: int, values: tuple, step: float = 0.1, min_val: float = -10000, max_val: float = 10000, **kwargs)[source]¶

Bases: simvx.core.Control

Edits a Vec2 or Vec3 with labeled SpinBox widgets per component.

Initialization

get_values() tuple[source]¶

Return current component values as a tuple.

set_values(vals: tuple)[source]¶

Set component values without triggering signals.

process(dt: float)[source]¶
draw(renderer)[source]¶
size_x¶

‘Property(…)’

size_y¶

‘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¶
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)¶
draw_popup(renderer)¶
is_popup_point_inside(point) bool¶
popup_input(event)¶
dismiss_popup()¶
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 position: simvx.core.math.types.Vec2¶
property rotation: float¶
property rotation_degrees: float¶
property scale: simvx.core.math.types.Vec2¶
property world_position: simvx.core.math.types.Vec2¶
property world_rotation: float¶
property world_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, 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¶
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, recursive: bool = True) 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¶
ready() None¶
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)¶
clear_children()¶
destroy()¶
property app¶
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]¶
__repr__()¶
class simvx.editor.panels.section_widgets.ResourcePicker(current_path: str | None = None, file_filter: str = '*.*', **kwargs)[source]¶

Bases: simvx.core.HBoxContainer

Displays a file path with Browse and Clear buttons.

Emits file_selected(path) when the user picks a file, and cleared() when the Clear button is pressed.

Initialization

set_path(path: str | None)[source]¶

Update the displayed path.

alignment¶

‘Property(…)’

get_minimum_size() simvx.core.math.types.Vec2¶
separation¶

‘Property(…)’

ready()¶
add_child(node)¶
remove_child(node)¶
mark_layout_dirty()¶
process(dt: float)¶
size_x¶

‘Property(…)’

size_y¶

‘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¶
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)¶
draw_popup(renderer)¶
is_popup_point_inside(point) bool¶
popup_input(event)¶
dismiss_popup()¶
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 position: simvx.core.math.types.Vec2¶
property rotation: float¶
property rotation_degrees: float¶
property scale: simvx.core.math.types.Vec2¶
property world_position: simvx.core.math.types.Vec2¶
property world_rotation: float¶
property world_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, 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¶
reset_error() None¶
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, recursive: bool = True) 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¶
draw(renderer) 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)¶
clear_children()¶
destroy()¶
property app¶
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]¶
__repr__()¶