miggor-StreamGraph/classes/deck/nodes/group_output_node.gd
Lera Elvoé c4e35043df types system simplification (#8)
no longer using classes for every type. the type system has been greatly simplified, with the added bonus that it hooks directly into GraphEdit's slot type system. connections will still fail if the type conversion fails, which may be used by other renderers.

the type conversion map is straightforward to understand, and easy to extend should the need arise (hopefully it shouldn't).

Reviewed-on: https://codeberg.org/Eroax/Re-DotDeck/pulls/8
Co-authored-by: Lera Elvoé <yagich@poto.cafe>
Co-committed-by: Lera Elvoé <yagich@poto.cafe>
2023-11-26 22:07:15 +00:00

73 lines
1.8 KiB
GDScript

extends DeckNode
var input_count: int:
get:
return get_all_ports().size() - 1
func _init() -> void:
name = "Group output"
node_type = "group_output"
props_to_serialize = [&"input_count"]
appears_in_search = false
add_input_port(
DeckType.Types.ANY,
"Output 0"
)
incoming_connection_added.connect(_on_incoming_connection_added)
incoming_connection_removed.connect(_on_incoming_connection_removed)
func _on_incoming_connection_added(port_idx: int) -> void:
if port_idx + 1 < get_all_ports().size():
return
add_input_port(
DeckType.Types.ANY,
"Output %s" % (get_all_ports().size())
)
func _on_incoming_connection_removed(port_idx: int) -> void:
var last_connected_port := 0
for port: int in incoming_connections.keys().slice(1):
if !(incoming_connections[port] as Dictionary).is_empty():
last_connected_port = port
prints("l:", last_connected_port, "p:", port_idx)
if port_idx < last_connected_port:
return
var s := get_all_ports().slice(0, last_connected_port + 2)
ports.assign(s)
ports_updated.emit()
func _pre_connection() -> void:
for i in input_count + 1:
add_input_port(
DeckType.Types.ANY,
"Output %s" % (i + 1)
)
func _post_load() -> void:
# ensure we have enough ports after connections
var last_connected_port := 0
for port: int in incoming_connections:
last_connected_port = port if incoming_connections.has(port) else last_connected_port
if ports.size() <= last_connected_port:
for i in last_connected_port:
add_input_port(
DeckType.Types.ANY,
"Output %s" % get_input_ports().size()
)
func _receive(to_input_port: int, data: Variant, extra_data: Array = []) -> void:
var group_node := _belonging_to._belonging_to.get_node(_belonging_to.group_node)
group_node.send(group_node.get_output_ports()[to_input_port].index_of_type, data, extra_data)