-
Notifications
You must be signed in to change notification settings - Fork 7
- Keyboard Shortcuts #30
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
jonnydgreen
merged 26 commits into
bisterix-studio:main
from
JosephStar318:keyboard-shortcuts
May 28, 2026
Merged
Changes from all 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
0271472
- selecting multibple connections, deleting connection and nodes work…
376b719
- naming changes
50aae38
- delete redo undo cycle mostly done
aa310bd
- delete operation improvements
322f9e3
- bug fixes and improvements
ae8f3df
changed a comment
JosephStar318 8e2a2fb
- inserted new lines
8759d0a
Merge branch 'keyboard-shortcuts' of https://github.com/JosephStar318…
542ec8f
- print rich and removed unnecessary prints
eb0fa5a
- edge selection color improvements
0052249
- color selection bug fix
fb45bc9
- added create node opertion and connection to empty node operation
6a5fbbc
- added duplicate operation
d92b29f
- bug fixes and improvements
81fe847
- group selection fix and removed logs
348b24b
- added @tool
53d1116
Update addons/parley/models/dialogue_sequence_ast.gd
JosephStar318 2eea03b
Update addons/parley/models/dialogue_sequence_ast.gd
JosephStar318 784ba06
- comment cheange on id setter method on node_ast
cf989b9
- added feature flag and made shortcuts an optional feature
5927f3c
Update addons/parley/models/node_ast.gd
JosephStar318 54f66b3
Update addons/parley/views/parley_graph_view.gd
JosephStar318 377b7c8
-removed some logs and refresh edges will only be active if shortcuts…
e568a0d
Merge branch 'keyboard-shortcuts' of https://github.com/JosephStar318…
5d7af23
Update addons/parley/main_panel.gd
JosephStar318 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
53 changes: 53 additions & 0 deletions
53
addons/parley/graph_operations/parley_connection_to_empty_operation.gd
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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) | ||
|
|
1 change: 1 addition & 0 deletions
1
addons/parley/graph_operations/parley_connection_to_empty_operation.gd.uid
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| uid://cmt2ds0h681od |
31 changes: 31 additions & 0 deletions
31
addons/parley/graph_operations/parley_create_node_operation.gd
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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() |
1 change: 1 addition & 0 deletions
1
addons/parley/graph_operations/parley_create_node_operation.gd.uid
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| uid://cd4fjjrnhnld4 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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() | ||
|
|
||
|
|
||
|
|
||
|
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| uid://p0j3epmvx0me |
66 changes: 66 additions & 0 deletions
66
addons/parley/graph_operations/parley_duplicate_operation.gd
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,66 @@ | ||
| @tool | ||
| class_name ParleyDuplicateOperation | ||
| 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
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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) | ||
|
|
||
1 change: 1 addition & 0 deletions
1
addons/parley/graph_operations/parley_duplicate_operation.gd.uid
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| uid://cgohkiyv0owkr |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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: | ||
|
JosephStar318 marked this conversation as resolved.
|
||
| # override in child class | ||
| push_error("redo() not implemented in subclass") | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| uid://c7fq04vgdch28 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| uid://bxvx2algatfbk |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| @tool | ||
| class_name NodeData | ||
|
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 | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| uid://bclqgywlkgvmj |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| uid://cu3oresgof8xq |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.