Skip to content

Commit 50aae38

Browse files
author
Joseph Star
committed
- delete redo undo cycle mostly done
1 parent 376b719 commit 50aae38

File tree

4 files changed

+135
-51
lines changed

4 files changed

+135
-51
lines changed

addons/parley/graph_operations/parley_delete_operation.gd

Lines changed: 78 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,43 +2,94 @@
22
class_name ParleyDeleteOperation
33
extends ParleyGraphOperation
44

5-
var selectedConnections: Array[ParleyGraphEdge]
6-
var selectedNodes: Array[ParleyGraphNode]
7-
var deletedNodes: Array[ParleyGraphNode]
5+
var selected_connections: Array[ParleyGraphEdge]
6+
var selected_nodes: Array[ParleyGraphNode]
7+
var deleted_node_datas: Array[NodeData]
88
var graph_view: ParleyGraphView
99

1010
func _init(_graph_view: ParleyGraphView, _selected_connections: Array[ParleyGraphEdge], _selected_nodes: Array[ParleyGraphNode]) -> void:
1111
graph_view = _graph_view
12-
selectedConnections = _selected_connections.duplicate()
13-
selectedNodes = _selected_nodes.duplicate()
12+
selected_connections = _selected_connections.duplicate()
13+
selected_nodes = _selected_nodes.duplicate()
1414

1515
func undo() -> void:
16+
pass
1617
# Re-add deleted nodes
1718

18-
# TODO this will be implemented shortly
19-
# for node : GraphNode in selectedNodes:
20-
# graph_view.add_child(node)
21-
# graph_view.ast.add_ast_node(node.)
22-
23-
for connection : ParleyGraphEdge in selectedConnections:
24-
var result: int = connection.connect_node(graph_view)
25-
if result == FAILED:
26-
print("Couldn't delete connection: ", connection.as_string())
19+
selected_nodes.clear()
20+
var graph_nodes: Dictionary = {}
21+
for node_data : NodeData in deleted_node_datas:
22+
var deleted_node : ParleyNodeAst = node_data.node_ast
23+
graph_view._add_node(graph_nodes, deleted_node)
24+
graph_view.ast.add_node_from_ast(deleted_node)
25+
var added_node : ParleyGraphNode = graph_nodes[deleted_node.id]
26+
added_node.position = deleted_node.position
2727

28+
for node_data : NodeData in deleted_node_datas:
29+
for connection : ParleyGraphEdge in node_data.connections:
30+
connection.to_node = graph_view.get_node(NodePath(connection.to_node_name)) as ParleyGraphNode
31+
connection.from_node = graph_view.get_node(NodePath(connection.from_node_name)) as ParleyGraphNode
32+
if node_data.node_name == connection.to_node_name:
33+
selected_nodes.append(connection.to_node)
34+
pass
35+
elif node_data.node_name == connection.from_node_name:
36+
selected_nodes.append(connection.from_node)
37+
pass
38+
connection.connect_node(graph_view)
39+
40+
for connection : ParleyGraphEdge in selected_connections:
41+
connection.to_node = graph_view.get_node(NodePath(connection.to_node_name)) as ParleyGraphNode
42+
connection.from_node = graph_view.get_node(NodePath(connection.from_node_name)) as ParleyGraphNode
43+
connection.connect_node(graph_view)
44+
45+
graph_view.generate()
2846

2947
func do() -> void:
30-
# Remove deleted nodes
31-
for connection : ParleyGraphEdge in selectedConnections:
48+
for selected_node : ParleyGraphNode in selected_nodes:
49+
if graph_view.has_node(NodePath(selected_node.name)):
50+
var ast : ParleyNodeAst = graph_view.ast.find_node_by_id(selected_node.id)
51+
var connections : Array[ParleyGraphEdge] = get_connections_for_node(graph_view, selected_node)
52+
deleted_node_datas.append(NodeData.new(selected_node.name, ast, connections))
53+
54+
for selected_node : ParleyGraphNode in selected_nodes:
55+
if graph_view.has_node(NodePath(selected_node.name)):
56+
print("remove node")
57+
var ast : ParleyNodeAst = graph_view.ast.find_node_by_id(selected_node.id)
58+
graph_view._on_node_deselected(selected_node)
59+
graph_view.remove_child(selected_node)
60+
graph_view.ast.remove_node(selected_node.id)
61+
62+
for connection : ParleyGraphEdge in selected_connections:
63+
print("disconnect connection")
3264
connection.disconnect_node(graph_view)
65+
66+
graph_view.generate()
67+
68+
func get_connections_for_node(graph_edit: GraphEdit, node: GraphNode) -> Array[ParleyGraphEdge]:
69+
var result: Array[ParleyGraphEdge] = []
70+
var connections: Array[Dictionary] = graph_edit.get_connection_list()
71+
72+
for conn: Dictionary in connections:
73+
var from_name: String = conn.get("from_node")
74+
var to_name: String = conn.get("to_node")
75+
var from_port: int = conn.get("from_port")
76+
var to_port: int = conn.get("to_port")
77+
var to_node: ParleyGraphNode = graph_view.get_node(NodePath(to_name)) as ParleyGraphNode
78+
var from_node: ParleyGraphNode = graph_view.get_node(NodePath(from_name)) as ParleyGraphNode
79+
80+
if from_name == node.name or to_name == node.name:
81+
result.append(ParleyGraphEdge.new(from_node, from_port, to_node, to_port))
82+
83+
return result
84+
85+
86+
class NodeData:
87+
var node_ast: ParleyNodeAst
88+
var connections: Array[ParleyGraphEdge]
89+
var node_name: String
90+
91+
func _init(_node_name: String, _node_ast :ParleyNodeAst, _connections: Array[ParleyGraphEdge]) -> void:
92+
node_name = _node_name
93+
node_ast = _node_ast
94+
connections = _connections
3395

34-
for selectedNode : ParleyGraphNode in selectedNodes:
35-
if graph_view.has_node(NodePath(selectedNode.name)):
36-
graph_view._on_node_deselected(selectedNode)
37-
graph_view.remove_child(selectedNode)
38-
graph_view.ast.remove_node(selectedNode.id)
39-
deletedNodes.append(selectedNode)
40-
41-
func flush() -> void:
42-
for deletedNode : ParleyGraphNode in deletedNodes:
43-
deletedNode.queue_free()
44-
pass

addons/parley/models/dialogue_sequence_ast.gd

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,17 @@ func add_new_node(type: Type, position: Vector2 = Vector2.ZERO) -> ParleyNodeAst
144144
_emit_dialogue_updated()
145145
return ast_node
146146

147+
func add_node_from_ast(node_ast: ParleyNodeAst) -> ParleyNodeAst:
148+
# Probably need to make sure the provided ID doesn't already exist
149+
for node : ParleyNodeAst in nodes:
150+
if node.id == node_ast.id:
151+
print("Id already exists in dialogue sequence")
152+
return
153+
154+
# Also worth storing the insertion index somewhere as well?
155+
nodes.append(node_ast)
156+
_emit_dialogue_updated()
157+
return node_ast
147158

148159
## Update Node AST position
149160
func update_node_position(ast_node_id: String, position: Vector2) -> void:
@@ -241,7 +252,6 @@ func remove_node(node_id: String) -> void:
241252

242253
_emit_dialogue_updated()
243254

244-
245255
## Find a Node AST by its ID.
246256
## Example: ast.find_node_by_id("1")
247257
func find_node_by_id(id: String) -> ParleyNodeAst:

addons/parley/views/parley_graph_edge.gd

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,13 @@
44
extends Object
55
class_name ParleyGraphEdge
66
var from_node: ParleyGraphNode
7+
var from_slot: int
78
var from_port: int
89
var to_node: ParleyGraphNode
10+
var to_slot: int
911
var to_port: int
12+
var to_node_name: String
13+
var from_node_name: String
1014

1115
var previousFromColor: Color
1216
var previousToColor: Color
@@ -17,31 +21,40 @@ func _init(_from_node: ParleyGraphNode, _from_port: int, _to_node: ParleyGraphNo
1721
from_port = _from_port
1822
to_node = _to_node
1923
to_port = _to_port
24+
from_slot = from_node.get_output_port_slot(from_port)
25+
to_slot = to_node.get_input_port_slot(to_port)
26+
from_node_name = from_node.name
27+
to_node_name = to_node.name
2028

21-
func disconnect_node(graph_edit: GraphEdit) -> void:
22-
if not graph_edit:
29+
func disconnect_node(graph_view: ParleyGraphView) -> void:
30+
if not graph_view:
2331
return
24-
graph_edit.disconnect_node(from_node.name, from_port, to_node.name, to_port)
32+
graph_view.disconnect_node(from_node_name, from_port, to_node_name, to_port)
33+
graph_view.ast.remove_edge(from_node_name, from_port, to_node_name, to_port)
2534

26-
func connect_node(graph_edit: GraphEdit) -> int:
27-
if not graph_edit:
35+
func connect_node(graph_view: ParleyGraphView) -> int:
36+
if not graph_view:
2837
return FAILED
29-
return graph_edit.connect_node(from_node.name, from_port, to_node.name, to_port)
38+
return graph_view.connect_node(from_node_name, from_port, to_node_name, to_port)
3039

3140
func select() -> void:
41+
if selected:
42+
return
3243
selected = true
33-
var output_port_count : int = from_node.get_output_port_count()
34-
previousFromColor = from_node.get_slot_color_right(output_port_count + from_port - 1)
35-
previousToColor = to_node.get_slot_color_left(to_port)
36-
from_node.set_slot_color_right(output_port_count + from_port - 1, Color.DEEP_SKY_BLUE) # "output_port_count + from_port - 1" is this a bug i really don't know but only this works
37-
to_node.set_slot_color_left(to_port, Color.DEEP_SKY_BLUE)
44+
45+
previousFromColor = from_node.get_slot_color_right(from_slot)
46+
previousToColor = to_node.get_slot_color_left(to_slot)
47+
from_node.set_slot_color_right(from_slot, Color.DEEP_SKY_BLUE) # "output_port_count + from_port - 1" is this a bug i really don't know but only this works
48+
to_node.set_slot_color_left(to_slot, Color.DEEP_SKY_BLUE)
3849

3950
func unselect() -> void:
51+
if not selected:
52+
return
53+
4054
selected = false
4155

42-
var output_port_count : int = from_node.get_output_port_count()
43-
from_node.set_slot_color_right(output_port_count + from_port - 1, previousFromColor)
44-
to_node.set_slot_color_left(to_port, previousToColor)
56+
from_node.set_slot_color_right(from_slot, previousFromColor)
57+
to_node.set_slot_color_left(to_slot, previousToColor)
4558

4659
func as_string() -> String:
4760
return "%s:%d -> %s:%d" % [from_node, from_port, to_node, to_port]

addons/parley/views/parley_graph_view.gd

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,6 @@ func _on_node_selected(node: Node) -> void:
370370
func _on_node_deselected(node: Node) -> void:
371371
selectedNodes.erase(node)
372372
pass
373-
374373
func _gui_input(event: InputEvent) -> void:
375374
if event is InputEventMouseButton:
376375
_handle_mouse_select(event as InputEventMouseButton)
@@ -420,21 +419,32 @@ func _handle_mouse_select(mouse_event: InputEventMouseButton) -> void:
420419
selectedNodes.clear()
421420

422421
foundAnyConnection = true
423-
var connection: ParleyGraphEdge = ParleyGraphEdge.new(from_node, from_port, to_node, to_port)
424-
connection.select()
425-
selectedConnections.append(connection as ParleyGraphEdge)
426-
onUnselect.append(func() -> void:
427-
connection.unselect()
422+
var connection: ParleyGraphEdge = _find_existing_connection(from_node, from_port, to_node, to_port)
423+
if connection == null:
424+
connection = ParleyGraphEdge.new(from_node, from_port, to_node, to_port)
425+
connection.select()
426+
selectedConnections.append(connection as ParleyGraphEdge)
427+
onUnselect.append(func() -> void:
428+
connection.unselect()
429+
selectedConnections.erase(connection)
430+
)
431+
print("Selected connection:", connection.as_string())
432+
else:
428433
selectedConnections.erase(connection)
429-
)
430-
print("Clicked connection:", connection.as_string())
434+
connection.unselect()
435+
print("Unselected existing connection:", connection.as_string())
431436
break
432437

433-
if not foundAnyConnection:
438+
if not foundAnyConnection && not mouse_event.is_command_or_control_pressed():
434439
while onUnselect.size() > 0:
435440
var callable: Callable = onUnselect.pop_front()
436441
callable.call()
437442

443+
func _find_existing_connection(_from_node: ParleyGraphNode, _from_port: int, _to_node: ParleyGraphNode, _to_port: int) -> ParleyGraphEdge:
444+
for con: ParleyGraphEdge in selectedConnections:
445+
if con.from_node == _from_node && con.from_port == _from_port && con.to_node == _to_node && con.to_port == _to_port:
446+
return con
447+
return null
438448
func _get_slot_position(node: GraphNode, slot_idx: int, is_output: bool) -> Vector2:
439449
var local_pos: Vector2
440450
if is_output:

0 commit comments

Comments
 (0)