config_window.gd 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. extends PanelContainer
  2. @onready var state_treeview: Tree = $HSplitContainer/VSplitContainer/PanelContainer/MarginContainer/VBoxContainer/AvatarStateTreeview
  3. @onready var state_add_button: Button = $HSplitContainer/VSplitContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/Add
  4. @onready var state_del_button: Button = $HSplitContainer/VSplitContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/Del
  5. @onready var total_state_treeview: Tree = $HSplitContainer/VSplitContainer/PanelContainer2/MarginContainer/VBoxContainer/TotalStateTreeview
  6. @onready var button_0: Button = $HSplitContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer/VBoxContainer/HBoxContainer/Button0
  7. @onready var button_1: Button = $HSplitContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer/VBoxContainer/HBoxContainer/Button1
  8. @onready var button_2: Button = $HSplitContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer/VBoxContainer/HBoxContainer/Button2
  9. @onready var button_3: Button = $HSplitContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer/VBoxContainer/HBoxContainer/Button3
  10. @onready var button_4: Button = $HSplitContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer/VBoxContainer/HBoxContainer/Button4
  11. @onready var slot_check_box: CheckBox = $HSplitContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer/VBoxContainer/HBoxContainer3/SlotCheckBox
  12. @onready var value_treeview: Tree = $HSplitContainer/PanelContainer/MarginContainer/HBoxContainer/MarginContainer/VBoxContainer/HBoxContainer2/ValueTreeview
  13. var states_index = -1
  14. var scope_buttons = []
  15. var current_scope = 0
  16. var states = null
  17. func _ready() -> void:
  18. _init_gui()
  19. func _init_gui():
  20. visibility_changed.connect(_on_visibility_changed)
  21. # avatar_state
  22. state_treeview.columns = 3
  23. state_treeview.hide_root = true
  24. state_treeview.set_column_title(0, "ID")
  25. state_treeview.set_column_title(1, "Name")
  26. state_treeview.set_column_title(2, "State")
  27. state_treeview.set_column_custom_minimum_width(0, 40)
  28. state_treeview.set_column_custom_minimum_width(2, 40)
  29. state_treeview.set_column_expand(1, true)
  30. state_treeview.set_column_expand_ratio(1, 4)
  31. state_treeview.item_selected.connect(_on_avatar_state_treeview_selected)
  32. #state_treeview.nothing_selected.connect(_on_asset_listview_nothing_selected)
  33. # total_state_treeview
  34. total_state_treeview.columns = 3
  35. total_state_treeview.hide_root = true
  36. total_state_treeview.set_column_title(0, "Part")
  37. total_state_treeview.set_column_title(1, "Required")
  38. total_state_treeview.set_column_title(2, "Max")
  39. total_state_treeview.create_item()
  40. # scope_buttons
  41. scope_buttons.append(button_0)
  42. scope_buttons.append(button_1)
  43. scope_buttons.append(button_2)
  44. scope_buttons.append(button_3)
  45. scope_buttons.append(button_4)
  46. for i in range(scope_buttons.size()):
  47. var btn = scope_buttons[i]
  48. btn.toggled.connect(_on_scope_button_pressed.bind(i))
  49. pass
  50. slot_check_box.toggled.connect(_onslot_check_box_toggled)
  51. # value_treeview
  52. value_treeview.columns = 3
  53. value_treeview.hide_root = true
  54. value_treeview.set_column_title(0, "ID")
  55. value_treeview.set_column_title(1, "Value")
  56. value_treeview.set_column_title(2, "Required")
  57. value_treeview.set_column_custom_minimum_width(0, 40)
  58. value_treeview.set_column_custom_minimum_width(2, 60)
  59. value_treeview.set_column_expand(0, false)
  60. value_treeview.set_column_expand(1, true)
  61. value_treeview.set_column_expand(2, false)
  62. value_treeview.item_edited.connect(_on_value_treeview_item_edited)
  63. var root = value_treeview.create_item()
  64. root.set_cell_mode(2, TreeItem.CELL_MODE_CHECK)
  65. root.set_checked(2, false)
  66. func load_data():
  67. if AvatarDollDataMgr.initialed == false:
  68. return
  69. states = AvatarDollDataMgr.avatar_doll_data["Settings"]["States"]
  70. state_treeview.clear()
  71. state_treeview.create_item() # root
  72. value_treeview.clear()
  73. value_treeview.create_item()
  74. # state_treeview
  75. for i in range(states.size()):
  76. var state = states[i]
  77. var item = state_treeview.create_item()
  78. item.set_text(0, str(i))
  79. item.set_text(1, str(state["Name"]))
  80. item.set_text(2, str(state["Values"].size()))
  81. item.set_text_alignment(0, HORIZONTAL_ALIGNMENT_CENTER)
  82. item.set_text_alignment(1, HORIZONTAL_ALIGNMENT_CENTER)
  83. item.set_text_alignment(2, HORIZONTAL_ALIGNMENT_CENTER)
  84. # total_state_treeview
  85. update_total_state()
  86. if states.size() > 0:
  87. state_treeview.set_selected(state_treeview.get_root().get_child(0), 0)
  88. func _on_visibility_changed() -> void:
  89. if is_visible_in_tree() == true:
  90. load_data()
  91. func _on_scope_button_pressed(_toggled_on, _index):
  92. if not AvatarDollDataMgr.initialed:
  93. return
  94. current_scope = 0
  95. for i in range(scope_buttons.size()):
  96. if scope_buttons[i].button_pressed:
  97. current_scope += 1 << i
  98. states[states_index]["Scope"] = current_scope
  99. update_total_state()
  100. func _onslot_check_box_toggled(toggled_on):
  101. if not AvatarDollDataMgr.initialed or states_index < 0:
  102. return
  103. states[states_index]["Slot"] = toggled_on
  104. update_total_state()
  105. func _on_avatar_state_treeview_selected():
  106. if not AvatarDollDataMgr.initialed:
  107. return
  108. value_treeview.clear()
  109. value_treeview.create_item() # root
  110. states_index = int(state_treeview.get_selected().get_text(0))
  111. if states_index < 0:
  112. for i in range(5):
  113. scope_buttons[i].set_pressed_no_signal(false)
  114. return
  115. var state = states[states_index]
  116. var scope = int(state["Scope"])
  117. for i in range(5):
  118. var s = scope & 1
  119. scope_buttons[i].set_pressed_no_signal(s == 1)
  120. scope = scope >> 1
  121. slot_check_box.set_pressed_no_signal(state["Slot"])
  122. for i in range(state["Values"].size()):
  123. var item = value_treeview.create_item()
  124. item.set_text_alignment(0, HORIZONTAL_ALIGNMENT_CENTER)
  125. item.set_text_alignment(1, HORIZONTAL_ALIGNMENT_CENTER)
  126. item.set_cell_mode(2, TreeItem.CELL_MODE_CHECK)
  127. item.set_editable(1, true)
  128. item.set_editable(2, true)
  129. item.set_text(0, str(i))
  130. item.set_text(1, state["Values"][i])
  131. item.set_checked(2, state["Required"][i])
  132. func _on_value_treeview_item_edited():
  133. if not AvatarDollDataMgr.initialed or states_index < 0:
  134. return
  135. var item = value_treeview.get_edited()
  136. var row = int(item.get_text(0))
  137. var column = value_treeview.get_edited_column()
  138. var state = states[states_index]
  139. if column == 1: state["Values"][row] = item.get_text(column)
  140. elif column == 2: state["Required"][row] = item.is_checked(column)
  141. update_total_state()
  142. func update_total_state():
  143. total_state_treeview.clear()
  144. total_state_treeview.create_item()
  145. var slot_required = 0
  146. var slot_max = 0
  147. var total_state_required = [0, 0, 0, 0, 0]
  148. var total_state_max = [0, 0, 0, 0, 0]
  149. for state in states:
  150. var required = 0
  151. var value_count = state["Values"].size()
  152. for r in state["Required"]:
  153. if r: required += 1
  154. if state["Slot"]:
  155. if slot_required == 0:
  156. slot_required = value_count
  157. else:
  158. slot_required *= value_count
  159. if slot_max == 0:
  160. slot_max = value_count
  161. else:
  162. slot_max *= value_count
  163. var scope = int(state["Scope"])
  164. for i in range(5):
  165. if scope & 1 == 1:
  166. if total_state_max[i] == 0:
  167. total_state_max[i] = value_count
  168. else:
  169. total_state_max[i] *= value_count
  170. if total_state_required[i] == 0:
  171. total_state_required[i] = required
  172. else:
  173. total_state_required[i] *= required
  174. scope = scope >> 1
  175. slot_required = slot_required if slot_required != 0 else 1
  176. slot_max = slot_max if slot_max != 0 else 1
  177. # set data
  178. var item = total_state_treeview.create_item()
  179. item.set_text(0, "Slot")
  180. item.set_text(1, str(slot_required))
  181. item.set_text(2, str(slot_max))
  182. item.set_text_alignment(0, HORIZONTAL_ALIGNMENT_CENTER)
  183. item.set_text_alignment(1, HORIZONTAL_ALIGNMENT_CENTER)
  184. item.set_text_alignment(2, HORIZONTAL_ALIGNMENT_CENTER)
  185. var parts = ["Body", "Head", "Hair", "Face", "Cloth"]
  186. for i in range(5):
  187. item = total_state_treeview.create_item()
  188. item.set_text(0, parts[i])
  189. item.set_text(1, str(total_state_required[i]))
  190. item.set_text(2, str(total_state_max[i]))
  191. item.set_text_alignment(0, HORIZONTAL_ALIGNMENT_CENTER)
  192. item.set_text_alignment(1, HORIZONTAL_ALIGNMENT_CENTER)
  193. item.set_text_alignment(2, HORIZONTAL_ALIGNMENT_CENTER)