No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dialog_editor.gd 8.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. tool
  2. extends Control
  3. signal back_BTN_pressed
  4. signal close_BTN_pressed
  5. onready var _Graph = self.get_node("VBoxContainer/GraphEdit")
  6. onready var _Human_Readable_LBL = self.get_node("VBoxContainer/VBoxContainer/Human_Readable_LBL")
  7. var _Editor_TSCN = preload("res://addons/EXP-System-Dialog/Dialog Editor/Editor/Editor.tscn")
  8. var _LineNode = preload("res://addons/EXP-System-Dialog/Dialog Editor/Nodes/Line/Line_Node.tscn")
  9. var _NodeTemplate= preload("res://addons/EXP-System-Dialog/Resource_NodeTemplate/EXP_NodeTemplate.gd")
  10. var _did : int = -1
  11. var _Editor
  12. var _Load_Template : EditorFileDialog
  13. var _Save_Template_As : EditorFileDialog
  14. var _Story_Editor
  15. var _Target_Node
  16. #Virtual Methods
  17. func _ready():
  18. self._setup_dialogs()
  19. self._Editor = _Editor_TSCN.instance()
  20. self.add_child(self._Editor)
  21. #Callback Methods
  22. func _on_Add_Node_BTN_pressed():
  23. var new_nid = self._Story_Editor.create_node(self._did, "line")
  24. var new_line_node = self._LineNode.instance()
  25. new_line_node.offset += self._Graph.scroll_offset
  26. new_line_node.set_nid(new_nid)
  27. new_line_node.connect("erased", self, "_on_Node_erased")
  28. new_line_node.connect("changed_offset", self, "_on_Node_changed_offset")
  29. new_line_node.connect("text_changed", self, "_on_Node_text_changed")
  30. new_line_node.connect("pressed_save", self, "_on_Node_pressed_save")
  31. new_line_node.connect("pressed_load", self, "_on_Node_pressed_load")
  32. new_line_node.connect("pressed_editor", self, "_on_Node_pressed_editor")
  33. new_line_node.connect("changed_slots", self, "_on_Node_changed_slots")
  34. new_line_node.connect("changed_size", self, "_on_Node_changed_size")
  35. var slot_count = self._Story_Editor.get_node_property(self._did, new_nid, "slot_amount")
  36. self._Story_Editor.set_node_property(self._did, new_nid, "rect_size", new_line_node.rect_size)
  37. new_line_node.set_slot_amount(slot_count)
  38. self._Graph.add_child(new_line_node)
  39. func _on_Back_BTN_pressed():
  40. self.emit_signal("back_BTN_pressed")
  41. func _on_Close_BTN_pressed():
  42. self.emit_signal("close_BTN_pressed")
  43. func _on_GraphEdit_connection_request(from, from_slot, to, to_slot):
  44. self._Graph.connect_node(from, from_slot, to, to_slot)
  45. var from_node = self._Graph.get_node(from)
  46. var to_node = self._Graph.get_node(to)
  47. var from_node_nid = from_node.get_nid()
  48. var to_node_nid = to_node.get_nid()
  49. self._Story_Editor.set_link(self._did, from_node_nid, from_slot, to_node_nid)
  50. func _on_GraphEdit_disconnection_request(from, from_slot, to, to_slot):
  51. self._Graph.disconnect_node(from, from_slot, to, to_slot)
  52. var from_node = self._Graph.get_node(from)
  53. var from_node_nid = from_node.get_nid()
  54. self._Story_Editor.erase_link(self._did, from_node_nid, from_slot)
  55. func _on_Load_Template_file_selected(filename):
  56. var file_data = load(filename)
  57. if not file_data.TYPE == "EXP_Dialog_Node_Template_editor":
  58. return
  59. self._Target_Node.set_text(file_data.template)
  60. func _on_Node_changed_offset(nid, new_offset):
  61. self._Story_Editor.set_node_property(self._did, nid, "graph_offset", new_offset)
  62. func _on_Node_changed_size(changed_node):
  63. var changed_node_nid = changed_node.get_nid()
  64. self._Story_Editor.set_node_property(self._did, changed_node_nid, "rect_size", changed_node.rect_size)
  65. func _on_Node_changed_slots(changed_node):
  66. var changed_node_nid = changed_node.get_nid()
  67. self._unlink_nid_from_story(changed_node_nid)
  68. self._disconnect_all_from(changed_node)
  69. self._Story_Editor.set_node_property(self._did, changed_node_nid, "slot_amount",
  70. changed_node.get_slot_amount())
  71. func _on_Node_erased(deleted_node):
  72. var deleted_nid = deleted_node.get_nid()
  73. self._unlink_nid_from_story(deleted_nid)
  74. self._Story_Editor.erase_node(self._did, deleted_nid)
  75. self._disconnect_all_from(deleted_node)
  76. deleted_node.queue_free()
  77. func _on_Node_pressed_editor(node):
  78. self._Editor.set_target_node(node)
  79. self._Editor.visible = true
  80. func _on_Node_pressed_load(node):
  81. self._Target_Node = node
  82. self._Load_Template.popup_centered_ratio(0.7)
  83. func _on_Node_pressed_save(node):
  84. self._Target_Node = node
  85. self._Save_Template_As.popup_centered_ratio(0.7)
  86. func _on_Node_text_changed(nid, new_text):
  87. self._Story_Editor.set_node_property(self._did, nid, "text", new_text)
  88. func _on_Save_Template_As_file_selected(filename):
  89. var save_file = _NodeTemplate.new()
  90. save_file.template = self._Target_Node.get_text()
  91. ResourceSaver.save(filename, save_file)
  92. func _on_Story_Editor_dialog_edit_pressed(story_editor, did : int):
  93. self._Story_Editor = story_editor
  94. self._did = did
  95. self._Human_Readable_LBL.text = self._Story_Editor.get_dialog_property(self._did, "human_readable_description")
  96. self._clear_nodes()
  97. self._populate_graph()
  98. self._link_node_connections()
  99. #Private Methods
  100. func _clear_nodes():
  101. self._Graph.clear_connections()
  102. var children = self._Graph.get_children()
  103. for child in children:
  104. if child is GraphNode:
  105. child.free()
  106. func _disconnect_all_from(node):
  107. var node_name = node.name
  108. var connection_list = self._Graph.get_connection_list()
  109. for connection in connection_list:
  110. if connection["from"] == node.name or connection["to"] == node.name:
  111. self._Graph.disconnect_node(connection["from"], connection["from_port"],
  112. connection["to"], connection["to_port"])
  113. func _link_node_connections():
  114. var node_IDs = self._Story_Editor.get_nids(self._did)
  115. for nID in node_IDs:
  116. var slots = self._Story_Editor.get_link_slots(self._did, nID)
  117. for slot in slots:
  118. var to_node_nid = self._Story_Editor.get_nid_link_from(self._did, nID, slot)
  119. var to = "NID " + str(to_node_nid)
  120. var from = "NID " + str(nID)
  121. self._Graph.connect_node(from, slot, to, 0)
  122. func _populate_graph():
  123. var node_IDs = self._Story_Editor.get_nids(self._did)
  124. for nID in node_IDs:
  125. var new_node : GraphNode
  126. match self._Story_Editor.get_node_property(self._did, nID, "type"):
  127. "line":
  128. new_node = _LineNode.instance()
  129. var slot_count = self._Story_Editor.get_node_property(self._did, nID, "slot_amount")
  130. new_node.set_slot_amount(slot_count)
  131. self._Graph.add_child(new_node)
  132. new_node.connect("erased", self, "_on_Node_erased")
  133. var new_text = self._Story_Editor.get_node_property(self._did, nID, "text")
  134. var new_rect_size = self._Story_Editor.get_node_property(self._did, nID, "rect_size")
  135. new_node.rect_size = new_rect_size
  136. new_node.set_text(new_text)
  137. new_node.connect("text_changed", self, "_on_Node_text_changed")
  138. new_node.connect("pressed_save", self, "_on_Node_pressed_save")
  139. new_node.connect("pressed_load", self, "_on_Node_pressed_load")
  140. new_node.connect("pressed_editor", self, "_on_Node_pressed_editor")
  141. new_node.connect("changed_slots", self, "_on_Node_changed_slots")
  142. new_node.connect("changed_size", self, "_on_Node_changed_size")
  143. new_node.set_nid(nID)
  144. new_node.offset = self._Story_Editor.get_node_property(self._did, nID, "graph_offset")
  145. new_node.connect("changed_offset", self, "_on_Node_changed_offset")
  146. func _setup_dialogs():
  147. self._Load_Template = EditorFileDialog.new()
  148. self._Load_Template.mode = EditorFileDialog.MODE_OPEN_FILE
  149. self._Load_Template.add_filter("*.res ; Template files")
  150. self._Load_Template.resizable = true
  151. self._Load_Template.access = EditorFileDialog.ACCESS_RESOURCES
  152. self._Load_Template.current_dir = "res://"
  153. self._Load_Template.connect("file_selected", self, "_on_Load_Template_file_selected")
  154. self.add_child(self._Load_Template)
  155. self._Save_Template_As = EditorFileDialog.new()
  156. self._Save_Template_As.mode = EditorFileDialog.MODE_SAVE_FILE
  157. self._Save_Template_As.add_filter("*.res ; Template files")
  158. self._Save_Template_As.resizable = true
  159. self._Save_Template_As.access = EditorFileDialog.ACCESS_RESOURCES
  160. self._Save_Template_As.current_dir = "res://"
  161. self._Save_Template_As.connect("file_selected", self, "_on_Save_Template_As_file_selected")
  162. self.add_child(self._Save_Template_As)
  163. func _unlink_nid_from_story(removed_nid):
  164. self._Story_Editor.erase_all_links(self._did, removed_nid)
  165. var nIDs = self._Story_Editor.get_nids(self._did)
  166. for nID in nIDs:
  167. var node_slots = self._Story_Editor.get_link_slots(self._did, nID)
  168. for slot in node_slots:
  169. var to_node_nid = self._Story_Editor.get_nid_link_from(self._did, nID, slot)
  170. if to_node_nid == removed_nid:
  171. self._Story_Editor.erase_link(self._did, nID, slot)