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.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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. self.emit_signal("changed_slots", self)
  71. else:
  72. _update_slots_labels()
  73. _emit_text()
  74. #Public Methods
  75. func get_nid() -> int:
  76. return self._nid
  77. func get_slot_amount() -> int:
  78. return self._slot_amount
  79. func get_text() -> String:
  80. return JSON.print(json_structure, "\t")
  81. func set_nid(new_nid):
  82. self._nid = new_nid
  83. var new_name = "NID " + str(new_nid)
  84. self.title = new_name
  85. self.name = new_name
  86. func set_slot_amount(new_amount : int):
  87. self._slot_amount = new_amount
  88. func set_text(new_text : String):
  89. json_structure = JSON.parse(new_text).get_result()
  90. _update_components()
  91. _emit_text()
  92. #Private Methods
  93. func _update_components():
  94. _SpeakerIdSpinBox.set_value(json_structure.speaker.id)
  95. _SpeakerEmotionLineEdit.set_text(json_structure.speaker.emotion);
  96. _SceneIdSpinBox.set_value(json_structure.scene.id)
  97. _MessageTextEdit.set_text(json_structure.dialog.message)
  98. _ChoicesList.set_structure(json_structure.dialog.choices_multiple)
  99. func _emit_text():
  100. self.emit_signal("text_changed", self._nid, get_text())
  101. func _clear_link_labels():
  102. var children = self.get_children()
  103. for child in children:
  104. if child is Label:
  105. child.queue_free()
  106. func _update_slots_labels():
  107. for slot in range(0, self.get_slot_amount()):
  108. var output_link_label = self.get_children()[slot]
  109. if (output_link_label is Label):
  110. output_link_label.text = self._get_choice_name(slot)
  111. func _get_choice_name(index):
  112. var choices: Array = json_structure.dialog.choices_multiple;
  113. if (choices.size() > 0):
  114. return choices[index].title
  115. else:
  116. return "Next"
  117. func _update_slots():
  118. self.clear_all_slots()
  119. self._clear_link_labels()
  120. 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)
  121. var base_link_label = Label.new()
  122. base_link_label.text = self._get_choice_name(0)
  123. base_link_label.align = Label.ALIGN_RIGHT
  124. self.add_child(base_link_label)
  125. self.move_child(base_link_label, 0)
  126. var last_output_link_label = base_link_label
  127. for slot in range(1, self._slot_amount):
  128. 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)
  129. var output_link_label = Label.new()
  130. output_link_label.text = self._get_choice_name(slot)
  131. output_link_label.align = Label.ALIGN_RIGHT
  132. self.add_child_below_node(last_output_link_label, output_link_label)
  133. last_output_link_label = output_link_label