extends GraphNode class_name DeckNodeRendererGraphNode ## [GraphNode] based renderer of [DeckNode] ## Stores the data container [DeckNode] that the visuals of this [DeckNodeRendererGraphNode] ## are based off. var node: DeckNode ## Setups up all the properties based off [member node]. Including looping through ## [method DeckNode.get_all_ports()] and setting up all the descriptors. 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, ) ## Connected to [signal GraphElement.position_offset_updated] and updates the ## [member node]s properties func _on_position_offset_changed() -> void: node.position.x = position_offset.x node.position.y = position_offset.y ## Connected to [member node]s [signal position_updated] to keep parity with the ## data position. func _on_node_position_updated(new_position: Dictionary) -> void: position_offset.x = new_position.x position_offset.y = new_position.y ## Connected to [member node]s [signal port_added] handles setting up the specified ## [member Port.descriptor] with it's required nodes/signals etc. + adding the port ## using [method GraphNode.set_slot] 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, ) ## Connected to [member node]s [signal port_removed], queue_frees the [Node] ## used for the descriptor, as well as using [method GraphNode.set_slot] to remove the slot. 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() ## Connected to [member node]s [signal ports_updated]. Remakes all of the ports ## + their descriptors whenever this is received to allow keeping the Renderers ports up to date. 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, )