Skip to content
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
9ac5365
- created graph operations and handled input from parley grap view
Sep 11, 2025
0271472
- selecting multibple connections, deleting connection and nodes work…
Sep 28, 2025
376b719
- naming changes
Sep 28, 2025
50aae38
- delete redo undo cycle mostly done
Oct 12, 2025
aa310bd
- delete operation improvements
Oct 18, 2025
322f9e3
- bug fixes and improvements
Nov 16, 2025
ae8f3df
changed a comment
JosephStar318 Nov 16, 2025
8e2a2fb
- inserted new lines
Nov 16, 2025
8759d0a
Merge branch 'keyboard-shortcuts' of https://github.com/JosephStar318…
Nov 16, 2025
542ec8f
- print rich and removed unnecessary prints
Nov 16, 2025
eb0fa5a
- edge selection color improvements
Dec 6, 2025
0052249
- color selection bug fix
Feb 7, 2026
fb45bc9
- added create node opertion and connection to empty node operation
Feb 7, 2026
6a5fbbc
- added duplicate operation
Feb 7, 2026
d92b29f
- bug fixes and improvements
Feb 8, 2026
81fe847
- group selection fix and removed logs
Feb 8, 2026
348b24b
- added @tool
Feb 22, 2026
53d1116
Update addons/parley/models/dialogue_sequence_ast.gd
JosephStar318 Mar 7, 2026
2eea03b
Update addons/parley/models/dialogue_sequence_ast.gd
JosephStar318 Mar 7, 2026
784ba06
- comment cheange on id setter method on node_ast
Mar 7, 2026
cf989b9
- added feature flag and made shortcuts an optional feature
Mar 7, 2026
5927f3c
Update addons/parley/models/node_ast.gd
JosephStar318 May 23, 2026
54f66b3
Update addons/parley/views/parley_graph_view.gd
JosephStar318 May 23, 2026
377b7c8
-removed some logs and refresh edges will only be active if shortcuts…
May 23, 2026
e568a0d
Merge branch 'keyboard-shortcuts' of https://github.com/JosephStar318…
May 23, 2026
5d7af23
Update addons/parley/main_panel.gd
JosephStar318 May 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions addons/parley/constants.gd
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ const PARLEY_RUNTIME_SINGLETON: String = "ParleyRuntime"
#region Editor
# User settings
const EDITOR_CURRENT_DIALOGUE_SEQUENCE_PATH: String = "parley/editor/current_dialogue_sequence_path"
const EDITOR_IS_KEYBOARD_SHORTCUTS_ACTIVE: String = "parley/editor/keyboard_shortcuts"
#endregion

#region Dialogue
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
@tool
class_name ParleyConnectionToEmptyOperation
extends ParleyGraphOperation

var node_type: ParleyDialogueSequenceAst.Type
var graph_view: ParleyGraphView
var position: Vector2
var node_id: String
var from_node_name: StringName
var from_slot: int

func _init(_graph_view: ParleyGraphView, _node_type: ParleyDialogueSequenceAst.Type, _position: Vector2, _from_node_name: StringName, _from_slot: int) -> void:
graph_view = _graph_view
node_type = _node_type
position = _position
from_node_name = _from_node_name
from_slot = _from_slot


func undo() -> void:
var edges : Array[ParleyGraphEdge] = ParleyGraphUtils.get_edges_for_node(graph_view, node_id)

for edge: ParleyGraphEdge in edges:
edge.disconnect_node()

var ast : ParleyNodeAst = graph_view.ast.find_node_by_id(node_id)
if ast != null:
graph_view.ast.remove_node(node_id)

var node : ParleyGraphNode = graph_view.find_node_by_id(node_id)
if node:
graph_view._on_node_deselected(node)
graph_view.remove_child(node)


func do() -> void:
var ast_node: ParleyNodeAst = graph_view.ast.add_new_node(node_type, position)
if ast_node:
node_id = ast_node.id
await graph_view.generate()

var to_node_name: String = graph_view.get_ast_node_name(ast_node)
# TODO: This is the entry slot for a Dialogue AST Node, it may be better to create a helper function for this
var to_slot: int = 0
_add_edge(to_node_name, to_slot)

func _add_edge(to_node_name: StringName, to_slot: int) -> void:
var from_node_id: String = from_node_name.split('-')[1]
var to_node_id: String = to_node_name.split('-')[1]
var added_edge: ParleyEdgeAst = graph_view.ast.add_new_edge(from_node_id, from_slot, to_node_id, to_slot)
if added_edge:
graph_view.add_edge(added_edge, from_node_name, to_node_name)

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://cmt2ds0h681od
31 changes: 31 additions & 0 deletions addons/parley/graph_operations/parley_create_node_operation.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
@tool
class_name ParleyCreateNodeOperation
extends ParleyGraphOperation

var node_type: ParleyDialogueSequenceAst.Type
var graph_view: ParleyGraphView
var position: Vector2
var node_id: String

func _init(_graph_view: ParleyGraphView, _node_type: ParleyDialogueSequenceAst.Type, _position: Vector2) -> void:
graph_view = _graph_view
node_type = _node_type
position = _position


func undo() -> void:
var ast : ParleyNodeAst = graph_view.ast.find_node_by_id(node_id)
if ast != null:
graph_view.ast.remove_node(node_id)

var node : ParleyGraphNode = graph_view.find_node_by_id(node_id)
if node:
graph_view._on_node_deselected(node)
graph_view.remove_child(node)


func do() -> void:
var ast_node: Variant = graph_view.ast.add_new_node(node_type, position)
if ast_node:
node_id = ast_node.id
graph_view.generate()
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://cd4fjjrnhnld4
71 changes: 71 additions & 0 deletions addons/parley/graph_operations/parley_delete_operation.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
@tool
class_name ParleyDeleteOperation
extends ParleyGraphOperation

var selected_edges: Array[ParleyGraphEdge]
var selected_node_ids: Array[String]
var deleted_node_datas: Array[NodeData]
var graph_view: ParleyGraphView

func _init(_graph_view: ParleyGraphView, _selected_edges: Array[ParleyGraphEdge], _selected_node_ids: Array[String]) -> void:
graph_view = _graph_view
selected_edges = _selected_edges.duplicate()
selected_node_ids = _selected_node_ids.duplicate()


func undo() -> void:
var graph_nodes: Dictionary = {}
var created_node_list: Array[String]

for node_data : NodeData in deleted_node_datas:
var deleted_node : ParleyNodeAst = node_data.node_ast
graph_view._add_node(graph_nodes, deleted_node)
graph_view.ast.add_node_from_ast(deleted_node)
var added_node : ParleyGraphNode = graph_nodes[deleted_node.id]
added_node.position = deleted_node.position
created_node_list.append(added_node.id)

for node_data : NodeData in deleted_node_datas:
for edge : ParleyGraphEdge in node_data.edges:
edge.connect_node()

for edge : ParleyGraphEdge in selected_edges:
edge.connect_node()

await graph_view.generate()

for i: int in range(created_node_list.size()):
var node_id: String = created_node_list[i]
var node : ParleyGraphNode = graph_view.find_node_by_id(node_id)
node.set_selected(true)

for edge : ParleyGraphEdge in selected_edges:
edge.unselect()
for edge : ParleyGraphEdge in selected_edges:
edge.select()

func do() -> void:
deleted_node_datas.clear()
for selected_node_id : String in selected_node_ids:
var ast : ParleyNodeAst = graph_view.ast.find_node_by_id(selected_node_id)
if ast != null:
var edges : Array[ParleyGraphEdge] = ParleyGraphUtils.get_edges_for_node(graph_view, selected_node_id)
deleted_node_datas.append(NodeData.new(selected_node_id, ast, edges))

for selected_node_id : String in selected_node_ids:
var ast : ParleyNodeAst = graph_view.ast.find_node_by_id(selected_node_id)
if ast != null:
var selected_node : ParleyGraphNode = graph_view.find_node_by_id(selected_node_id)
graph_view._on_node_deselected(selected_node)
graph_view.remove_child(selected_node)
graph_view.ast.remove_node(selected_node_id)

graph_view._on_edges_deselected()
for edge : ParleyGraphEdge in selected_edges:
edge.disconnect_node()

graph_view.generate()




Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://p0j3epmvx0me
66 changes: 66 additions & 0 deletions addons/parley/graph_operations/parley_duplicate_operation.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
@tool
class_name ParleyDuplicateOperation
Comment thread
JosephStar318 marked this conversation as resolved.
extends ParleyGraphOperation

var selected_node_ids: Array[String]
var created_node_datas: Array[NodeData]
var graph_view: ParleyGraphView


func _init(_graph_view: ParleyGraphView, _selected_node_ids: Array[String]) -> void:
graph_view = _graph_view
selected_node_ids = _selected_node_ids.duplicate()


func do() -> void:
graph_view._clear_selected_nodes()
var created_node_list: Array[String]
var node_names: Array[String]

for node_id: String in selected_node_ids:
var ast_node : ParleyNodeAst = graph_view.ast.find_node_by_id(node_id)
if ast_node:
var new_ast_node : ParleyNodeAst = graph_view.ast.copy_node_ast(ast_node)
new_ast_node.position = new_ast_node.position + Vector2.RIGHT * 200 + Vector2.DOWN * 200

# TODO: if we want to duplicate the connections create edges and pass them to the edge list later
created_node_datas.append(NodeData.new(new_ast_node.id, new_ast_node, []))
created_node_list.append(new_ast_node.id)
node_names.append(graph_view.get_ast_node_name(new_ast_node))

# var selected_ast : ParleyNodeAst = graph_view.ast.find_node_by_id(node_id)
# var ast_node: ParleyNodeAst = graph_view.ast.add_new_node(selected_ast.type, selected_ast.position + Vector2.DOWN * 200 + Vector2.RIGHT * 200 )
# if ast_node:
# node_id = ast_node.id
# var connections : Array[ParleyGraphEdge] = ParleyGraphUtils.get_connections_for_node(graph_view, node_id)
# created_node_datas.append(NodeData.new(node_id, ast_node, connections))
# created_node_list.append(node_id)
# node_names.append(selected_ast.resource_name)
Comment on lines +31 to +38

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we remove these comments please? :)


await graph_view.generate()

for i: int in range(created_node_list.size()):
var node_id: String = created_node_list[i]
var node_name: String = node_names[i]
var node : ParleyGraphNode = graph_view.find_node_by_id(node_id)
node.set_selected(true)
node.name = node_name


func undo() -> void:
for node_data: NodeData in created_node_datas:
for edge: ParleyGraphEdge in node_data.edges:
edge.disconnect_node()

var selected_node : ParleyGraphNode = graph_view.find_node_by_id(node_data.node_id)
if selected_node:
graph_view._on_node_deselected(selected_node)
graph_view.remove_child(selected_node)

graph_view.ast.remove_node(node_data.node_id)

await graph_view.generate()
for node_id: String in selected_node_ids:
var node : ParleyGraphNode = graph_view.find_node_by_id(node_id)
node.set_selected(true)

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://cgohkiyv0owkr
13 changes: 13 additions & 0 deletions addons/parley/graph_operations/parley_graph_operation.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
@tool
extends Object
class_name ParleyGraphOperation

# Base class for all Graph operations

func undo() -> void:
# override in child class
push_error("undo() not implemented in subclass")

func do() -> void:
Comment thread
JosephStar318 marked this conversation as resolved.
# override in child class
push_error("redo() not implemented in subclass")
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://c7fq04vgdch28
26 changes: 26 additions & 0 deletions addons/parley/graph_operations/parley_graph_utils.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
@tool
class_name ParleyGraphUtils
extends Node

static func get_edges_for_node(graph_view: ParleyGraphView, node_id: String) -> Array:
var result: Array[ParleyGraphEdge] = []
var connections: Array[Dictionary] = graph_view.get_connection_list()

for conn: Dictionary in connections:
var from_name: String = conn.get("from_node")
var to_name: String = conn.get("to_node")
var from_port: int = conn.get("from_port")
var to_port: int = conn.get("to_port")
var to_node: ParleyGraphNode = graph_view.get_node(NodePath(to_name)) as ParleyGraphNode
var from_node: ParleyGraphNode = graph_view.get_node(NodePath(from_name)) as ParleyGraphNode

if to_node.id == node_id or from_node.id == node_id:
var edge_ast: ParleyEdgeAst = graph_view.ast.get_edge_ast(from_node.id, from_port, to_node.id, to_port)
result.append(ParleyGraphEdge.new(graph_view, edge_ast, from_node, from_port, to_node, to_port))

return result

static func get_cursor_pos_at_graph_view(graph_view: ParleyGraphView) -> Vector2:
var viewport_mouse : Vector2 = graph_view.get_viewport().get_mouse_position()
var local_mouse : Vector2 = viewport_mouse - graph_view.get_global_rect().position
return (local_mouse + graph_view.scroll_offset) / graph_view.zoom
1 change: 1 addition & 0 deletions addons/parley/graph_operations/parley_graph_utils.gd.uid
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://bxvx2algatfbk
11 changes: 11 additions & 0 deletions addons/parley/graph_operations/parley_node_data.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
@tool
class_name NodeData
Comment thread
JosephStar318 marked this conversation as resolved.

var node_ast: ParleyNodeAst
var edges: Array[ParleyGraphEdge]
var node_id: String

func _init(_node_id: String, _node_ast :ParleyNodeAst, _edges: Array[ParleyGraphEdge]) -> void:
node_id = _node_id
node_ast = _node_ast
edges = _edges
1 change: 1 addition & 0 deletions addons/parley/graph_operations/parley_node_data.gd.uid
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://bclqgywlkgvmj
64 changes: 64 additions & 0 deletions addons/parley/graph_operations/parley_paste_operation.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
@tool

extends ParleyGraphOperation
class_name ParleyPasteOperation

var node_ids: Array[String]
var graph_view: ParleyGraphView
var created_node_datas: Array[NodeData]

func _init(_graph_view: ParleyGraphView, _node_ids: Array[String]) -> void:
graph_view = _graph_view
node_ids = _node_ids.duplicate()


func do() -> void:
graph_view._clear_selected_nodes()
var created_node_list: Array[String]
var node_names: Array[String]

var node_asts : Array[ParleyNodeAst] = _get_node_asts()
var center_position: Vector2 = Vector2.ZERO

for node_ast: ParleyNodeAst in node_asts:
center_position += node_ast.position
center_position /= node_asts.size()

for node_ast: ParleyNodeAst in node_asts:
if node_ast:
var new_ast_node : ParleyNodeAst = graph_view.ast.copy_node_ast(node_ast)
var diff: Vector2 = ParleyGraphUtils.get_cursor_pos_at_graph_view(graph_view) - center_position
new_ast_node.position = new_ast_node.position + diff
# TODO: if we want to duplicate the connections create edges and pass them to the edge list later
created_node_datas.append(NodeData.new(new_ast_node.id, new_ast_node, []))
created_node_list.append(new_ast_node.id)
node_names.append(graph_view.get_ast_node_name(new_ast_node))

await graph_view.generate()

for i: int in range(created_node_list.size()):
var node_id: String = created_node_list[i]
var node_name: String = node_names[i]
var node : ParleyGraphNode = graph_view.find_node_by_id(node_id)
node.set_selected(true)
node.name = node_name

func undo() -> void:
for node_data: NodeData in created_node_datas:
for edge: ParleyGraphEdge in node_data.edges:
edge.disconnect_node()

var selected_node : ParleyGraphNode = graph_view.find_node_by_id(node_data.node_id)
if selected_node:
graph_view._on_node_deselected(selected_node)
graph_view.remove_child(selected_node)

graph_view.ast.remove_node(node_data.node_id)

await graph_view.generate()

func _get_node_asts() -> Array[ParleyNodeAst]:
var result: Array[ParleyNodeAst]
for node_id: String in node_ids:
result.append(graph_view.ast.find_node_by_id(node_id))
return result
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://cu3oresgof8xq
Loading