rework RPC Signal Layer class (#101)

Reviewed-on: https://codeberg.org/StreamGraph/StreamGraph/pulls/101
Co-authored-by: Lera Elvoé <yagich@poto.cafe>
Co-committed-by: Lera Elvoé <yagich@poto.cafe>
This commit is contained in:
Lera Elvoé 2024-03-14 05:54:25 +00:00 committed by yagich
parent 3886414374
commit a1b74410f6
11 changed files with 182 additions and 23 deletions

View file

@ -42,7 +42,9 @@ var emit_node_added_signal: bool = true
signal node_added(node: DeckNode) signal node_added(node: DeckNode)
## Emitted when a node has been removed from this deck. ## Emitted when a node has been removed from this deck.
signal node_removed(node: DeckNode) signal node_removed(node: DeckNode)
## Emitted when nodes have been disconnected ## Emitted when nodes have been connected.
signal nodes_connected(from_node_id: String, to_node_id: String, from_output_port: int, to_input_port: int)
## Emitted when nodes have been disconnected.
signal nodes_disconnected(from_node_id: String, to_node_id: String, from_output_port: int, to_input_port: int) signal nodes_disconnected(from_node_id: String, to_node_id: String, from_output_port: int, to_input_port: int)
## Emitted when the [member variable_stack] has been modified. ## Emitted when the [member variable_stack] has been modified.
signal variables_updated() signal variables_updated()
@ -57,6 +59,17 @@ signal node_renamed(node_id: String, new_name: String, deck: Deck)
signal node_moved(node_id: String, new_position: Dictionary, deck: Deck) signal node_moved(node_id: String, new_position: Dictionary, deck: Deck)
#endregion #endregion
func connect_rpc_signals() -> void:
node_added.connect(RPCSignalLayer._on_deck_node_added)
node_removed.connect(RPCSignalLayer._on_deck_node_removed)
nodes_connected.connect(RPCSignalLayer._on_deck_nodes_connected.bind(id))
nodes_disconnected.connect(RPCSignalLayer._on_deck_nodes_disconnected.bind(id))
variables_updated.connect(RPCSignalLayer._on_deck_variables_updated.bind(id))
## Instantiate a node by its' [member DeckNode.node_type] and add it to this deck.[br] ## Instantiate a node by its' [member DeckNode.node_type] and add it to this deck.[br]
## See [method add_node_inst] for parameter descriptions. ## See [method add_node_inst] for parameter descriptions.
func add_node_type(type: String, assign_id: String = "", assign_to_self: bool = true) -> DeckNode: func add_node_type(type: String, assign_id: String = "", assign_to_self: bool = true) -> DeckNode:
@ -106,6 +119,8 @@ func add_node_inst(node: DeckNode, assign_id: String = "", assign_to_self: bool
node_moved.emit(node._id, new_position, self) node_moved.emit(node._id, new_position, self)
) )
node.connect_rpc_signals()
return node return node
@ -161,6 +176,7 @@ func connect_nodes(from_node_id: String, to_node_id: String, from_output_port: i
nodes_connected_in_group.emit(from_node_id, to_node_id, from_output_port, to_input_port, self) nodes_connected_in_group.emit(from_node_id, to_node_id, from_output_port, to_input_port, self)
from_node.add_outgoing_connection(from_output_port, to_node._id, to_input_port) from_node.add_outgoing_connection(from_output_port, to_node._id, to_input_port)
nodes_connected.emit(from_node_id, to_node_id, from_output_port, to_input_port)
return true return true

View file

@ -9,10 +9,17 @@ class_name DeckHolder
#static var decks: Array[Deck] #static var decks: Array[Deck]
static var decks: Dictionary # Dictionary[String -> id, (Deck|Dictionary[String -> instance_id, Deck])] static var decks: Dictionary # Dictionary[String -> id, (Deck|Dictionary[String -> instance_id, Deck])]
static var groups_emitted: Array[String]
static var logger := Logger.new() static var logger := Logger.new()
static var signals := Signals.new() static var signals := Signals.new()
static func _static_init() -> void:
signals.deck_added.connect(RPCSignalLayer._on_deck_added)
signals.deck_closed.connect(RPCSignalLayer._on_deck_closed)
## Returns a new empty deck and assigns a new random ID to it. ## Returns a new empty deck and assigns a new random ID to it.
static func add_empty_deck() -> Deck: static func add_empty_deck() -> Deck:
var deck := Deck.new() var deck := Deck.new()
@ -20,6 +27,7 @@ static func add_empty_deck() -> Deck:
decks[uuid] = deck decks[uuid] = deck
deck.id = uuid deck.id = uuid
signals.deck_added.emit(uuid) signals.deck_added.emit(uuid)
deck.connect_rpc_signals()
return deck return deck
@ -37,6 +45,7 @@ static func open_deck_from_dict(data: Dictionary, path := "") -> Deck:
var deck := Deck.from_dict(data, path) var deck := Deck.from_dict(data, path)
decks[deck.id] = deck decks[deck.id] = deck
signals.deck_added.emit(deck.id) signals.deck_added.emit(deck.id)
deck.connect_rpc_signals()
return deck return deck
@ -50,7 +59,11 @@ static func add_group_from_dict(data: Dictionary, deck_id: String, instance_id:
instances[instance_id] = group instances[instance_id] = group
decks[deck_id] = instances decks[deck_id] = instances
connect_group_signals(group) connect_group_signals(group)
signals.deck_added.emit(deck_id)
if deck_id not in groups_emitted:
signals.deck_added.emit(deck_id)
groups_emitted.append(deck_id)
return group return group
@ -67,7 +80,9 @@ static func add_empty_group() -> Deck:
group.instance_id = UUID.v4() group.instance_id = UUID.v4()
decks[group.id] = {group.instance_id: group} decks[group.id] = {group.instance_id: group}
connect_group_signals(group) connect_group_signals(group)
signals.deck_added.emit(group.id) if group.id not in groups_emitted:
signals.deck_added.emit(group.id)
groups_emitted.append(group.id)
return group return group
@ -112,6 +127,8 @@ static func close_group_instance(group_id: String, instance_id: String) -> void:
if group_instances.is_empty(): if group_instances.is_empty():
for group in dangling_groups: for group in dangling_groups:
close_all_group_instances(group) close_all_group_instances(group)
signals.deck_closed.emit(group_id)
groups_emitted.erase(group_id)
decks.erase(group_id) decks.erase(group_id)
@ -128,9 +145,9 @@ static func close_deck(deck_id: String) -> Array:
var groups := deck.get_referenced_groups() var groups := deck.get_referenced_groups()
for group in groups: for group in groups:
close_all_group_instances(group) close_all_group_instances(group)
signals.deck_closed.emit(deck_id)
decks.erase(deck_id) decks.erase(deck_id)
return groups return groups
signals.deck_closed.emit(deck_id)
return [] return []

View file

@ -75,6 +75,13 @@ signal port_value_updated(port_idx: int, new_value: Variant)
signal renamed(new_name: String) signal renamed(new_name: String)
func connect_rpc_signals() -> void:
port_added.connect(RPCSignalLayer._on_node_port_added.bind(self))
ports_updated.connect(RPCSignalLayer._on_node_ports_updated.bind(self))
port_value_updated.connect(RPCSignalLayer._on_node_port_value_updated.bind(self))
renamed.connect(RPCSignalLayer._on_node_renamed.bind(self))
## Add an input port to this node. Usually only used at initialization. ## Add an input port to this node. Usually only used at initialization.
func add_input_port( func add_input_port(
type: DeckType.Types, type: DeckType.Types,

View file

@ -3,7 +3,6 @@
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
extends DeckNode extends DeckNode
var thread : Thread
func _init(): func _init():
name = "Delay" name = "Delay"

View file

@ -7,27 +7,58 @@ class_name RPCSignalLayer
static var signals := Signals.new() static var signals := Signals.new()
static func _static_init() -> void: #region deck holder
DeckHolder.signals.deck_added.connect(RPCSignalLayer._on_deck_added)
DeckHolder.signals.deck_closed.connect(
func(deck_id: String):
signals.deck_closed.emit(deck_id)
)
static func _on_deck_added(deck_id: String) -> void: static func _on_deck_added(deck_id: String) -> void:
signals.deck_added.emit(deck_id) signals.deck_added.emit(deck_id)
DeckHolder.get_deck(deck_id).node_added.connect(RPCSignalLayer._on_deck_node_added)
static func _on_deck_closed(deck_id: String) -> void:
signals.deck_closed.emit(deck_id)
#endregion
#region deck
static func _on_deck_node_added(node: DeckNode) -> void: static func _on_deck_node_added(node: DeckNode) -> void:
signals.deck_node_added.emit(node._belonging_to.id, node._id) signals.deck_node_added.emit(node._belonging_to.id, node._id)
node.position_updated.connect(RPCSignalLayer._on_node_position_updated.bind(node._belonging_to.id, node._id))
static func _on_node_position_updated(new_position: Dictionary, node_id: String, deck_id: String) -> void: static func _on_deck_node_removed(node: DeckNode) -> void:
signals.node_position_updated.emit(deck_id, node_id, new_position) signals.deck_node_removed.emit(node._belonging_to.id, node._id)
static func _on_deck_nodes_connected(from_node_id: String, to_node_id: String, from_output_port: int, to_input_port: int, deck_id: String) -> void:
signals.deck_nodes_connected.emit(deck_id, from_node_id, to_node_id, from_output_port, to_input_port)
static func _on_deck_nodes_disconnected(from_node_id: String, to_node_id: String, from_output_port: int, to_input_port: int, deck_id: String) -> void:
signals.deck_nodes_disconnected.emit(deck_id, from_node_id, to_node_id, from_output_port, to_input_port)
static func _on_deck_variables_updated(deck_id: String) -> void:
signals.deck_variables_updated.emit(deck_id)
#endregion
#region node
static func _on_node_position_updated(new_position: Dictionary, node: DeckNode) -> void:
signals.node_position_updated.emit(node._belonging_to.id, node._id, new_position)
static func _on_node_port_added(port: int, node: DeckNode) -> void:
signals.node_port_added.emit(node._belonging_to.id, node._id, port, node)
static func _on_node_ports_updated(node: DeckNode) -> void:
signals.node_ports_updated.emit(node._belonging_to.id, node._id)
static func _on_node_port_value_updated(port_idx: int, new_value: Variant, node: DeckNode) -> void:
signals.node_port_value_updated.emit(node._belonging_to.id, node._id, port_idx, new_value)
static func _on_node_renamed(new_name: String, node: DeckNode) -> void:
signals.node_renamed.emit(node._belonging_to.id, node._id, new_name)
#endregion
class Signals: class Signals:
@ -38,8 +69,16 @@ class Signals:
#region deck #region deck
signal deck_node_added(deck_id: String, node_id: String) signal deck_node_added(deck_id: String, node_id: String)
signal deck_node_removed(deck_id: String, node_id: String)
signal deck_nodes_connected(deck_id: String, from_node_id: String, to_node_id: String, from_output_port: int, to_input_port: int)
signal deck_nodes_disconnected(deck_id: String, from_node_id: String, to_node_id: String, from_output_port: int, to_input_port: int)
signal deck_variables_updated(deck_id: String)
#endregion #endregion
#region node #region node
signal node_position_updated(deck_id: String, node_id: String, new_position: Dictionary) signal node_position_updated(deck_id: String, node_id: String, new_position: Dictionary)
signal node_port_added(deck_id: String, node_id: String, port: int)
signal node_ports_updated(deck_id: String, node_id: String)
signal node_port_value_updated(deck_id: String, node_id: String, port_idx: int, new_value: Variant)
signal node_renamed(deck_id: String, node_id: String, new_name: String)
#endregion #endregion

View file

@ -12,6 +12,10 @@ func _init() -> void:
} }
RPCSignalLayer.signals.deck_node_added.connect(_on_deck_node_added) RPCSignalLayer.signals.deck_node_added.connect(_on_deck_node_added)
RPCSignalLayer.signals.deck_node_removed.connect(_on_deck_node_removed)
RPCSignalLayer.signals.deck_nodes_connected.connect(_on_deck_nodes_connected)
RPCSignalLayer.signals.deck_nodes_disconnected.connect(_on_deck_nodes_disconnected)
func add_node(r: RPCRequest) -> void: func add_node(r: RPCRequest) -> void:
@ -34,3 +38,29 @@ func add_node(r: RPCRequest) -> void:
func _on_deck_node_added(deck_id: String, node_id: String) -> void: func _on_deck_node_added(deck_id: String, node_id: String) -> void:
event.emit(create_event("node_added", {"node_id": node_id}, {"deck_id": deck_id})) event.emit(create_event("node_added", {"node_id": node_id}, {"deck_id": deck_id}))
func _on_deck_node_removed(deck_id: String, node_id: String) -> void:
event.emit(create_event("node_removed", {"node_id": node_id}, {"deck_id": deck_id}))
func _on_deck_nodes_connected(deck_id: String, from_node_id: String, to_node_id: String, from_output_port: int, to_input_port: int) -> void:
var connection := RPCNodeConnection.new()
connection.from_node_id = from_node_id
connection.to_node_id = to_node_id
connection.from_output_port = from_output_port
connection.to_input_port = to_input_port
var ev := create_event("nodes_connected", connection, {"deck_id": deck_id})
event.emit(ev)
func _on_deck_nodes_disconnected(deck_id: String, from_node_id: String, to_node_id: String, from_output_port: int, to_input_port: int) -> void:
var connection := RPCNodeConnection.new()
connection.from_node_id = from_node_id
connection.to_node_id = to_node_id
connection.from_output_port = from_output_port
connection.to_input_port = to_input_port
var ev := create_event("nodes_disconnected", connection, {"deck_id": deck_id})
event.emit(ev)

View file

@ -8,7 +8,7 @@ func _init() -> void:
name = "deck_holder" name = "deck_holder"
operation_types = { operation_types = {
"new_deck": new_deck, # TODO: evaluate later #"new_deck": new_deck, # TODO: evaluate later
"get_deck": get_deck, "get_deck": get_deck,
"send_event": send_event, "send_event": send_event,
"error": error, "error": error,
@ -21,6 +21,7 @@ func _init() -> void:
func error(r: RPCRequest) -> void: func error(r: RPCRequest) -> void:
response.emit(create_error(r, "random error")) response.emit(create_error(r, "random error"))
func new_deck(r: RPCRequest) -> void: func new_deck(r: RPCRequest) -> void:
reconnect( reconnect(
RPCSignalLayer.signals.deck_added, RPCSignalLayer.signals.deck_added,
@ -69,8 +70,8 @@ func send_event(r: RPCRequest) -> void:
func _on_deck_holder_deck_added(deck_id: String) -> void: func _on_deck_holder_deck_added(deck_id: String) -> void:
event.emit(create_event("new_deck", {"deck_id": deck_id})) event.emit(create_event("new_deck", RPCDeckPartial.new(DeckHolder.get_deck(deck_id))))
func _on_deck_holder_deck_closed(deck_id: String) -> void: func _on_deck_holder_deck_closed(deck_id: String) -> void:
pass event.emit(create_event("deck_closed", RPCDeckPartial.new(DeckHolder.get_deck(deck_id))))

View file

@ -8,7 +8,28 @@ func _init() -> void:
name = "node" name = "node"
RPCSignalLayer.signals.node_position_updated.connect(_on_node_position_updated) RPCSignalLayer.signals.node_position_updated.connect(_on_node_position_updated)
RPCSignalLayer.signals.node_renamed.connect(_on_node_renamed)
RPCSignalLayer.signals.node_port_value_updated.connect(_on_node_port_value_updated)
func _on_node_position_updated(deck_id: String, node_id: String, position: Dictionary) -> void: func _on_node_position_updated(deck_id: String, node_id: String, position: Dictionary) -> void:
event.emit(create_event("position_updated", position, {"deck_id": deck_id, "node_id": node_id})) event.emit(create_event("position_updated", position, {"deck_id": deck_id, "node_id": node_id}))
func _on_node_renamed(deck_id: String, node_id: String, new_name: String) -> void:
event.emit(create_event("renamed", {"new_name": new_name}, {"deck_id": deck_id, "node_id": node_id}))
func _on_node_port_value_updated(deck_id: String, node_id: String, port_idx: int, new_value: Variant) -> void:
event.emit(create_event(
"port_value_updated",
{
"port": port_idx,
"new_value": new_value,
},
{
"deck_id": deck_id,
"node_id": node_id,
}
)
)

View file

@ -0,0 +1,20 @@
# (c) 2023-present Eroax
# (c) 2023-present Yagich
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
extends RPCFrame
class_name RPCNodeConnection
var from_node_id: String
var from_output_port: int
var to_node_id: String
var to_input_port: int
func _init() -> void:
frame_name = "node_connection"
_props = [
&"from_node_id",
&"from_output_port",
&"to_node_id",
&"to_input_port",
]

View file

@ -5,8 +5,13 @@ extends RPCFrame
class_name RPCDeckPartial class_name RPCDeckPartial
var id: String var id: String
var is_group: bool
func _init() -> void: func _init(from: Deck = null) -> void:
frame_name = "deck_partial" frame_name = "deck_partial"
_props = [&"id"] _props = [&"id"]
if from:
id = from.id
is_group = from.is_group

View file

@ -8,6 +8,10 @@ var id: String
var deck_id: String var deck_id: String
func _init() -> void: func _init(from: DeckNode = null) -> void:
frame_name = "node_partial" frame_name = "node_partial"
_props = [&"id", &"deck_id"] _props = [&"id", &"deck_id"]
if from:
id = from._id
deck_id = from._belonging_to.id