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

GraphPort

Input or output port on a GraphNode.

GraphConnection

Connection between two ports on two GraphNodes.

GraphNode

A node in the graph editor with titled header and typed input/output ports.

GraphEdit

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.Container

A 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
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)
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.Control

Zoomable 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
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
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__()