mirror of
https://codeberg.org/StreamGraph/StreamGraph.git
synced 2024-11-13 19:49:55 +01:00
Adds Expression Node (#9)
Adds both the Codeblock Descriptor along with the needed update to Port.set_value to allow Callbacks. + Adds the Expression node which utilizes the Codeblock descriptor. Co-authored-by: Eroax <eroaxe.business@gmail.com> Co-authored-by: Lera Elvoé <yagich@poto.cafe> Reviewed-on: https://codeberg.org/Eroax/Re-DotDeck/pulls/9
This commit is contained in:
parent
c4e35043df
commit
0716c2f4da
4 changed files with 108 additions and 115 deletions
36
classes/deck/nodes/expression_node.gd
Normal file
36
classes/deck/nodes/expression_node.gd
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
extends DeckNode
|
||||||
|
|
||||||
|
var expr = Expression.new()
|
||||||
|
|
||||||
|
func _init():
|
||||||
|
name = "Expression"
|
||||||
|
node_type = name.to_snake_case()
|
||||||
|
description = "A Node holding a block of executable GDScript code."
|
||||||
|
category = "general"
|
||||||
|
|
||||||
|
props_to_serialize = []
|
||||||
|
|
||||||
|
add_output_port(DeckType.Types.ANY, "Expression Text", "codeblock")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func _value_request(from_port : int) -> Variant:
|
||||||
|
|
||||||
|
var text = get_output_ports()[0].value_callback.call()
|
||||||
|
|
||||||
|
var err = expr.parse(text)
|
||||||
|
if err != OK:
|
||||||
|
|
||||||
|
printerr(err)
|
||||||
|
return null
|
||||||
|
|
||||||
|
|
||||||
|
var res = expr.execute()
|
||||||
|
if expr.has_execute_failed():
|
||||||
|
|
||||||
|
printerr("Expression Execution Failed: ", text)
|
||||||
|
return null
|
||||||
|
|
||||||
|
|
||||||
|
return res
|
||||||
|
|
|
@ -48,4 +48,7 @@ func _init(
|
||||||
|
|
||||||
|
|
||||||
func set_value(v: Variant) -> void:
|
func set_value(v: Variant) -> void:
|
||||||
|
if v is Callable:
|
||||||
|
value = v.call()
|
||||||
|
return
|
||||||
value = v
|
value = v
|
||||||
|
|
|
@ -16,44 +16,7 @@ func _ready() -> void:
|
||||||
#node.port_removed.connect(_on_node_port_removed)
|
#node.port_removed.connect(_on_node_port_removed)
|
||||||
node.ports_updated.connect(_on_node_ports_updated)
|
node.ports_updated.connect(_on_node_ports_updated)
|
||||||
for port in node.get_all_ports():
|
for port in node.get_all_ports():
|
||||||
var descriptor_split := port.descriptor.split(":")
|
update_port(port)
|
||||||
match descriptor_split[0]:
|
|
||||||
"button":
|
|
||||||
var button := Button.new()
|
|
||||||
add_child(button)
|
|
||||||
button.text = port.label
|
|
||||||
if port.port_type == DeckNode.PortType.OUTPUT:
|
|
||||||
button.pressed.connect(
|
|
||||||
func():
|
|
||||||
node.send(port.index_of_type, true)
|
|
||||||
)
|
|
||||||
elif port.port_type == DeckNode.PortType.INPUT:
|
|
||||||
button.pressed.connect(
|
|
||||||
func():
|
|
||||||
node._receive(port.index_of_type, true)
|
|
||||||
)
|
|
||||||
"field":
|
|
||||||
var line_edit := LineEdit.new()
|
|
||||||
add_child(line_edit)
|
|
||||||
if port.value:
|
|
||||||
line_edit.text = str(port.value)
|
|
||||||
line_edit.placeholder_text = port.label
|
|
||||||
port.value_callback = line_edit.get_text
|
|
||||||
line_edit.text_changed.connect(port.set_value)
|
|
||||||
_:
|
|
||||||
var label := Label.new()
|
|
||||||
add_child(label)
|
|
||||||
label.text = port.label
|
|
||||||
|
|
||||||
set_slot(
|
|
||||||
port.index,
|
|
||||||
port.port_type == DeckNode.PortType.INPUT,
|
|
||||||
port.type,
|
|
||||||
Color.WHITE,
|
|
||||||
port.port_type == DeckNode.PortType.OUTPUT,
|
|
||||||
port.type,
|
|
||||||
Color.WHITE,
|
|
||||||
)
|
|
||||||
|
|
||||||
## Connected to [signal GraphElement.position_offset_updated] and updates the
|
## Connected to [signal GraphElement.position_offset_updated] and updates the
|
||||||
## [member node]s properties
|
## [member node]s properties
|
||||||
|
@ -72,45 +35,8 @@ func _on_node_position_updated(new_position: Dictionary) -> void:
|
||||||
## using [method GraphNode.set_slot]
|
## using [method GraphNode.set_slot]
|
||||||
func _on_node_port_added(port_idx: int) -> void:
|
func _on_node_port_added(port_idx: int) -> void:
|
||||||
var port := node.get_all_ports()[port_idx]
|
var port := node.get_all_ports()[port_idx]
|
||||||
|
update_port(port)
|
||||||
|
|
||||||
var descriptor_split := port.descriptor.split(":")
|
|
||||||
match descriptor_split[0]:
|
|
||||||
"button":
|
|
||||||
var button := Button.new()
|
|
||||||
add_child(button)
|
|
||||||
button.text = port.label
|
|
||||||
if port.port_type == DeckNode.PortType.OUTPUT:
|
|
||||||
button.pressed.connect(
|
|
||||||
func():
|
|
||||||
node.send(port.index_of_type, true)
|
|
||||||
)
|
|
||||||
elif port.port_type == DeckNode.PortType.INPUT:
|
|
||||||
button.pressed.connect(
|
|
||||||
func():
|
|
||||||
node._receive(port.index_of_type, true)
|
|
||||||
)
|
|
||||||
"field":
|
|
||||||
var line_edit := LineEdit.new()
|
|
||||||
add_child(line_edit)
|
|
||||||
if port.value:
|
|
||||||
line_edit.text = str(port.value)
|
|
||||||
line_edit.placeholder_text = port.label
|
|
||||||
port.value_callback = line_edit.get_text
|
|
||||||
line_edit.text_changed.connect(port.set_value)
|
|
||||||
_:
|
|
||||||
var label := Label.new()
|
|
||||||
add_child(label)
|
|
||||||
label.text = port.label
|
|
||||||
|
|
||||||
set_slot(
|
|
||||||
port.index,
|
|
||||||
port.port_type == DeckNode.PortType.INPUT,
|
|
||||||
port.type,
|
|
||||||
Color.WHITE,
|
|
||||||
port.port_type == DeckNode.PortType.OUTPUT,
|
|
||||||
port.type,
|
|
||||||
Color.WHITE,
|
|
||||||
)
|
|
||||||
|
|
||||||
## Connected to [member node]s [signal port_removed], queue_frees the [Node]
|
## Connected to [member node]s [signal port_removed], queue_frees the [Node]
|
||||||
## used for the descriptor, as well as using [method GraphNode.set_slot] to remove the slot.
|
## used for the descriptor, as well as using [method GraphNode.set_slot] to remove the slot.
|
||||||
|
@ -135,41 +61,67 @@ func _on_node_ports_updated() -> void:
|
||||||
c.queue_free()
|
c.queue_free()
|
||||||
|
|
||||||
for port in node.get_all_ports():
|
for port in node.get_all_ports():
|
||||||
var descriptor_split := port.descriptor.split(":")
|
update_port(port)
|
||||||
match descriptor_split[0]:
|
|
||||||
"button":
|
|
||||||
var button := Button.new()
|
|
||||||
add_child(button)
|
|
||||||
button.text = port.label
|
|
||||||
if port.port_type == DeckNode.PortType.OUTPUT:
|
|
||||||
button.pressed.connect(
|
|
||||||
func():
|
|
||||||
node.send(port.index_of_type, true)
|
|
||||||
)
|
|
||||||
elif port.port_type == DeckNode.PortType.INPUT:
|
|
||||||
button.pressed.connect(
|
|
||||||
func():
|
|
||||||
node._receive(port.index_of_type, true)
|
|
||||||
)
|
|
||||||
"field":
|
|
||||||
var line_edit := LineEdit.new()
|
|
||||||
add_child(line_edit)
|
|
||||||
if port.value:
|
|
||||||
line_edit.text = str(port.value)
|
|
||||||
line_edit.placeholder_text = port.label
|
|
||||||
port.value_callback = line_edit.get_text
|
|
||||||
line_edit.text_changed.connect(port.set_value)
|
|
||||||
_:
|
|
||||||
var label := Label.new()
|
|
||||||
add_child(label)
|
|
||||||
label.text = port.label
|
|
||||||
|
|
||||||
set_slot(
|
|
||||||
port.index,
|
func update_port(port: Port) -> void:
|
||||||
port.port_type == DeckNode.PortType.INPUT,
|
var descriptor_split := port.descriptor.split(":")
|
||||||
port.type,
|
match descriptor_split[0]:
|
||||||
Color.WHITE,
|
"button":
|
||||||
port.port_type == DeckNode.PortType.OUTPUT,
|
var button := Button.new()
|
||||||
port.type,
|
add_child(button)
|
||||||
Color.WHITE,
|
button.text = port.label
|
||||||
)
|
if port.port_type == DeckNode.PortType.OUTPUT:
|
||||||
|
button.pressed.connect(
|
||||||
|
func():
|
||||||
|
node.send(port.index_of_type, true)
|
||||||
|
)
|
||||||
|
#elif port.port_type == DeckNode.PortType.INPUT:
|
||||||
|
else:
|
||||||
|
button.pressed.connect(
|
||||||
|
func():
|
||||||
|
node._receive(port.index_of_type, true)
|
||||||
|
)
|
||||||
|
"field":
|
||||||
|
var line_edit := LineEdit.new()
|
||||||
|
add_child(line_edit)
|
||||||
|
if port.value:
|
||||||
|
line_edit.text = str(port.value)
|
||||||
|
line_edit.placeholder_text = port.label
|
||||||
|
port.value_callback = line_edit.get_text
|
||||||
|
line_edit.text_changed.connect(port.set_value)
|
||||||
|
"singlechoice":
|
||||||
|
var box := OptionButton.new()
|
||||||
|
for item in descriptor_split.slice(1):
|
||||||
|
box.add_item(item)
|
||||||
|
add_child(box)
|
||||||
|
port.value_callback = func(): return box.get_item_text(box.get_selected_id())
|
||||||
|
if port.type == DeckType.Types.STRING:
|
||||||
|
box.item_selected.connect(
|
||||||
|
func(id: int):
|
||||||
|
port.set_value.call(box.get_item_text(box.get_selected_id()))
|
||||||
|
)
|
||||||
|
"codeblock":
|
||||||
|
var code_edit = CodeEdit.new()
|
||||||
|
add_child(code_edit)
|
||||||
|
if port.value:
|
||||||
|
code_edit.text = str(port.value)
|
||||||
|
code_edit.placeholder_text = port.label
|
||||||
|
port.value_callback = code_edit.get_text
|
||||||
|
code_edit.text_changed.connect(port.set_value.bind(code_edit.get_text))
|
||||||
|
code_edit.custom_minimum_size = Vector2(200, 100)
|
||||||
|
code_edit.size_flags_vertical = SIZE_EXPAND_FILL
|
||||||
|
_:
|
||||||
|
var label := Label.new()
|
||||||
|
add_child(label)
|
||||||
|
label.text = port.label
|
||||||
|
|
||||||
|
set_slot(
|
||||||
|
port.index,
|
||||||
|
port.port_type == DeckNode.PortType.INPUT,
|
||||||
|
port.type,
|
||||||
|
Color.WHITE,
|
||||||
|
port.port_type == DeckNode.PortType.OUTPUT,
|
||||||
|
port.type,
|
||||||
|
Color.WHITE,
|
||||||
|
)
|
||||||
|
|
|
@ -3,8 +3,10 @@
|
||||||
[ext_resource type="Script" path="res://graph_node_renderer/deck_node_renderer_graph_node.gd" id="1_pos0w"]
|
[ext_resource type="Script" path="res://graph_node_renderer/deck_node_renderer_graph_node.gd" id="1_pos0w"]
|
||||||
|
|
||||||
[node name="DeckNodeRendererGraphNode" type="GraphNode"]
|
[node name="DeckNodeRendererGraphNode" type="GraphNode"]
|
||||||
offset_right = 280.0
|
custom_minimum_size = Vector2(200, 0)
|
||||||
offset_bottom = 217.0
|
offset_right = 200.0
|
||||||
|
offset_bottom = 55.0
|
||||||
|
resizable = true
|
||||||
title = "Deck Node"
|
title = "Deck Node"
|
||||||
script = ExtResource("1_pos0w")
|
script = ExtResource("1_pos0w")
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue