Skip to content

Commit aa310bd

Browse files
author
Joseph Star
committed
- delete operation improvements
- undo redo history grouped by dialoge sequence ast
1 parent 50aae38 commit aa310bd

File tree

5 files changed

+64
-51
lines changed

5 files changed

+64
-51
lines changed

addons/parley/graph_operations/parley_delete_operation.gd

Lines changed: 30 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,17 @@ class_name ParleyDeleteOperation
33
extends ParleyGraphOperation
44

55
var selected_connections: Array[ParleyGraphEdge]
6-
var selected_nodes: Array[ParleyGraphNode]
6+
var selected_node_ids: Array[String]
77
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
1212
selected_connections = _selected_connections.duplicate()
13-
selected_nodes = _selected_nodes.duplicate()
14-
13+
for node: ParleyGraphNode in _selected_nodes:
14+
selected_node_ids.append(node.id)
15+
1516
func undo() -> void:
16-
pass
17-
# Re-add deleted nodes
18-
19-
selected_nodes.clear()
2017
var graph_nodes: Dictionary = {}
2118
for node_data : NodeData in deleted_node_datas:
2219
var deleted_node : ParleyNodeAst = node_data.node_ast
@@ -27,47 +24,43 @@ func undo() -> void:
2724

2825
for node_data : NodeData in deleted_node_datas:
2926
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
27+
connection.to_node = graph_view.get_node(NodePath(connection.to_node_name))
28+
connection.from_node = graph_view.get_node(NodePath(connection.from_node_name))
3829
connection.connect_node(graph_view)
3930

4031
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
32+
connection.to_node = graph_view.get_node(NodePath(connection.to_node_name))
33+
connection.from_node = graph_view.get_node(NodePath(connection.from_node_name))
4334
connection.connect_node(graph_view)
4435

4536
graph_view.generate()
4637

4738
func do() -> void:
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))
39+
deleted_node_datas.clear()
40+
for selected_node_id : String in selected_node_ids:
41+
var ast : ParleyNodeAst = graph_view.ast.find_node_by_id(selected_node_id)
42+
if ast != null:
43+
var connections : Array[ParleyGraphEdge] = get_connections_for_node(graph_view, selected_node_id)
44+
deleted_node_datas.append(NodeData.new(selected_node_id, ast, connections))
5345

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)
46+
for selected_node_id : String in selected_node_ids:
47+
var ast : ParleyNodeAst = graph_view.ast.find_node_by_id(selected_node_id)
48+
if ast != null:
49+
print(selected_node_id)
50+
var selected_node : ParleyGraphNode = graph_view.find_node_by_id(selected_node_id)
5851
graph_view._on_node_deselected(selected_node)
5952
graph_view.remove_child(selected_node)
60-
graph_view.ast.remove_node(selected_node.id)
53+
graph_view.ast.remove_node(selected_node_id)
6154

55+
graph_view._on_connections_deselected()
6256
for connection : ParleyGraphEdge in selected_connections:
63-
print("disconnect connection")
6457
connection.disconnect_node(graph_view)
65-
58+
6659
graph_view.generate()
6760

68-
func get_connections_for_node(graph_edit: GraphEdit, node: GraphNode) -> Array[ParleyGraphEdge]:
61+
func get_connections_for_node(graph_view: ParleyGraphView, node_id: String) -> Array[ParleyGraphEdge]:
6962
var result: Array[ParleyGraphEdge] = []
70-
var connections: Array[Dictionary] = graph_edit.get_connection_list()
63+
var connections: Array[Dictionary] = graph_view.get_connection_list()
7164

7265
for conn: Dictionary in connections:
7366
var from_name: String = conn.get("from_node")
@@ -77,19 +70,20 @@ func get_connections_for_node(graph_edit: GraphEdit, node: GraphNode) -> Array[P
7770
var to_node: ParleyGraphNode = graph_view.get_node(NodePath(to_name)) as ParleyGraphNode
7871
var from_node: ParleyGraphNode = graph_view.get_node(NodePath(from_name)) as ParleyGraphNode
7972

80-
if from_name == node.name or to_name == node.name:
81-
result.append(ParleyGraphEdge.new(from_node, from_port, to_node, to_port))
73+
if to_node.id == node_id or from_node.id == node_id:
74+
var edge_ast: ParleyEdgeAst = graph_view.ast.get_edge_ast(from_node.id, from_port, to_node.id, to_port)
75+
result.append(ParleyGraphEdge.new(edge_ast, from_node, from_port, to_node, to_port))
8276

8377
return result
8478

8579

8680
class NodeData:
8781
var node_ast: ParleyNodeAst
8882
var connections: Array[ParleyGraphEdge]
89-
var node_name: String
83+
var node_id: String
9084

91-
func _init(_node_name: String, _node_ast :ParleyNodeAst, _connections: Array[ParleyGraphEdge]) -> void:
92-
node_name = _node_name
85+
func _init(_node_id: String, _node_ast :ParleyNodeAst, _connections: Array[ParleyGraphEdge]) -> void:
86+
node_id = _node_id
9387
node_ast = _node_ast
9488
connections = _connections
9589

addons/parley/main_panel.gd

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ var selected_node_ast: ParleyNodeAst: set = _set_selected_node_ast
5555
signal dialogue_ast_selected(dialogue_ast: ParleyDialogueSequenceAst)
5656
signal node_selected(node_ast: ParleyNodeAst)
5757

58-
var undoHistory: Array[ParleyGraphOperation] = []
59-
var redoHistory: Array[ParleyGraphOperation] = []
58+
var undoHistory: Dictionary = {}
59+
var redoHistory: Dictionary = {}
6060

6161
#region SETUP
6262
func _ready() -> void:
@@ -681,20 +681,25 @@ func _delete_selected() -> void:
681681
add_undo_operation(deleteConnection)
682682

683683
func add_undo_operation(operation: ParleyGraphOperation) -> void:
684-
redoHistory.clear()
685-
undoHistory.push_back(operation)
684+
if not undoHistory.has(dialogue_ast):
685+
undoHistory[dialogue_ast] = [] as Array[ParleyGraphOperation]
686+
if not redoHistory.has(dialogue_ast):
687+
redoHistory[dialogue_ast] = [] as Array[ParleyGraphOperation]
688+
689+
redoHistory[dialogue_ast].clear()
690+
undoHistory[dialogue_ast].push_back(operation)
686691

687692
func _undo() -> void:
688-
if undoHistory.size() > 0:
693+
if undoHistory[dialogue_ast].size() > 0:
689694
print("Undo")
690-
var operation: ParleyGraphOperation = undoHistory.pop_back()
695+
var operation: ParleyGraphOperation = undoHistory[dialogue_ast].pop_back()
691696
operation.undo()
692-
redoHistory.push_back(operation)
697+
redoHistory[dialogue_ast].push_back(operation)
693698

694699
func _redo() -> void:
695-
if redoHistory.size() > 0:
700+
if redoHistory[dialogue_ast].size() > 0:
696701
print("Redo")
697-
var operation: ParleyGraphOperation = redoHistory.pop_back()
702+
var operation: ParleyGraphOperation = redoHistory[dialogue_ast].pop_back()
698703
operation.do()
699704
add_undo_operation(operation)
700705

addons/parley/models/dialogue_sequence_ast.gd

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,11 @@ func _emit_dialogue_updated() -> void:
706706
if is_ready:
707707
dialogue_updated.emit(self)
708708

709+
func get_edge_ast(from_node: String, from_slot: int, to_node: String, to_slot: int) -> ParleyEdgeAst:
710+
for edge: ParleyEdgeAst in edges:
711+
if edge.from_node == from_node && edge.from_slot == from_slot && edge.to_node == to_node && edge.to_slot == to_slot:
712+
return edge
713+
return null
709714

710715
func _to_string() -> String:
711716
return "ParleyDialogueSequenceAst<nodes=%d edges=%d>" % [nodes.size(), edges.size()]

addons/parley/views/parley_graph_edge.gd

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@ var to_slot: int
1111
var to_port: int
1212
var to_node_name: String
1313
var from_node_name: String
14+
var edge_ast: ParleyEdgeAst
1415

1516
var previousFromColor: Color
1617
var previousToColor: Color
1718
var selected: bool
1819

19-
func _init(_from_node: ParleyGraphNode, _from_port: int, _to_node: ParleyGraphNode, _to_port: int) -> void:
20+
func _init(_edge_ast: ParleyEdgeAst, _from_node: ParleyGraphNode, _from_port: int, _to_node: ParleyGraphNode, _to_port: int) -> void:
2021
from_node = _from_node
2122
from_port = _from_port
2223
to_node = _to_node
@@ -25,16 +26,18 @@ func _init(_from_node: ParleyGraphNode, _from_port: int, _to_node: ParleyGraphNo
2526
to_slot = to_node.get_input_port_slot(to_port)
2627
from_node_name = from_node.name
2728
to_node_name = to_node.name
29+
edge_ast = _edge_ast
2830

2931
func disconnect_node(graph_view: ParleyGraphView) -> void:
3032
if not graph_view:
3133
return
34+
graph_view.ast.remove_edge(from_node.id, from_port, to_node.id, to_port)
3235
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)
3436

3537
func connect_node(graph_view: ParleyGraphView) -> int:
3638
if not graph_view:
3739
return FAILED
40+
graph_view.ast.edges.append(edge_ast)
3841
return graph_view.connect_node(from_node_name, from_port, to_node_name, to_port)
3942

4043
func select() -> void:
@@ -57,4 +60,4 @@ func unselect() -> void:
5760
to_node.set_slot_color_left(to_slot, previousToColor)
5861

5962
func as_string() -> String:
60-
return "%s:%d -> %s:%d" % [from_node, from_port, to_node, to_port]
63+
return "%s:%d -> %s:%d" % [from_node_name, from_port, to_node_name, to_port]

addons/parley/views/parley_graph_view.gd

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,11 @@ func _on_node_selected(node: Node) -> void:
370370
func _on_node_deselected(node: Node) -> void:
371371
selectedNodes.erase(node)
372372
pass
373+
func _on_connections_deselected() -> void:
374+
while onUnselect.size() > 0:
375+
var callable: Callable = onUnselect.pop_front()
376+
callable.call()
377+
373378
func _gui_input(event: InputEvent) -> void:
374379
if event is InputEventMouseButton:
375380
_handle_mouse_select(event as InputEventMouseButton)
@@ -420,19 +425,20 @@ func _handle_mouse_select(mouse_event: InputEventMouseButton) -> void:
420425

421426
foundAnyConnection = true
422427
var connection: ParleyGraphEdge = _find_existing_connection(from_node, from_port, to_node, to_port)
428+
var edge_ast: ParleyEdgeAst = ast.get_edge_ast(from_node.id, from_port, to_node.id, to_port)
423429
if connection == null:
424-
connection = ParleyGraphEdge.new(from_node, from_port, to_node, to_port)
430+
connection = ParleyGraphEdge.new(edge_ast, from_node, from_port, to_node, to_port)
425431
connection.select()
426432
selectedConnections.append(connection as ParleyGraphEdge)
427433
onUnselect.append(func() -> void:
428434
connection.unselect()
429435
selectedConnections.erase(connection)
430436
)
431-
print("Selected connection:", connection.as_string())
437+
print("Selected connection: ", connection.as_string())
432438
else:
433439
selectedConnections.erase(connection)
434440
connection.unselect()
435-
print("Unselected existing connection:", connection.as_string())
441+
print("Unselected existing connection: ", connection.as_string())
436442
break
437443

438444
if not foundAnyConnection && not mouse_event.is_command_or_control_pressed():

0 commit comments

Comments
 (0)