2023-11-22 05:26:11 +01:00
|
|
|
class_name DeckHolder
|
2023-11-25 11:40:53 +01:00
|
|
|
## @experimental
|
|
|
|
## A static class holding references to all decks opened in the current session.
|
2023-11-22 05:26:11 +01:00
|
|
|
|
2023-11-25 11:40:53 +01:00
|
|
|
## List of decks opened this session.
|
2023-12-06 11:16:38 +01:00
|
|
|
#static var decks: Array[Deck]
|
|
|
|
static var decks: Dictionary # Dictionary[String -> id, (Deck|Dictionary[String -> instance_id, Deck])]
|
2023-11-22 05:26:11 +01:00
|
|
|
|
|
|
|
|
2023-11-25 11:40:53 +01:00
|
|
|
## Returns a new empty deck and assigns a new random ID to it.
|
2023-11-22 05:26:11 +01:00
|
|
|
static func add_empty_deck() -> Deck:
|
|
|
|
var deck := Deck.new()
|
|
|
|
var uuid := UUID.v4()
|
2023-12-06 11:16:38 +01:00
|
|
|
decks[uuid] = deck
|
2023-11-22 05:26:11 +01:00
|
|
|
deck.id = uuid
|
|
|
|
return deck
|
|
|
|
|
|
|
|
|
2023-11-25 11:40:53 +01:00
|
|
|
## Opens a deck from the [param path].
|
2023-11-22 05:26:11 +01:00
|
|
|
static func open_deck_from_file(path: String) -> Deck:
|
|
|
|
var f := FileAccess.open(path, FileAccess.READ)
|
|
|
|
if f.get_error() != OK:
|
|
|
|
return null
|
|
|
|
|
2023-12-06 11:16:38 +01:00
|
|
|
var deck := open_deck_from_dict(JSON.parse_string(f.get_as_text()), path)
|
|
|
|
return deck
|
|
|
|
|
2023-11-22 05:26:11 +01:00
|
|
|
|
2023-12-06 11:16:38 +01:00
|
|
|
static func open_deck_from_dict(data: Dictionary, path := "") -> Deck:
|
|
|
|
var deck := Deck.from_dict(data, path)
|
|
|
|
decks[deck.id] = deck
|
2023-11-22 05:26:11 +01:00
|
|
|
return deck
|
|
|
|
|
|
|
|
|
2023-12-06 11:16:38 +01:00
|
|
|
static func add_group_from_dict(data: Dictionary, deck_id: String, instance_id: String) -> Deck:
|
|
|
|
var group := Deck.from_dict(data)
|
|
|
|
group.instance_id = instance_id
|
|
|
|
group.is_group = true
|
|
|
|
group.group_input_node = data.deck.group_input_node
|
|
|
|
group.group_output_node = data.deck.group_output_node
|
|
|
|
var instances: Dictionary = decks.get(deck_id, {})
|
|
|
|
instances[instance_id] = group
|
|
|
|
decks[deck_id] = instances
|
2023-12-08 09:22:02 +01:00
|
|
|
connect_group_signals(group)
|
2023-12-06 11:16:38 +01:00
|
|
|
return group
|
|
|
|
|
|
|
|
|
|
|
|
static func make_new_group_instance(group_id: String) -> Deck:
|
|
|
|
var group := get_deck(group_id)
|
|
|
|
var data := group.to_dict()
|
|
|
|
return add_group_from_dict(data, group_id, UUID.v4())
|
|
|
|
|
|
|
|
|
|
|
|
static func add_empty_group() -> Deck:
|
|
|
|
var group := Deck.new()
|
|
|
|
group.is_group = true
|
|
|
|
group.id = UUID.v4()
|
|
|
|
group.instance_id = UUID.v4()
|
|
|
|
decks[group.id] = {group.instance_id: group}
|
2023-12-08 09:22:02 +01:00
|
|
|
connect_group_signals(group)
|
|
|
|
return group
|
|
|
|
|
|
|
|
|
|
|
|
static func connect_group_signals(group: Deck) -> void:
|
2023-12-08 06:41:10 +01:00
|
|
|
group.node_added_to_group.connect(DeckHolder._on_node_added_to_group)
|
|
|
|
group.node_removed_from_group.connect(DeckHolder._on_node_removed_from_group)
|
|
|
|
group.nodes_connected_in_group.connect(DeckHolder._on_nodes_connected_in_group)
|
|
|
|
group.nodes_disconnected_in_group.connect(DeckHolder._on_nodes_disconnected_in_group)
|
2023-12-08 07:33:37 +01:00
|
|
|
group.node_port_value_updated.connect(DeckHolder._on_node_port_value_updated)
|
2023-12-08 09:22:02 +01:00
|
|
|
group.node_renamed.connect(DeckHolder._on_node_renamed)
|
|
|
|
group.node_moved.connect(DeckHolder._on_node_moved)
|
2023-12-06 11:16:38 +01:00
|
|
|
|
|
|
|
|
|
|
|
static func get_deck(id: String) -> Deck:
|
|
|
|
if !decks.has(id):
|
|
|
|
return null
|
|
|
|
|
|
|
|
if !(decks[id] is Dictionary):
|
|
|
|
return decks[id]
|
|
|
|
else:
|
|
|
|
return (decks[id] as Dictionary).values()[0]
|
|
|
|
|
|
|
|
|
|
|
|
static func get_group_instance(group_id: String, instance_id: String) -> Deck:
|
|
|
|
if !decks.has(group_id):
|
|
|
|
return null
|
|
|
|
|
|
|
|
if decks[group_id] is Dictionary:
|
|
|
|
return (decks[group_id] as Dictionary).get(instance_id)
|
|
|
|
else:
|
|
|
|
return null
|
|
|
|
|
|
|
|
|
|
|
|
static func close_group_instance(group_id: String, instance_id: String) -> void:
|
|
|
|
var group_instances: Dictionary = decks.get(group_id, {}) as Dictionary
|
|
|
|
group_instances.erase(instance_id)
|
|
|
|
if group_instances.is_empty():
|
|
|
|
decks.erase(group_id)
|
|
|
|
|
|
|
|
|
2023-11-25 11:40:53 +01:00
|
|
|
## Unloads a deck.
|
2023-12-06 11:16:38 +01:00
|
|
|
static func close_deck(deck_id: String) -> void:
|
|
|
|
if decks.get(deck_id) is Deck:
|
|
|
|
decks.erase(deck_id)
|
2023-12-01 10:30:35 +01:00
|
|
|
|
|
|
|
|
|
|
|
static func send_event(event_name: StringName, event_data: Dictionary = {}) -> void:
|
2023-12-06 11:16:38 +01:00
|
|
|
for deck_id: String in decks:
|
|
|
|
if decks[deck_id] is Deck:
|
|
|
|
(decks[deck_id] as Deck).send_event(event_name, event_data)
|
|
|
|
else:
|
|
|
|
for deck_instance_id: String in decks[deck_id]:
|
|
|
|
(decks[deck_id][deck_instance_id] as Deck).send_event(event_name, event_data)
|
2023-12-08 06:41:10 +01:00
|
|
|
|
|
|
|
|
|
|
|
#region group signal callbacks
|
|
|
|
static func _on_node_added_to_group(node: DeckNode, assign_id: String, assign_to_self: bool, deck: Deck) -> void:
|
|
|
|
var group_id := deck.id
|
|
|
|
for instance_id: String in decks[group_id]:
|
|
|
|
if instance_id == deck.instance_id:
|
|
|
|
continue
|
|
|
|
|
|
|
|
var instance: Deck = get_group_instance(group_id, instance_id)
|
|
|
|
instance.emit_group_signals = false
|
|
|
|
var node_duplicate := DeckNode.from_dict(node.to_dict())
|
|
|
|
instance.add_node_inst(node_duplicate, assign_id, assign_to_self)
|
|
|
|
instance.emit_group_signals = true
|
|
|
|
|
|
|
|
|
|
|
|
static func _on_node_removed_from_group(node_id: String, remove_connections: bool, deck: Deck) -> void:
|
|
|
|
var group_id := deck.id
|
|
|
|
for instance_id: String in decks[group_id]:
|
|
|
|
if instance_id == deck.instance_id:
|
|
|
|
continue
|
|
|
|
|
|
|
|
var instance: Deck = get_group_instance(group_id, instance_id)
|
|
|
|
instance.emit_group_signals = false
|
|
|
|
instance.remove_node(node_id, remove_connections)
|
|
|
|
instance.emit_group_signals = true
|
|
|
|
|
|
|
|
|
|
|
|
static func _on_nodes_connected_in_group(from_node_id: String, to_node_id: String, from_output_port: int, to_input_port: int, deck: Deck) -> void:
|
|
|
|
var group_id := deck.id
|
|
|
|
for instance_id: String in decks[group_id]:
|
|
|
|
if instance_id == deck.instance_id:
|
|
|
|
continue
|
|
|
|
|
|
|
|
var instance: Deck = get_group_instance(group_id, instance_id)
|
|
|
|
instance.emit_group_signals = false
|
|
|
|
instance.connect_nodes(from_node_id, to_node_id, from_output_port, to_input_port)
|
|
|
|
instance.emit_group_signals = true
|
|
|
|
|
|
|
|
|
|
|
|
static func _on_nodes_disconnected_in_group(from_node_id: String, to_node_id: String, from_output_port: int, to_input_port: int, deck: Deck) -> void:
|
|
|
|
var group_id := deck.id
|
|
|
|
for instance_id: String in decks[group_id]:
|
|
|
|
if instance_id == deck.instance_id:
|
|
|
|
continue
|
|
|
|
|
|
|
|
var instance: Deck = get_group_instance(group_id, instance_id)
|
|
|
|
instance.emit_group_signals = false
|
|
|
|
instance.disconnect_nodes(from_node_id, to_node_id, from_output_port, to_input_port)
|
|
|
|
instance.emit_group_signals = true
|
|
|
|
|
2023-12-08 07:33:37 +01:00
|
|
|
|
|
|
|
static func _on_node_port_value_updated(node_id: String, port_idx: int, new_value: Variant, deck: Deck) -> void:
|
|
|
|
var group_id := deck.id
|
|
|
|
for instance_id: String in decks[group_id]:
|
|
|
|
if instance_id == deck.instance_id:
|
|
|
|
continue
|
|
|
|
|
|
|
|
var instance: Deck = get_group_instance(group_id, instance_id)
|
|
|
|
instance.emit_group_signals = false
|
|
|
|
instance.get_node(node_id).get_all_ports()[port_idx].set_value_no_signal(new_value)
|
|
|
|
instance.emit_group_signals = true
|
|
|
|
|
2023-12-08 09:22:02 +01:00
|
|
|
|
|
|
|
static func _on_node_renamed(node_id: String, new_name: String, deck: Deck) -> void:
|
|
|
|
var group_id := deck.id
|
|
|
|
for instance_id: String in decks[group_id]:
|
|
|
|
if instance_id == deck.instance_id:
|
|
|
|
continue
|
|
|
|
|
|
|
|
var instance: Deck = get_group_instance(group_id, instance_id)
|
|
|
|
instance.emit_group_signals = false
|
|
|
|
instance.get_node(node_id).name = new_name
|
|
|
|
instance.emit_group_signals = true
|
|
|
|
|
|
|
|
|
|
|
|
static func _on_node_moved(node_id: String, new_position: Dictionary, deck: Deck) -> void:
|
|
|
|
var group_id := deck.id
|
|
|
|
for instance_id: String in decks[group_id]:
|
|
|
|
if instance_id == deck.instance_id:
|
|
|
|
continue
|
|
|
|
|
|
|
|
var instance: Deck = get_group_instance(group_id, instance_id)
|
|
|
|
instance.emit_group_signals = false
|
|
|
|
instance.get_node(node_id).position = new_position.duplicate()
|
|
|
|
instance.emit_group_signals = true
|
|
|
|
|
2023-12-08 06:41:10 +01:00
|
|
|
#endregion
|