From c1bcd2469432a7b5f870b53260cab6feea5360d1 Mon Sep 17 00:00:00 2001 From: Bram Dingelstad Date: Mon, 6 Dec 2021 22:24:06 +0100 Subject: [PATCH] Added some more security to the runtime --- addons/Wol/core/compiler/Parser.gd | 6 +++- addons/Wol/editor/Editor.gd | 10 ++++-- addons/Wol/editor/WolEditor.gd | 49 ++++++++++++++++++++++++++++++ addons/Wol/editor/WolEditor.tscn | 4 +-- addons/Wol/editor/WolGraphNode.gd | 2 +- dialogue.wol | 24 +++++++-------- 6 files changed, 77 insertions(+), 18 deletions(-) diff --git a/addons/Wol/core/compiler/Parser.gd b/addons/Wol/core/compiler/Parser.gd index 4beacbd..1ea9cd6 100644 --- a/addons/Wol/core/compiler/Parser.gd +++ b/addons/Wol/core/compiler/Parser.gd @@ -25,7 +25,7 @@ func parse_node(): return WolNode.new('Start', null, self) func next_symbol_is(valid_types): - compiler.assert(tokens.size() != 0, 'Ran out of tokens!') + compiler.assert(tokens.size() != 0, 'Ran out of tokens looking for next symbol!') return tokens.front() and tokens.front().type in valid_types # NOTE: 0 look ahead for `<<` and `else` @@ -37,8 +37,12 @@ func next_symbols_are(valid_types): return true func expect_symbol(token_types = []): + compiler.assert(tokens.size() != 0, 'Ran out of tokens expecting next symbol!') var token = tokens.pop_front() as Lexer.Token + if tokens.size() == 0: + return token + if token_types.size() == 0: if token.type == Constants.TokenType.EndOfInput: compiler.assert(false, 'Unexpected end of input') diff --git a/addons/Wol/editor/Editor.gd b/addons/Wol/editor/Editor.gd index 3b1a108..3cc120b 100644 --- a/addons/Wol/editor/Editor.gd +++ b/addons/Wol/editor/Editor.gd @@ -21,9 +21,11 @@ func open_node(graph_node, node): $Content.add_child(text_edit) toggle_text_edit(text_edit) - show() + $HBoxContainer/TextEdit.disconnect('text_changed', self, '_on_title_changed') + $HBoxContainer/TextEdit.text = node.title + $HBoxContainer/TextEdit.connect('text_changed', self, '_on_title_changed') - # window_title = node.title + show() func toggle_text_edit(text_edit): text_edit.anchor_left = 0 @@ -48,6 +50,10 @@ func toggle_text_edit(text_edit): ]: text_edit.set(property, not text_edit.get(property)) +func _on_title_changed(): + current_graph_node.node.title = $HBoxContainer/TextEdit.text + current_graph_node.compile() + func _on_visibility_changed(): if not visible: var text_edit = $Content/TextEdit diff --git a/addons/Wol/editor/WolEditor.gd b/addons/Wol/editor/WolEditor.gd index 0479984..7128090 100644 --- a/addons/Wol/editor/WolEditor.gd +++ b/addons/Wol/editor/WolEditor.gd @@ -6,16 +6,46 @@ onready var GraphNodeTemplate = $GraphNodeTemplate var path var refreshed = false +var selected_node + +onready var original_delete_node_dialog = $DeleteNodeDialog.dialog_text func _ready(): for menu_button in [$Menu/File]: menu_button.get_popup().connect('index_pressed', self, '_on_menu_pressed', [menu_button.get_popup()]) + $GraphEdit.connect('gui_input', self, '_on_graph_edit_input') + $GraphEdit.connect('node_selected', self, '_on_node_selected', [true]) + $GraphEdit.connect('node_unselected', self, '_on_node_selected', [false]) + + $DeleteNodeDialog.connect('confirmed', self, 'delete_node') + # TODO: Conditionally load in theme based on Editor or standalone path = 'res://dialogue.wol' build_nodes() +func create_node(position = Vector2.ZERO): + print('creating node!') + var graph_node = GraphNodeTemplate.duplicate() + $GraphEdit.add_child(graph_node) + + var node = { + 'title': 'NewNode', + 'body': 'Wol: Hello world', + 'position': position + } + + graph_node.connect('recompiled', self, '_on_graph_node_recompiled', [graph_node]) + graph_node.connect('gui_input', self, '_on_graph_node_input', [graph_node, node]) + + graph_node.node = node + graph_node.show() + +func delete_node(node = selected_node): + $GraphEdit.remove_child(node) + node.queue_free() + func build_nodes(): for node in Compiler.new(path).get_nodes(): var graph_node = GraphNodeTemplate.duplicate() @@ -128,3 +158,22 @@ func _on_graph_node_input(event, graph_node, node): and event.doubleclick and event.button_index == BUTTON_LEFT: $HBoxContainer/Editor.open_node(graph_node, node) accept_event() + +func _on_node_selected(node, selected): + if not selected: + selected_node = null + else: + selected_node = node + +func _on_graph_edit_input(event): + if event is InputEventMouseButton \ + and event.doubleclick and event.button_index == BUTTON_LEFT: + create_node(event.global_position + $GraphEdit.scroll_offset) + +func _input(event): + if event is InputEventKey \ + and not event.pressed and event.scancode == KEY_DELETE \ + and selected_node: + $DeleteNodeDialog.dialog_text = original_delete_node_dialog % selected_node.name + $DeleteNodeDialog.popup() + diff --git a/addons/Wol/editor/WolEditor.tscn b/addons/Wol/editor/WolEditor.tscn index e9eac17..88db627 100644 --- a/addons/Wol/editor/WolEditor.tscn +++ b/addons/Wol/editor/WolEditor.tscn @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8967c8b3e310a5ab4a5c78cf3d4f3b3a94fbcd4e02ed5c736c413e4106cf9249 -size 604382 +oid sha256:c726947550552cda030c91eb876dbbb8d2840d9faeba9b90a6f428a43db140f4 +size 605185 diff --git a/addons/Wol/editor/WolGraphNode.gd b/addons/Wol/editor/WolGraphNode.gd index c34992a..d70dceb 100644 --- a/addons/Wol/editor/WolGraphNode.gd +++ b/addons/Wol/editor/WolGraphNode.gd @@ -80,7 +80,7 @@ func set_node(_node): compile() func compile(): - var text = '---\n%s\n===' % text_edit.text + var text = 'title: %s\n---\n%s\n===' % [node.title, text_edit.text] compiler = Compiler.new(null, text, true) compiler.connect('error', self, '_on_error') program = compiler.compile() diff --git a/dialogue.wol b/dialogue.wol index 869e4b6..d6006c6 100644 --- a/dialogue.wol +++ b/dialogue.wol @@ -28,18 +28,6 @@ Guy: WHY ARE YOU BUYING CLOTHES AT THE SOUP STORE?! You: FUCK YOU! [[Go home|Start]] === -title: Talk -tags: -colorID: -position: 800, 400 ---- -Narrator: So how are you really? -You: I'm good! -Narrator: Do you want to continue talking? --> Yes - [[Start]] --> No -=== title: Start tags: colorID: @@ -67,4 +55,16 @@ Narrator: You wanna go somewhere? [[Start]] -> Lets stay here and talk [[Talk]] +=== +title: Talk +tags: +colorID: +position: 800, 400 +--- +Narrator: So how are you really? +You: I'm good! +Narrator: Do you want to continue talking? +-> Yes + [[Start]] +-> No === \ No newline at end of file