tool extends Control signal back_BTN_pressed signal close_BTN_pressed onready var _Graph = self.get_node("VBoxContainer/GraphEdit") onready var _Human_Readable_LBL = self.get_node("VBoxContainer/VBoxContainer/Human_Readable_LBL") var _Editor_TSCN = preload("res://addons/EXP-System-Dialog/Dialog Editor/Editor/Editor.tscn") var _LineNode = preload("res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Line_Node.tscn") var _NodeTemplate= preload("res://addons/EXP-System-Dialog/Resource_NodeTemplate/EXP_NodeTemplate.gd") var _did : int = -1 var _Editor var _Load_Template : EditorFileDialog var _Save_Template_As : EditorFileDialog var _Story_Editor var _Target_Node #Virtual Methods func _ready(): self._setup_dialogs() self._Editor = _Editor_TSCN.instance() self.add_child(self._Editor) #Callback Methods func _on_Add_Node_BTN_pressed(): var new_nid = self._Story_Editor.create_node(self._did, "line") var new_line_node = self._LineNode.instance() new_line_node.offset += self._Graph.scroll_offset new_line_node.set_nid(new_nid) new_line_node.connect("erased", self, "_on_Node_erased") new_line_node.connect("changed_offset", self, "_on_Node_changed_offset") new_line_node.connect("text_changed", self, "_on_Node_text_changed") new_line_node.connect("pressed_save", self, "_on_Node_pressed_save") new_line_node.connect("pressed_load", self, "_on_Node_pressed_load") new_line_node.connect("pressed_editor", self, "_on_Node_pressed_editor") new_line_node.connect("changed_slots", self, "_on_Node_changed_slots") new_line_node.connect("changed_size", self, "_on_Node_changed_size") var slot_count = self._Story_Editor.get_node_property(self._did, new_nid, "slot_amount") self._Story_Editor.set_node_property(self._did, new_nid, "rect_size", new_line_node.rect_size) new_line_node.set_slot_amount(slot_count) self._Graph.add_child(new_line_node) func _on_Back_BTN_pressed(): self.emit_signal("back_BTN_pressed") func _on_Close_BTN_pressed(): self.emit_signal("close_BTN_pressed") func _on_GraphEdit_connection_request(from, from_slot, to, to_slot): self._Graph.connect_node(from, from_slot, to, to_slot) var from_node = self._Graph.get_node(from) var to_node = self._Graph.get_node(to) var from_node_nid = from_node.get_nid() var to_node_nid = to_node.get_nid() self._Story_Editor.set_link(self._did, from_node_nid, from_slot, to_node_nid) func _on_GraphEdit_disconnection_request(from, from_slot, to, to_slot): self._Graph.disconnect_node(from, from_slot, to, to_slot) var from_node = self._Graph.get_node(from) var from_node_nid = from_node.get_nid() self._Story_Editor.erase_link(self._did, from_node_nid, from_slot) func _on_Load_Template_file_selected(filename): var file_data = load(filename) if not file_data.TYPE == "EXP_Dialog_Node_Template_editor": return self._Target_Node.set_text(file_data.template) func _on_Node_changed_offset(nid, new_offset): self._Story_Editor.set_node_property(self._did, nid, "graph_offset", new_offset) func _on_Node_changed_size(changed_node): var changed_node_nid = changed_node.get_nid() self._Story_Editor.set_node_property(self._did, changed_node_nid, "rect_size", changed_node.rect_size) func _on_Node_changed_slots(changed_node): var changed_node_nid = changed_node.get_nid() self._unlink_nid_from_story(changed_node_nid) self._disconnect_all_from(changed_node) self._Story_Editor.set_node_property(self._did, changed_node_nid, "slot_amount", changed_node.get_slot_amount()) func _on_Node_erased(deleted_node): var deleted_nid = deleted_node.get_nid() self._unlink_nid_from_story(deleted_nid) self._Story_Editor.erase_node(self._did, deleted_nid) self._disconnect_all_from(deleted_node) deleted_node.queue_free() func _on_Node_pressed_editor(node): self._Editor.set_target_node(node) self._Editor.visible = true func _on_Node_pressed_load(node): self._Target_Node = node self._Load_Template.popup_centered_ratio(0.7) func _on_Node_pressed_save(node): self._Target_Node = node self._Save_Template_As.popup_centered_ratio(0.7) func _on_Node_text_changed(nid, new_text): self._Story_Editor.set_node_property(self._did, nid, "text", new_text) func _on_Save_Template_As_file_selected(filename): var save_file = _NodeTemplate.new() save_file.template = self._Target_Node.get_text() ResourceSaver.save(filename, save_file) func _on_Story_Editor_dialog_edit_pressed(story_editor, did : int): self._Story_Editor = story_editor self._did = did self._Human_Readable_LBL.text = self._Story_Editor.get_dialog_property(self._did, "human_readable_description") self._clear_nodes() self._populate_graph() self._link_node_connections() #Private Methods func _clear_nodes(): self._Graph.clear_connections() var children = self._Graph.get_children() for child in children: if child is GraphNode: child.free() func _disconnect_all_from(node): var node_name = node.name var connection_list = self._Graph.get_connection_list() for connection in connection_list: if connection["from"] == node.name or connection["to"] == node.name: self._Graph.disconnect_node(connection["from"], connection["from_port"], connection["to"], connection["to_port"]) func _link_node_connections(): var node_IDs = self._Story_Editor.get_nids(self._did) for nID in node_IDs: var slots = self._Story_Editor.get_link_slots(self._did, nID) for slot in slots: var to_node_nid = self._Story_Editor.get_nid_link_from(self._did, nID, slot) var to = "NID " + str(to_node_nid) var from = "NID " + str(nID) self._Graph.connect_node(from, slot, to, 0) func _populate_graph(): var node_IDs = self._Story_Editor.get_nids(self._did) for nID in node_IDs: var new_node : GraphNode match self._Story_Editor.get_node_property(self._did, nID, "type"): "line": new_node = _LineNode.instance() var slot_count = self._Story_Editor.get_node_property(self._did, nID, "slot_amount") new_node.set_slot_amount(slot_count) self._Graph.add_child(new_node) new_node.connect("erased", self, "_on_Node_erased") var new_text = self._Story_Editor.get_node_property(self._did, nID, "text") var new_rect_size = self._Story_Editor.get_node_property(self._did, nID, "rect_size") new_node.rect_size = new_rect_size new_node.set_text(new_text) new_node.connect("text_changed", self, "_on_Node_text_changed") new_node.connect("pressed_save", self, "_on_Node_pressed_save") new_node.connect("pressed_load", self, "_on_Node_pressed_load") new_node.connect("pressed_editor", self, "_on_Node_pressed_editor") new_node.connect("changed_slots", self, "_on_Node_changed_slots") new_node.connect("changed_size", self, "_on_Node_changed_size") new_node.set_nid(nID) new_node.offset = self._Story_Editor.get_node_property(self._did, nID, "graph_offset") new_node.connect("changed_offset", self, "_on_Node_changed_offset") func _setup_dialogs(): self._Load_Template = EditorFileDialog.new() self._Load_Template.mode = EditorFileDialog.MODE_OPEN_FILE self._Load_Template.add_filter("*.res ; Template files") self._Load_Template.resizable = true self._Load_Template.access = EditorFileDialog.ACCESS_RESOURCES self._Load_Template.current_dir = "res://" self._Load_Template.connect("file_selected", self, "_on_Load_Template_file_selected") self.add_child(self._Load_Template) self._Save_Template_As = EditorFileDialog.new() self._Save_Template_As.mode = EditorFileDialog.MODE_SAVE_FILE self._Save_Template_As.add_filter("*.res ; Template files") self._Save_Template_As.resizable = true self._Save_Template_As.access = EditorFileDialog.ACCESS_RESOURCES self._Save_Template_As.current_dir = "res://" self._Save_Template_As.connect("file_selected", self, "_on_Save_Template_As_file_selected") self.add_child(self._Save_Template_As) func _unlink_nid_from_story(removed_nid): self._Story_Editor.erase_all_links(self._did, removed_nid) var nIDs = self._Story_Editor.get_nids(self._did) for nID in nIDs: var node_slots = self._Story_Editor.get_link_slots(self._did, nID) for slot in node_slots: var to_node_nid = self._Story_Editor.get_nid_link_from(self._did, nID, slot) if to_node_nid == removed_nid: self._Story_Editor.erase_link(self._did, nID, slot)