simvx.core.ui.graph_edit¶
Node graph editor widget for visual programming, animation blend trees, shader graphs.
Provides GraphNode (a draggable node with typed input/output ports) and GraphEdit (a zoomable canvas that manages nodes and connections).
Module Contents¶
Classes¶
Input or output port on a GraphNode. |
|
Connection between two ports on two GraphNodes. |
|
A node in the graph editor with titled header and typed input/output ports. |
|
Zoomable node graph editor with pan, zoom, and connection management. |
Data¶
API¶
- simvx.core.ui.graph_edit.__all__¶
[‘GraphPort’, ‘GraphConnection’, ‘GraphNode’, ‘GraphEdit’]
- class simvx.core.ui.graph_edit.GraphPort¶
Input or output port on a GraphNode.
Attributes: name: Display name. type: Type identifier for connection validation. color: RGBA color for the port indicator.
- name: str¶
None
- type: str¶
‘default’
- color: tuple[float, float, float, float]¶
(0.8, 0.8, 0.8, 1.0)
- class simvx.core.ui.graph_edit.GraphConnection¶
Connection between two ports on two GraphNodes.
Attributes: from_node: Source node name. from_port: Source output port index. to_node: Destination node name. to_port: Destination input port index.
- from_node: str¶
None
- from_port: int¶
None
- to_node: str¶
None
- to_port: int¶
None
- class simvx.core.ui.graph_edit.GraphNode(title: str = 'Node', **kwargs)¶
Bases:
simvx.core.ui.containers.ContainerA node in the graph editor with titled header and typed input/output ports.
Example: node = GraphNode(title=”Add”) node.add_input(“A”, type=”float”) node.add_input(“B”, type=”float”) node.add_output(“Result”, type=”float”) graph.add_graph_node(node)
Initialization
- add_input(name: str, type: str = 'default') int¶
Add an input port. Returns port index.
- add_output(name: str, type: str = 'default') int¶
Add an output port. Returns port index.
- get_input_port_position(index: int) tuple[float, float]¶
Position of input port in local node space.
- get_output_port_position(index: int) tuple[float, float]¶
Position of output port in local node space.
- 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¶
- 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¶
- 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¶
- 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)¶
- 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__()¶
- class simvx.core.ui.graph_edit.GraphEdit(**kwargs)¶
Bases:
simvx.core.ui.core.ControlZoomable node graph editor with pan, zoom, and connection management.
Nodes are placed in graph space. The viewport applies zoom and scroll offset to determine which portion of the graph is visible.
Example: graph = GraphEdit() node_a = GraphNode(name=”A”, title=”Source”) node_a.add_output(“Out”) graph.add_graph_node(node_a)
node_b = GraphNode(name="B", title="Sink") node_b.add_input("In") graph.add_graph_node(node_b) graph.connect_node("A", 0, "B", 0)Initialization
- add_graph_node(node: simvx.core.ui.graph_edit.GraphNode)¶
Register a GraphNode in this editor.
- remove_graph_node(name: str)¶
Remove a GraphNode and all its connections.
- get_node(name: str) simvx.core.ui.graph_edit.GraphNode | None¶
Retrieve a graph node by name.
- connect_node(from_node: str, from_port: int, to_node: str, to_port: int)¶
Create a connection between two ports.
- disconnect_node(from_node: str, from_port: int, to_node: str, to_port: int)¶
Remove a specific connection.
- get_connections() list[simvx.core.ui.graph_edit.GraphConnection]¶
Return a copy of the current connections list.
- clear_connections()¶
Remove all connections.
- set_zoom(zoom: float)¶
Set zoom level, clamped to [0.25, 2.0].
- property zoom: float¶
- property scroll_offset: tuple[float, float]¶
- center_on_node(name: str)¶
Pan the viewport to center on the named node.
- 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)¶
- find_child(name: str, recursive: bool = False) simvx.core.node.Node | None¶
- find(node_type: type) simvx.core.node.Node | None¶
- 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¶
- 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)¶
- 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__()¶