miggor-StreamGraph/classes/deck/nodes/group_input_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

72 lines
1.8 KiB
GDScript

extends DeckNode
var output_count: int:
get:
return get_all_ports().size() - 1
func _init() -> void:
name = "Group input"
node_type = "group_input"
props_to_serialize = [&"output_count"]
appears_in_search = false
add_output_port(
DeckType.Types.ANY,
"Input 0"
)
outgoing_connection_added.connect(_on_outgoing_connection_added)
outgoing_connection_removed.connect(_on_outgoing_connection_removed)
func _on_outgoing_connection_added(port_idx: int) -> void:
if port_idx + 1 < get_all_ports().size():
return
add_output_port(
DeckType.Types.ANY,
"Input %s" % (get_all_ports().size())
)
func _on_outgoing_connection_removed(port_idx: int) -> void:
var last_connected_port := 0
for port: int in outgoing_connections.keys().slice(1):
if !(outgoing_connections[port] as Array).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 output_count + 1:
add_output_port(
DeckType.Types.ANY,
"Input %s" % (i + 1)
)
func _post_load() -> void:
# ensure we have enough ports after connections
var last_connected_port := 0
for port: int in outgoing_connections:
last_connected_port = port if outgoing_connections.has(port) else last_connected_port
if ports.size() <= last_connected_port:
for i in last_connected_port:
add_output_port(
DeckType.Types.ANY,
"Input %s" % get_output_ports().size()
)
func _value_request(from_port: int) -> Variant:
var group_node := _belonging_to._belonging_to.get_node(_belonging_to.group_node)
return group_node.request_value(group_node.get_input_ports()[from_port].index_of_type)