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.

line_node.gd 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. tool
  2. extends GraphNode
  3. class_name LineNode
  4. signal changed_offset(nid, vec2)
  5. signal changed_size(this)
  6. signal changed_slots(this)
  7. signal erased(this)
  8. signal pressed_editor(this)
  9. signal pressed_load(this)
  10. signal pressed_save(this)
  11. signal text_changed(nid, new_text)
  12. onready var _SpeakerIdSpinBox: SpinBox = self.get_node("MarginContainer/VBoxContainer/HBoxContainer3/VBoxContainer/HBoxContainer/SpeakerIdSpinBox")
  13. onready var _SpeakerEmotionLineEdit: LineEdit = self.get_node("MarginContainer/VBoxContainer/HBoxContainer3/VBoxContainer/HBoxContainer2/SpeakerEmotionLineEdit")
  14. onready var _SceneIdSpinBox: SpinBox = self.get_node("MarginContainer/VBoxContainer/HBoxContainer4/VBoxContainer/HBoxContainer/SceneIdSpinBox")
  15. onready var _MessageTextEdit : TextEdit= self.get_node("MarginContainer/VBoxContainer/HBoxContainer2/VBoxContainer/MessageTextEdit")
  16. onready var _ChoicesList: ChoicesList = self.get_node("MarginContainer/VBoxContainer/ChoicesList")
  17. var _nid : int = 0
  18. var _slot_amount : int = 1
  19. var json_structure = {
  20. "speaker": {
  21. "id": 0,
  22. "emotion": "happy"
  23. },
  24. "scene": {
  25. "id": 0
  26. },
  27. "dialog": {
  28. "message": "",
  29. "choices_multiple": []
  30. }
  31. }
  32. #Virtual Methods
  33. func _ready():
  34. self._update_slots()
  35. #Callback Methods
  36. func _on_Editor_BTN_pressed():
  37. self.emit_signal("pressed_editor", self)
  38. func _on_Line_close_request():
  39. self.emit_signal("erased", self)
  40. func _on_Line_offset_changed():
  41. self.emit_signal("changed_offset", self._nid, self.offset)
  42. func _on_Line_resize_request(new_minsize):
  43. self.rect_size = new_minsize
  44. self.emit_signal("changed_size", self)
  45. func _on_Load_BTN_pressed():
  46. self.emit_signal("pressed_load", self)
  47. func _on_Save_BTN_pressed():
  48. self.emit_signal("pressed_save", self)
  49. func _on_MessageTextEdit_text_changed():
  50. json_structure.dialog.message = self._MessageTextEdit.text
  51. _emit_text()
  52. func _on_SceneIdSpinBox_value_changed(value):
  53. json_structure.scene.id = value
  54. _emit_text()
  55. func _on_SpeakerEmotionLineEdit_text_changed(new_text):
  56. json_structure.speaker.emotion = new_text
  57. _emit_text()
  58. func _on_SpeakerIdSpinBox_value_changed(value):
  59. json_structure.speaker.id = value
  60. _emit_text()
  61. func _on_ChoicesList_choices_changed(new_json_structure):
  62. json_structure.dialog.choices_multiple = new_json_structure
  63. var slot_number = json_structure.dialog.choices_multiple.size()
  64. # Always have at least one slot
  65. if slot_number == 0:
  66. slot_number = 1
  67. if (self.get_slot_amount() != slot_number):
  68. self.set_slot_amount(slot_number)
  69. self._update_slots()
  70. # TODO fix slots resetting when editing choice data
  71. self.emit_signal("changed_slots", self)
  72. _emit_text()
  73. #Public Methods
  74. func get_nid() -> int:
  75. return self._nid
  76. func get_slot_amount() -> int:
  77. return self._slot_amount
  78. func get_text() -> String:
  79. return JSON.print(json_structure, "\t")
  80. func set_nid(new_nid):
  81. self._nid = new_nid
  82. var new_name = "NID " + str(new_nid)
  83. self.title = new_name
  84. self.name = new_name
  85. func set_slot_amount(new_amount : int):
  86. self._slot_amount = new_amount
  87. func set_text(new_text : String):
  88. print("New text received:")
  89. print(new_text)
  90. json_structure = JSON.parse(new_text).get_result()
  91. print(JSON.print(json_structure, "\t"))
  92. _update_components()
  93. self.emit_signal("text_changed", self._nid, new_text)
  94. #Private Methods
  95. func _update_components():
  96. _SpeakerIdSpinBox.set_value(json_structure.speaker.id)
  97. _SpeakerEmotionLineEdit.set_text(json_structure.speaker.emotion);
  98. _SceneIdSpinBox.set_value(json_structure.scene.id)
  99. _MessageTextEdit.set_text(json_structure.dialog.message)
  100. _ChoicesList.set_structure(json_structure.dialog.choices_multiple)
  101. func _emit_text():
  102. print(get_text())
  103. self.emit_signal("text_changed", self._nid, get_text())
  104. func _clear_link_labels():
  105. var children = self.get_children()
  106. for child in children:
  107. if child is Label:
  108. child.free()
  109. func _update_slots():
  110. self.clear_all_slots()
  111. self._clear_link_labels()
  112. self.set_slot(0, true, 0, Color(1.0, 1.0, 1.0, 1.0), true, 0, Color(1.0, 1.0, 1.0, 1.0), null, null)
  113. var base_link_label = Label.new()
  114. if (json_structure.dialog.choices_multiple.size() == 0):
  115. base_link_label.text = "Next"
  116. else:
  117. base_link_label.text = "Choice #1"
  118. base_link_label.align = Label.ALIGN_RIGHT
  119. self.add_child(base_link_label)
  120. self.move_child(base_link_label, 0)
  121. var last_output_link_label = base_link_label
  122. for slot in range(1, self._slot_amount):
  123. self.set_slot(slot, false, 0, Color(1.0, 1.0, 1.0, 1.0), true, 0, Color(1.0, 1.0, 1.0, 1.0), null, null)
  124. var output_link_label = Label.new()
  125. output_link_label.text = "Choice #" + str(slot + 1)
  126. output_link_label.align = Label.ALIGN_RIGHT
  127. self.add_child_below_node(last_output_link_label, output_link_label)
  128. last_output_link_label = output_link_label