simvx.editor.make_custom_class_dialog

Convert to Custom Class – give a node a class of its own, and bind the scene to it.

Opens from the scene tree’s context menu and from the Inspector header when the selected node’s class is one the engine ships. The user picks:

  • a class name (defaults to the node’s name);

  • a template, which is the code the class is written with – Empty for a class with nothing in it, or one of :data:~simvx.editor.templates.TEMPLATES whose base the node already descends from;

  • where the file goes: a new file under [editor].class_files_dir, whose path the user may edit, or the scene file itself.

On submit :func:~simvx.editor.convert_to_class.convert_node_to_class writes the class, points the scene’s own source at it, saves through the plan/commit path and reloads, so the node in the editor afterwards IS an instance of the new class – built by running it, with whatever the template declared already there. The new file is then opened in the code workspace, at the class it defines. What the save could not do beyond the conversion goes to the editor’s save-report card, which is where a save that changes the author’s own file says so.

Name collisions are detected up-front via :class:ProjectClassIndex, and so are the conditions the conversion would refuse for: a scene that has never been saved has no source to bind to.

Module Contents

Classes

MakeCustomClassDialog

Modal dialog that converts a node into a user class of its own.

Functions

snake_case

Convert CamelCase / mixed Name to camel_case for filenames.

Data

API

simvx.editor.make_custom_class_dialog.log

‘getLogger(…)’

simvx.editor.make_custom_class_dialog.__all__

[‘MakeCustomClassDialog’, ‘snake_case’]

simvx.editor.make_custom_class_dialog.snake_case(name: str) str[source]

Convert CamelCase / mixed Name to camel_case for filenames.

class simvx.editor.make_custom_class_dialog.MakeCustomClassDialog(state: simvx.editor.state.State | None = None, **kwargs)[source]

Bases: simvx.core.Panel

Modal dialog that converts a node into a user class of its own.

Construct once per editor; call :meth:show_for with the target node each time the action fires. The dialog reads state.project_path and the [editor].class_files_dir setting to place new files; if the project has no simvx.toml the default is src/ (matching

Class:

ProjectClassIndex).

Initialization

DIALOG_W

None

DIALOG_H

None

visible

‘Property(…)’

z_index

‘Property(…)’

created

‘Signal(…)’

cancelled

‘Signal(…)’

set_project_index(index: simvx.editor.project_classes.ProjectClassIndex | None) None[source]

Wire (or clear) the project-class index used for collision detection.

show_for(node: simvx.core.Node, parent_size: simvx.core.Vec2 | None = None) None[source]

Open the dialog targeting node and centre it within parent_size.

hide_dialog() None[source]

Hide the dialog without emitting a result.

property template: str[source]

The template the class will be written with.

property destination: pathlib.Path | None[source]

The file the class will be written to, as the form currently reads.

on_draw(renderer)[source]
style

‘ThemeStyleBox(…)’

property bg_colour
property border_colour
property border_width
get_minimum_size() simvx.core.math.types.Vec2
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(…)’

dismiss_on_outside_click

‘Property(…)’

clip_contents

‘Property(…)’

focus_mode

‘Property(…)’

tooltip

‘Property(…)’

mouse_filter

‘Property(…)’

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
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()
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]
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)
activate() bool
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_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

dev_checks: ClassVar[bool]

None

script_error_raised

‘Signal(…)’

dynamic: bool

False

update_mode

‘Property(…)’

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

None

classmethod __init_subclass__(**kwargs)
property name: str
property visible_in_tree: bool
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_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()
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__()