mirror of
https://codeberg.org/StreamGraph/StreamGraph.git
synced 2024-11-13 19:49:55 +01:00
loading decks
This commit is contained in:
parent
97aa95bf6b
commit
3c5dfdd6fd
6 changed files with 88 additions and 110 deletions
|
@ -39,11 +39,17 @@ func add_node(node: GDScript, meta: Dictionary = {}) -> DeckNode:
|
||||||
return node_inst
|
return node_inst
|
||||||
|
|
||||||
|
|
||||||
func add_node_inst(node: DeckNode) -> DeckNode:
|
func add_node_inst(node: DeckNode, assign_id: String = "", assign_to_self: bool = true) -> DeckNode:
|
||||||
|
if assign_to_self:
|
||||||
|
node._belonging_to = self
|
||||||
|
|
||||||
|
if assign_id == "":
|
||||||
var uuid := UUID.v4()
|
var uuid := UUID.v4()
|
||||||
nodes[uuid] = node
|
nodes[uuid] = node
|
||||||
node._belonging_to = self
|
|
||||||
node._id = uuid
|
node._id = uuid
|
||||||
|
else:
|
||||||
|
nodes[assign_id] = node
|
||||||
|
|
||||||
|
|
||||||
# if !meta.is_empty():
|
# if !meta.is_empty():
|
||||||
# for k in meta:
|
# for k in meta:
|
||||||
|
@ -77,7 +83,7 @@ func disconnect_nodes(from_node: DeckNode, to_node: DeckNode, from_port: int, to
|
||||||
|
|
||||||
|
|
||||||
func to_json(with_meta: bool = true) -> String:
|
func to_json(with_meta: bool = true) -> String:
|
||||||
var inner := {"nodes": {}}
|
var inner := {"nodes": {}, "variable_stack": variable_stack}
|
||||||
|
|
||||||
for id in nodes.keys():
|
for id in nodes.keys():
|
||||||
inner["nodes"][id] = nodes[id].to_dict(with_meta)
|
inner["nodes"][id] = nodes[id].to_dict(with_meta)
|
||||||
|
@ -89,3 +95,38 @@ func to_json(with_meta: bool = true) -> String:
|
||||||
for meta in get_meta_list():
|
for meta in get_meta_list():
|
||||||
d["meta"][meta] = get_meta(meta)
|
d["meta"][meta] = get_meta(meta)
|
||||||
return JSON.stringify(d, "\t", false)
|
return JSON.stringify(d, "\t", false)
|
||||||
|
|
||||||
|
|
||||||
|
static func from_json(json: String) -> Deck:
|
||||||
|
var data: Dictionary = JSON.parse_string(json) as Dictionary
|
||||||
|
var deck := Deck.new()
|
||||||
|
|
||||||
|
deck.variable_stack = data.deck.variable_stack
|
||||||
|
|
||||||
|
for key in data.meta:
|
||||||
|
deck.set_meta(key, data.meta[key])
|
||||||
|
|
||||||
|
var nodes_data: Dictionary = data.deck.nodes as Dictionary
|
||||||
|
|
||||||
|
for node_id in nodes_data:
|
||||||
|
var node := deck.add_node_inst(NodeDB.instance_node(nodes_data[node_id].node_type), node_id, false)
|
||||||
|
node._id = node_id
|
||||||
|
node.name = nodes_data[node_id].name
|
||||||
|
node._belonging_to = deck
|
||||||
|
# node.outgoing_connections = nodes_data[node_id].outgoing_connections
|
||||||
|
# node.incoming_connections = nodes_data[node_id].incoming_connections
|
||||||
|
for connection_id in nodes_data[node_id].outgoing_connections:
|
||||||
|
var connection_data = nodes_data[node_id].outgoing_connections[connection_id]
|
||||||
|
node.outgoing_connections[int(connection_id)] = connection_data
|
||||||
|
|
||||||
|
for connection_id in nodes_data[node_id].incoming_connections:
|
||||||
|
var connection_data = nodes_data[node_id].incoming_connections[connection_id]
|
||||||
|
node.incoming_connections[int(connection_id)] = connection_data
|
||||||
|
|
||||||
|
for key in nodes_data[node_id].meta:
|
||||||
|
node.set_meta(key, nodes_data[node_id].meta[key])
|
||||||
|
|
||||||
|
for prop in nodes_data[node_id].props:
|
||||||
|
node.set(prop, nodes_data[node_id].props[prop])
|
||||||
|
|
||||||
|
return deck
|
||||||
|
|
|
@ -174,9 +174,13 @@ func to_dict(with_meta: bool = true) -> Dictionary:
|
||||||
"name": name,
|
"name": name,
|
||||||
"outgoing_connections": outgoing_connections,
|
"outgoing_connections": outgoing_connections,
|
||||||
"incoming_connections": incoming_connections,
|
"incoming_connections": incoming_connections,
|
||||||
"props": props_to_serialize,
|
"props": {},
|
||||||
"node_type": node_type,
|
"node_type": node_type,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for prop in props_to_serialize:
|
||||||
|
d.props[prop] = get(prop)
|
||||||
|
|
||||||
if with_meta:
|
if with_meta:
|
||||||
d["meta"] = {}
|
d["meta"] = {}
|
||||||
for meta in get_meta_list():
|
for meta in get_meta_list():
|
||||||
|
|
|
@ -1,11 +1,15 @@
|
||||||
extends DeckNode
|
extends DeckNode
|
||||||
|
|
||||||
|
var times_activated := 0
|
||||||
|
|
||||||
|
|
||||||
func _init() -> void:
|
func _init() -> void:
|
||||||
name = "Print"
|
name = "Print"
|
||||||
node_type = name.to_snake_case()
|
node_type = name.to_snake_case()
|
||||||
description = "print a value"
|
description = "print a value"
|
||||||
|
|
||||||
|
props_to_serialize = [&"times_activated"]
|
||||||
|
|
||||||
add_input_port(
|
add_input_port(
|
||||||
Deck.Types.STRING,
|
Deck.Types.STRING,
|
||||||
"Text to print",
|
"Text to print",
|
||||||
|
@ -37,6 +41,8 @@ func _receive(to_port: int, data: DeckType, extra_data: Array = []) -> void:
|
||||||
else:
|
else:
|
||||||
data_to_print = data.get_value()
|
data_to_print = data.get_value()
|
||||||
|
|
||||||
|
times_activated += 1
|
||||||
|
|
||||||
# var data_to_print = input_ports[0].value_callback.call()
|
# var data_to_print = input_ports[0].value_callback.call()
|
||||||
print(data_to_print)
|
print(data_to_print)
|
||||||
print("extra data: ", extra_data)
|
print("extra data: ", extra_data)
|
||||||
|
|
|
@ -25,6 +25,9 @@ func _ready() -> void:
|
||||||
var save_btn := Button.new()
|
var save_btn := Button.new()
|
||||||
save_btn.text = "Save"
|
save_btn.text = "Save"
|
||||||
get_zoom_hbox().add_child(save_btn)
|
get_zoom_hbox().add_child(save_btn)
|
||||||
|
var load_btn := Button.new()
|
||||||
|
load_btn.text = "Load"
|
||||||
|
get_zoom_hbox().add_child(load_btn)
|
||||||
|
|
||||||
save_btn.pressed.connect(
|
save_btn.pressed.connect(
|
||||||
func():
|
func():
|
||||||
|
@ -33,6 +36,23 @@ func _ready() -> void:
|
||||||
f.store_string(t)
|
f.store_string(t)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
load_btn.pressed.connect(
|
||||||
|
func():
|
||||||
|
var f := FileAccess.open("user://save_test.json", FileAccess.READ)
|
||||||
|
for i in get_children():
|
||||||
|
i.queue_free()
|
||||||
|
|
||||||
|
deck = Deck.from_json(f.get_as_text())
|
||||||
|
scroll_offset = str_to_vector2(deck.get_meta("offset", ""))
|
||||||
|
|
||||||
|
for node_id in deck.nodes:
|
||||||
|
var node_renderer: DeckNodeRendererGraphNode = NODE_SCENE.instantiate()
|
||||||
|
node_renderer.node = deck.nodes[node_id]
|
||||||
|
add_child(node_renderer)
|
||||||
|
node_renderer.position_offset = str_to_vector2(deck.nodes[node_id].get_meta("position_offset", ""))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
add_button.pressed.connect(
|
add_button.pressed.connect(
|
||||||
func():
|
func():
|
||||||
var node := NodeDB.instance_node("button")
|
var node := NodeDB.instance_node("button")
|
||||||
|
@ -98,3 +118,13 @@ func attempt_disconnect(from_node_name: StringName, from_port: int, to_node_name
|
||||||
|
|
||||||
func _on_scroll_offset_changed(offset: Vector2) -> void:
|
func _on_scroll_offset_changed(offset: Vector2) -> void:
|
||||||
deck.set_meta("offset", offset)
|
deck.set_meta("offset", offset)
|
||||||
|
|
||||||
|
|
||||||
|
func str_to_vector2(s: String) -> Vector2:
|
||||||
|
if s.is_empty():
|
||||||
|
return Vector2()
|
||||||
|
|
||||||
|
var san := s.trim_prefix("(").trim_suffix(")").split(",")
|
||||||
|
var x := float(san[0])
|
||||||
|
var y := float(san[1])
|
||||||
|
return Vector2(x, y)
|
||||||
|
|
49
test.gd
49
test.gd
|
@ -1,49 +0,0 @@
|
||||||
extends Control
|
|
||||||
|
|
||||||
var node_renderer_scene := preload("res://test_node_renderer.tscn")
|
|
||||||
@onready var nodes_container: HBoxContainer = $NodesContainer
|
|
||||||
|
|
||||||
@onready var add_button_button: Button = $AddButtonButton
|
|
||||||
@onready var add_print_button: Button = $AddPrintButton
|
|
||||||
@onready var connect_them_button: Button = $ConnectThemButton
|
|
||||||
@onready var disconnect_them_button: Button = $DisconnectThemButton
|
|
||||||
|
|
||||||
var deck: Deck = Deck.new()
|
|
||||||
var button_node = preload("res://classes/deck/nodes/button.gd")
|
|
||||||
var print_node = preload("res://classes/deck/nodes/print.gd")
|
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
|
||||||
add_button_button.pressed.connect(
|
|
||||||
func():
|
|
||||||
var node := deck.add_node(button_node)
|
|
||||||
var node_renderer = node_renderer_scene.instantiate()
|
|
||||||
node_renderer.node = node
|
|
||||||
nodes_container.add_child(node_renderer)
|
|
||||||
add_button_button.disabled = true
|
|
||||||
)
|
|
||||||
|
|
||||||
add_print_button.pressed.connect(
|
|
||||||
func():
|
|
||||||
var node := deck.add_node(print_node)
|
|
||||||
var node_renderer = node_renderer_scene.instantiate()
|
|
||||||
node_renderer.node = node
|
|
||||||
nodes_container.add_child(node_renderer)
|
|
||||||
add_print_button.disabled = true
|
|
||||||
)
|
|
||||||
|
|
||||||
connect_them_button.pressed.connect(
|
|
||||||
func():
|
|
||||||
var node_a: DeckNode = nodes_container.get_child(0).node
|
|
||||||
var node_b: DeckNode = nodes_container.get_child(1).node
|
|
||||||
|
|
||||||
deck.connect_nodes(node_a, node_b, 0, 1)
|
|
||||||
)
|
|
||||||
|
|
||||||
disconnect_them_button.pressed.connect(
|
|
||||||
func():
|
|
||||||
var node_a: DeckNode = nodes_container.get_child(0).node
|
|
||||||
var node_b: DeckNode = nodes_container.get_child(1).node
|
|
||||||
|
|
||||||
deck.disconnect_nodes(node_a, node_b, 0, 1)
|
|
||||||
)
|
|
54
test.tscn
54
test.tscn
|
@ -1,54 +0,0 @@
|
||||||
[gd_scene load_steps=2 format=3 uid="uid://bhpd6rfiuimw5"]
|
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://test.gd" id="1_in4g7"]
|
|
||||||
|
|
||||||
[node name="Test" type="Control"]
|
|
||||||
layout_mode = 3
|
|
||||||
anchors_preset = 15
|
|
||||||
anchor_right = 1.0
|
|
||||||
anchor_bottom = 1.0
|
|
||||||
grow_horizontal = 2
|
|
||||||
grow_vertical = 2
|
|
||||||
script = ExtResource("1_in4g7")
|
|
||||||
|
|
||||||
[node name="AddButtonButton" type="Button" parent="."]
|
|
||||||
layout_mode = 0
|
|
||||||
offset_left = 26.0
|
|
||||||
offset_top = 576.0
|
|
||||||
offset_right = 119.0
|
|
||||||
offset_bottom = 607.0
|
|
||||||
text = "Add Button"
|
|
||||||
|
|
||||||
[node name="AddPrintButton" type="Button" parent="."]
|
|
||||||
layout_mode = 0
|
|
||||||
offset_left = 152.0
|
|
||||||
offset_top = 576.0
|
|
||||||
offset_right = 248.0
|
|
||||||
offset_bottom = 607.0
|
|
||||||
text = "Add Print"
|
|
||||||
|
|
||||||
[node name="ConnectThemButton" type="Button" parent="."]
|
|
||||||
layout_mode = 0
|
|
||||||
offset_left = 283.0
|
|
||||||
offset_top = 576.0
|
|
||||||
offset_right = 379.0
|
|
||||||
offset_bottom = 607.0
|
|
||||||
text = "Connect them"
|
|
||||||
|
|
||||||
[node name="DisconnectThemButton" type="Button" parent="."]
|
|
||||||
layout_mode = 0
|
|
||||||
offset_left = 421.0
|
|
||||||
offset_top = 576.0
|
|
||||||
offset_right = 538.0
|
|
||||||
offset_bottom = 607.0
|
|
||||||
text = "Disconnect them"
|
|
||||||
|
|
||||||
[node name="NodesContainer" type="HBoxContainer" parent="."]
|
|
||||||
layout_mode = 1
|
|
||||||
anchors_preset = -1
|
|
||||||
anchor_right = 0.999646
|
|
||||||
anchor_bottom = 0.245654
|
|
||||||
offset_right = 0.40799
|
|
||||||
offset_bottom = -0.184006
|
|
||||||
theme_override_constants/separation = 20
|
|
||||||
metadata/_edit_use_anchors_ = true
|
|
Loading…
Reference in a new issue