state_selecter.gd 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. extends PanelContainer
  2. signal state_selected(state_code: String)
  3. @onready var state_name_label: Label = $MarginContainer/VBoxContainer/HBoxContainer/StateNameLabel
  4. @onready var combo_container: HBoxContainer = $MarginContainer/VBoxContainer/HBoxContainer2/ComboContainer
  5. @onready var reset_button: Button = $MarginContainer/VBoxContainer/HBoxContainer2/ResetButton
  6. @onready var icon_button: Button = $MarginContainer/VBoxContainer/HBoxContainer2/IconButton
  7. @onready var list_button: Button = $MarginContainer/VBoxContainer/HBoxContainer2/ListButton
  8. @onready var state_list: Tree = $MarginContainer/VBoxContainer/StateList
  9. @onready var state_icon: ItemList = $MarginContainer/VBoxContainer/StateIcon
  10. var _current_avatar_type = null
  11. var _current_avatar_part = null
  12. var state_comboboxes:Array[OptionButton] = []
  13. var current_state: String
  14. var combo_count = 0
  15. func _ready() -> void:
  16. init_gui()
  17. func init_gui():
  18. reset_button.pressed.connect(_on_reset_button_pressed)
  19. var button_group = ButtonGroup.new()
  20. icon_button.button_group = button_group
  21. list_button.button_group = button_group
  22. list_button.button_pressed = true
  23. state_icon.visible = false
  24. icon_button.pressed.connect(_on_icon_button_pressed)
  25. list_button.pressed.connect(_on_list_button_pressed)
  26. state_list.columns = 2
  27. state_list.hide_root = true
  28. state_list.column_titles_visible = true
  29. state_list.set_column_title(0, "Code")
  30. state_list.set_column_title(1, "Full Name")
  31. state_list.set_column_title_alignment(0, HORIZONTAL_ALIGNMENT_CENTER)
  32. state_list.set_column_title_alignment(1, HORIZONTAL_ALIGNMENT_LEFT)
  33. state_list.set_column_custom_minimum_width(0, 100)
  34. state_list.set_column_expand(0, false)
  35. state_list.set_column_expand(1, true)
  36. state_list.item_selected.connect(_on_state_list_item_selected)
  37. func load_data(avatar_type, avatar_part = null):
  38. if avatar_type == null or avatar_part == null:
  39. for child in state_comboboxes:
  40. child.visible = false
  41. state_list.clear()
  42. state_list.create_item() # root
  43. return
  44. _current_avatar_type = avatar_type
  45. if avatar_part["Elements"].size() == 0:
  46. state_list.clear()
  47. state_list.create_item() # root
  48. return
  49. _current_avatar_part = avatar_part
  50. combo_count = avatar_part["Elements"].keys()[0].length()
  51. var state_set = {}
  52. for i in range(combo_count):
  53. state_set[i] = []
  54. # fill state_list, state_icon and collect state_set
  55. state_list.clear()
  56. state_list.create_item() # root
  57. state_icon.clear()
  58. var states = []
  59. for state_code in avatar_part["Elements"].keys():
  60. if avatar_part["Elements"][state_code].size() > 0:
  61. states.append(state_code)
  62. states.sort()
  63. for state_code in states:
  64. var state_names = AvatarDollDataMgr.get_state_names(avatar_type, state_code)
  65. var item = state_list.create_item()
  66. item.set_text(0, state_code)
  67. item.set_text(1, " / ".join(state_names))
  68. item.set_metadata(0, state_code)
  69. state_icon.add_item(state_code, AvatarDollDataMgr.default_texture)
  70. var index = -1
  71. for i in range(combo_count):
  72. index = AvatarDollDataMgr.get_state_index(state_code[i])
  73. if index != -1 and index not in state_set[i]:
  74. state_set[i].append(index)
  75. for i in state_set:
  76. state_set[i].sort()
  77. var part_state = AvatarDollDataMgr.avatar_part_state[avatar_type]
  78. var combo_content = {}
  79. for i in range(part_state.size()):
  80. var state = part_state[i]
  81. combo_content[i] = [ "All %s" % state["Name"]]
  82. for index in state_set:
  83. for i in state_set[index]:
  84. combo_content[index].append(part_state[index]["Values"][i])
  85. # create combo box
  86. if state_comboboxes.size() < combo_content.size():
  87. var sub = combo_content.size() - state_comboboxes.size()
  88. while sub > 0:
  89. var combo = OptionButton.new()
  90. combo.theme = preload("res://Resources/Theme/basic_theme.tres")
  91. combo.item_selected.connect(_on_state_combo_selected)
  92. state_comboboxes.append(combo)
  93. combo_container.add_child(combo)
  94. sub -= 1
  95. for index in range(state_comboboxes.size()):
  96. var combo = state_comboboxes[index]
  97. if index < combo_content.size():
  98. combo.visible = true
  99. combo.clear()
  100. for i in range(combo_content[index].size()):
  101. combo.add_item(combo_content[index][i])
  102. if i == 0:
  103. combo.set_item_metadata(i, "")
  104. else:
  105. var c = AvatarDollDataMgr.get_state_char(state_set[index][i - 1])
  106. combo.set_item_metadata(i, c)
  107. else:
  108. combo.visible = false
  109. pass
  110. func update_filter():
  111. var state_vislble = {}
  112. var keys = _current_avatar_part["Elements"].keys()
  113. keys.sort()
  114. for state_code in keys:
  115. state_vislble[state_code] = true
  116. for i in range(combo_count):
  117. var combo = state_comboboxes[i]
  118. var c = combo.get_selected_metadata()
  119. if c == "":
  120. continue
  121. for state_code in state_vislble:
  122. if state_vislble[state_code] == false:
  123. continue
  124. if state_code[i] != c:
  125. state_vislble[state_code] = false
  126. for item in state_list.get_root().get_children():
  127. item.visible = state_vislble[item.get_metadata(0)]
  128. state_icon.clear()
  129. for state_code in state_vislble:
  130. if state_vislble[state_code]:
  131. state_icon.add_item(state_code, AvatarDollDataMgr.default_texture)
  132. func _on_reset_button_pressed():
  133. for combo in state_comboboxes:
  134. combo.selected = 0
  135. update_filter()
  136. func _on_icon_button_pressed():
  137. state_icon.visible = true
  138. state_list.visible = false
  139. func _on_list_button_pressed():
  140. state_list.visible = true
  141. state_icon.visible = false
  142. func _on_state_combo_selected(index):
  143. update_filter()
  144. func _on_state_list_item_selected():
  145. var item = state_list.get_selected()
  146. if item != null:
  147. var state_code = item.get_metadata(0)
  148. state_selected.emit(state_code)
  149. state_name_label.text = item.get_text(1)
  150. func set_state_list_select(state_code):
  151. state_list.set_block_signals(true)
  152. if state_code == "":
  153. state_list.deselect_all()
  154. else:
  155. for item in state_list.get_root().get_children():
  156. if item.get_metadata(0) == state_code:
  157. state_list.set_selected(item, 0)
  158. state_name_label.text = item.get_text(1)
  159. break
  160. state_list.set_block_signals(false)