extends GraphNode class_name DeckNodeRendererGraphNode var node: DeckNode func _ready() -> void: title = node.name node.position_updated.connect(_on_node_position_updated) #node.port_added.connect(_on_node_port_added) #node.port_removed.connect(_on_node_port_removed) node.ports_updated.connect(_on_node_ports_updated) for port in node.get_all_ports(): var descriptor_split := port.descriptor.split(":") match descriptor_split[0]: "button": var button := Button.new() add_child(button) button.text = port.label if port.port_type == DeckNode.PortType.OUTPUT: button.pressed.connect( func(): node.send(port.index_of_type, DeckType.DeckTypeBool.new(true)) ) elif port.port_type == DeckNode.PortType.INPUT: button.pressed.connect( func(): node._receive(port.index_of_type, DeckType.DeckTypeBool.new(true)) ) "field": var line_edit := LineEdit.new() add_child(line_edit) if port.value: line_edit.text = str(port.value) line_edit.placeholder_text = port.label port.value_callback = line_edit.get_text line_edit.text_changed.connect(port.set_value) _: var label := Label.new() add_child(label) label.text = port.label set_slot( port.index, port.port_type == DeckNode.PortType.INPUT, 0, Color.WHITE, port.port_type == DeckNode.PortType.OUTPUT, 0, Color.WHITE, ) func _on_position_offset_changed() -> void: node.position.x = position_offset.x node.position.y = position_offset.y func _on_node_position_updated(new_position: Dictionary) -> void: position_offset.x = new_position.x position_offset.y = new_position.y func _on_node_port_added(port_idx: int) -> void: var port := node.get_all_ports()[port_idx] var descriptor_split := port.descriptor.split(":") match descriptor_split[0]: "button": var button := Button.new() add_child(button) button.text = port.label if port.port_type == DeckNode.PortType.OUTPUT: button.pressed.connect( func(): node.send(port.index_of_type, DeckType.DeckTypeBool.new(true)) ) elif port.port_type == DeckNode.PortType.INPUT: button.pressed.connect( func(): node._receive(port.index_of_type, DeckType.DeckTypeBool.new(true)) ) "field": var line_edit := LineEdit.new() add_child(line_edit) if port.value: line_edit.text = str(port.value) line_edit.placeholder_text = port.label port.value_callback = line_edit.get_text line_edit.text_changed.connect(port.set_value) _: var label := Label.new() add_child(label) label.text = port.label set_slot( port.index, port.port_type == DeckNode.PortType.INPUT, 0, Color.WHITE, port.port_type == DeckNode.PortType.OUTPUT, 0, Color.WHITE, ) func _on_node_port_removed(port_idx: int) -> void: set_slot( port_idx, false, 0, Color.WHITE, false, 0, Color.WHITE, ) get_child(port_idx).queue_free() func _on_node_ports_updated() -> void: clear_all_slots() for c in get_children(): c.queue_free() for port in node.get_all_ports(): var descriptor_split := port.descriptor.split(":") match descriptor_split[0]: "button": var button := Button.new() add_child(button) button.text = port.label if port.port_type == DeckNode.PortType.OUTPUT: button.pressed.connect( func(): node.send(port.index_of_type, DeckType.DeckTypeBool.new(true)) ) elif port.port_type == DeckNode.PortType.INPUT: button.pressed.connect( func(): node._receive(port.index_of_type, DeckType.DeckTypeBool.new(true)) ) "field": var line_edit := LineEdit.new() add_child(line_edit) if port.value: line_edit.text = str(port.value) line_edit.placeholder_text = port.label port.value_callback = line_edit.get_text line_edit.text_changed.connect(port.set_value) _: var label := Label.new() add_child(label) label.text = port.label set_slot( port.index, port.port_type == DeckNode.PortType.INPUT, 0, Color.WHITE, port.port_type == DeckNode.PortType.OUTPUT, 0, Color.WHITE, )