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 –
Emptyfor a class with nothing in it, or one of :data:~simvx.editor.templates.TEMPLATESwhose 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¶
Modal dialog that converts a node into a user class of its own. |
Functions¶
Convert |
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 Nametocamel_casefor filenames.
- class simvx.editor.make_custom_class_dialog.MakeCustomClassDialog(state: simvx.editor.state.State | None = None, **kwargs)[source]¶
Bases:
simvx.core.PanelModal dialog that converts a node into a user class of its own.
Construct once per editor; call :meth:
show_forwith the target node each time the action fires. The dialog readsstate.project_pathand the[editor].class_files_dirsetting to place new files; if the project has nosimvx.tomlthe default issrc/(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
nodeand centre it withinparent_size.
- property destination: pathlib.Path | None[source]¶
The file the class will be written to, as the form currently reads.
- 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__()¶