make group io nodes 'optional' (#167)

Reviewed-on: https://codeberg.org/StreamGraph/StreamGraph/pulls/167
Co-authored-by: Lera Elvoé <yagich@poto.cafe>
Co-committed-by: Lera Elvoé <yagich@poto.cafe>
This commit is contained in:
Lera Elvoé 2024-07-02 09:29:06 +00:00 committed by yagich
parent 83f6fa1fae
commit 3bff8e27e6
3 changed files with 36 additions and 7 deletions

View file

@ -50,10 +50,6 @@ var _belonging_to: String = "" # for groups
var group_input_node: String var group_input_node: String
## The ID of this group's input node. Used only if [member is_group] is [code]true[/code]. ## The ID of this group's input node. Used only if [member is_group] is [code]true[/code].
var group_output_node: String var group_output_node: String
## The ID of the group node this group is represented by, contained in this deck's parent deck.
## Used only if [member is_group] is [code]true[/code].
## @experimental
#var group_node: String
var emit_group_signals: bool = true var emit_group_signals: bool = true
var emit_node_added_signal: bool = true var emit_node_added_signal: bool = true
@ -97,8 +93,17 @@ func add_node_type(type: String, assign_id: String = "", assign_to_self: bool =
## If [param assign_id] is empty, the node will get its' ID (re-)assigned. ## If [param assign_id] is empty, the node will get its' ID (re-)assigned.
## Otherwise, it will be assigned to be that value.[br] ## Otherwise, it will be assigned to be that value.[br]
## If [param assign_to_self] is [code]true[/code], the node's ## If [param assign_to_self] is [code]true[/code], the node's
## [member DeckNode._belonging_to] property will be set to [code]self[/code]. ## [member DeckNode._belonging_to] property will be set to [code]self[/code].[br]
## Returns [code]null[/code] if the node cannot be insantiated.
func add_node_inst(node: DeckNode, assign_id: String = "", assign_to_self: bool = true) -> DeckNode: func add_node_inst(node: DeckNode, assign_id: String = "", assign_to_self: bool = true) -> DeckNode:
if node.node_type == "group_input" and not group_input_node.is_empty():
DeckHolder.logger.toast_error("Cannot add group input node, one already exists!")
node.free()
return null
if node.node_type == "group_output" and not group_output_node.is_empty():
DeckHolder.logger.toast_error("Cannot add group output node, one already exists!")
node.free()
return null
if assign_to_self: if assign_to_self:
node._belonging_to = self node._belonging_to = self
#node._belonging_to_instance = instance_id #node._belonging_to_instance = instance_id
@ -113,9 +118,17 @@ func add_node_inst(node: DeckNode, assign_id: String = "", assign_to_self: bool
if node.node_type == "group_input": if node.node_type == "group_input":
group_input_node = node._id group_input_node = node._id
node.about_to_free.connect(
func():
group_input_node = ""
)
if node.node_type == "group_output": if node.node_type == "group_output":
group_output_node = node._id group_output_node = node._id
node.about_to_free.connect(
func():
group_output_node = ""
)
if emit_node_added_signal: if emit_node_added_signal:
node_added.emit(node) node_added.emit(node)
@ -702,7 +715,9 @@ static func from_dict(data: Dictionary, path: String = "") -> Deck:
node.group_instance_id node.group_instance_id
) )
if not node.input_node_id.is_empty():
group.get_node(node.input_node_id).group_node = node group.get_node(node.input_node_id).group_node = node
if not node.output_node_id.is_empty():
group.get_node(node.output_node_id).group_node = node group.get_node(node.output_node_id).group_node = node
node.init_io() node.init_io()

View file

@ -60,6 +60,17 @@ func init_io() -> void:
input_node = group.get_node(input_node_id) input_node = group.get_node(input_node_id)
output_node = group.get_node(output_node_id) output_node = group.get_node(output_node_id)
if input_node:
input_node.about_to_free.connect(
func():
input_node_id = ""
)
if output_node:
output_node.about_to_free.connect(
func():
output_node_id = ""
)
recalculate_ports() recalculate_ports()
setup_connections() setup_connections()

View file

@ -345,6 +345,9 @@ func _on_add_node_menu_node_selected(type: String) -> void:
# deck.add_node_inst(node) # deck.add_node_inst(node)
var node := deck.add_node_type(type) var node := deck.add_node_type(type)
if node == null:
return
get_node_renderer(node).position_offset = node_pos get_node_renderer(node).position_offset = node_pos
else: else:
var node := deck.add_lib_group_node(type) var node := deck.add_lib_group_node(type)