palette_window.gd 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. extends Control
  2. @onready var avatar_type_combo: OptionButton = $VBoxContainer/HSplitContainer/VSplitContainer/PanelContainer/MarginContainer/VBoxContainer/AvatarTypeCombo
  3. @onready var avatar_part_listview: Tree = $VBoxContainer/HSplitContainer/VSplitContainer/PanelContainer/MarginContainer/VBoxContainer/AvatarPartListview
  4. @onready var palette_listview: Tree = $VBoxContainer/HSplitContainer/VSplitContainer/PanelContainer2/MarginContainer2/VBoxContainer/PaletteListview
  5. @onready var main_content_tab_container: TabBar = $VBoxContainer/HSplitContainer/HSplitContainer/VSplitContainer/VBoxContainer/PanelContainer2/MainContentTabContainer
  6. @onready var state_selecter: PanelContainer = $VBoxContainer/HSplitContainer/HSplitContainer/VSplitContainer/StateSelecter
  7. @onready var palette_param_container: VBoxContainer = $VBoxContainer/HSplitContainer/HSplitContainer/VSplitContainer2/PanelContainer2/MarginContainer/VBoxContainer/ScrollContainer/ParamVBoxContainer
  8. @onready var palette_add_button: Button = $VBoxContainer/HSplitContainer/VSplitContainer/PanelContainer2/MarginContainer2/VBoxContainer/HBoxContainer/Add
  9. @onready var palette_param_add_button: Button = $VBoxContainer/HSplitContainer/HSplitContainer/VSplitContainer2/PanelContainer2/MarginContainer/VBoxContainer/HBoxContainer/Add
  10. @onready var canvas_2d: Node2D = $VBoxContainer/HSplitContainer/HSplitContainer/VSplitContainer/VBoxContainer/PanelContainer/SubViewportContainer/SubViewport/Canvas2d
  11. @onready var guid_line_edit: LineEdit = $VBoxContainer/HSplitContainer/HSplitContainer/VSplitContainer2/PanelContainer/MarginContainer/VBoxContainer/GridContainer/GuidLineEdit
  12. @onready var name_line_edit: LineEdit = $VBoxContainer/HSplitContainer/HSplitContainer/VSplitContainer2/PanelContainer/MarginContainer/VBoxContainer/GridContainer/NameLineEdit
  13. @onready var intro_text_edit: TextEdit = $VBoxContainer/HSplitContainer/HSplitContainer/VSplitContainer2/PanelContainer/MarginContainer/VBoxContainer/GridContainer/IntroTextEdit
  14. const PALETTE_PARAM_PANEL = preload("res://Scenes/control/PaletteParamPanel.tscn")
  15. const MAX_PALETTE_PARAM_PANEL = 8
  16. var palette_param_panels = []
  17. var palette_param_panel_data = []
  18. var palette_param_count = 0
  19. var camera_zoom_texture = 100
  20. var camera_position_texture = Vector2.ZERO
  21. var camera_zoom_icon = 100
  22. var camera_position_icon = Vector2.ZERO
  23. var _current_avatar_type = "Clothes"
  24. var _current_avatar_index = -1
  25. var _current_part
  26. var _current_palette_index = -1
  27. var _current_part_assets = {}
  28. var _current_state_code = null
  29. func _ready() -> void:
  30. _init_gui()
  31. func _init_gui():
  32. canvas_2d.set_editable(false)
  33. visibility_changed.connect(_on_visibility_changed)
  34. avatar_type_combo.item_selected.connect(_on_avatar_type_combo_item_selected)
  35. main_content_tab_container.tab_changed.connect(_on_main_content_tab_container_tab_changed)
  36. state_selecter.state_selected.connect(_on_state_selected)
  37. # avatar_part
  38. avatar_part_listview.columns = 2
  39. avatar_part_listview.hide_root = true
  40. avatar_part_listview.set_column_title(0, "ID")
  41. avatar_part_listview.set_column_title(1, "Name")
  42. avatar_part_listview.set_column_custom_minimum_width(0, 40)
  43. avatar_part_listview.set_column_expand(1, true)
  44. avatar_part_listview.set_column_expand_ratio(1, 3)
  45. avatar_part_listview.item_selected.connect(_on_avatar_part_listview_item_selected)
  46. # palette
  47. palette_add_button.pressed.connect(_on_palette_add_button_preessed)
  48. palette_listview.columns = 2
  49. palette_listview.hide_root = true
  50. palette_listview.set_column_title(0, "ID")
  51. palette_listview.set_column_title(1, "Name")
  52. palette_listview.set_column_custom_minimum_width(0, 40)
  53. palette_listview.set_column_expand(1, true)
  54. palette_listview.set_column_expand_ratio(1, 3)
  55. palette_listview.item_selected.connect(_on_palette_listview_item_selected)
  56. # palette_param
  57. palette_param_add_button.pressed.connect(_on_palette_param_add_button_preessed)
  58. for i in range(MAX_PALETTE_PARAM_PANEL):
  59. var param_panel = PALETTE_PARAM_PANEL.instantiate()
  60. param_panel.name = "palette_param_%d" % i
  61. param_panel.visible = false
  62. palette_param_panel_data.append({})
  63. palette_param_panels.append(param_panel)
  64. palette_param_container.add_child(param_panel)
  65. param_panel.reset_parameters()
  66. param_panel.value_change.connect(_on_palette_param_panel_value_change)
  67. param_panel.action.connect(_on_palette_param_panel_action)
  68. # palette property
  69. name_line_edit.text_submitted.connect(_on_name_line_edit_text_submitted)
  70. intro_text_edit.text_submitted.connect(_on_intro_text_edit_text_submitted)
  71. func load_data():
  72. if AvatarDollDataMgr.initialed == false:
  73. return
  74. update_avatar_part_listview()
  75. func update_avatar_part_listview():
  76. if AvatarDollDataMgr.initialed == false:
  77. return
  78. _current_part = null
  79. _current_part_assets = {}
  80. _current_avatar_index = -1
  81. _current_state_code = null
  82. avatar_part_listview.clear()
  83. avatar_part_listview.create_item() # root
  84. var _data = AvatarDollDataMgr.avatar_doll_data
  85. if not _data.has(_current_avatar_type):
  86. return
  87. for i in _data[_current_avatar_type].size():
  88. var part = _data[_current_avatar_type][i]
  89. var row = avatar_part_listview.create_item()
  90. row.set_text(0, "%d" % i)
  91. row.set_text(1, part["Name"])
  92. func update_state_selecter(select_code = null):
  93. if AvatarDollDataMgr.initialed == false or _current_part == null:
  94. _current_state_code = null
  95. state_selecter.load_data(null)
  96. return
  97. _current_state_code = null
  98. state_selecter.load_data(_current_avatar_type, _current_part)
  99. if select_code in _current_part["Elements"]:
  100. _current_state_code = select_code
  101. state_selecter.set_state_list_select(_current_state_code)
  102. elif _current_part["Elements"].size() > 0:
  103. _current_state_code = _current_part["Elements"].keys()[0]
  104. state_selecter.set_state_list_select(_current_state_code)
  105. func update_palette_listview(selected_index = -1):
  106. if AvatarDollDataMgr.initialed == false or _current_part == null or _current_state_code == null:
  107. _current_part_assets = {}
  108. return
  109. # palette_listview
  110. palette_listview.clear()
  111. palette_listview.create_item() # root
  112. var row = palette_listview.create_item() # default
  113. row.set_text(0, "-1")
  114. row.set_text(1, "Default")
  115. for i in _current_part["Palettes"].size():
  116. var palette = _current_part["Palettes"][i]
  117. row = palette_listview.create_item()
  118. row.set_text(0, "%d" % i)
  119. row.set_text(1, palette["Name"])
  120. # finish
  121. if selected_index < _current_part["Palettes"].size():
  122. _current_palette_index = selected_index
  123. for item in palette_listview.get_root().get_children():
  124. if selected_index == int(item.get_text(0)):
  125. palette_listview.set_selected(item, 0)
  126. else:
  127. _current_palette_index = -1
  128. palette_listview.set_selected(palette_listview.get_root().get_child(0), 0)
  129. func update_palette_property():
  130. if AvatarDollDataMgr.initialed == false or _current_part == null or _current_state_code == null:
  131. return
  132. if _current_palette_index < 0:
  133. guid_line_edit.text = str(_current_palette_index)
  134. name_line_edit.text = _current_part["Name"]
  135. intro_text_edit.text = _current_part["Introduction"]
  136. else:
  137. guid_line_edit.text = str(_current_palette_index)
  138. name_line_edit.text = _current_part["Palettes"][_current_palette_index]["Name"]
  139. intro_text_edit.text = _current_part["Palettes"][_current_palette_index]["Introduction"]
  140. func update_palette_param():
  141. if AvatarDollDataMgr.initialed == false or _current_part == null or _current_state_code == null:
  142. return
  143. # set enable
  144. var palette_param = []
  145. if _current_palette_index < 0:
  146. palette_param_count = 0
  147. palette_param_add_button.disabled = true
  148. else:
  149. palette_param = get_current_palette_param_list()
  150. palette_param_count = min(MAX_PALETTE_PARAM_PANEL, palette_param.size())
  151. palette_param_add_button.disabled = false
  152. # update asset combo
  153. var assets = {}
  154. assets[-1] = "All"
  155. if main_content_tab_container.current_tab == 0:
  156. var elements = _current_part["Elements"][_current_state_code]
  157. for i in elements.size():
  158. var asset_name = AvatarDollDataMgr.get_asset_name(elements[i]["AssetId"])
  159. if asset_name != "__blank__":
  160. assets[i] = asset_name
  161. _current_part_assets = assets
  162. for i in range(MAX_PALETTE_PARAM_PANEL):
  163. var param_panel = palette_param_panels[i]
  164. param_panel.set_block_signal(true)
  165. param_panel.setup_data(i, _current_part_assets, i==0, i == palette_param_count - 1)
  166. param_panel.set_block_signal(false)
  167. param_panel.visible = false
  168. # set param
  169. for i in range(MAX_PALETTE_PARAM_PANEL):
  170. var param_panel = palette_param_panels[i]
  171. if i < palette_param_count:
  172. param_panel.visible = true
  173. var param = palette_param[i]
  174. var basic_color = Color(param["BasicColor"]["R"], param["BasicColor"]["G"], param["BasicColor"]["B"], param["BasicColor"]["A"])
  175. var modulate_color = Color(param["ModulateColor"]["R"], param["ModulateColor"]["G"], param["ModulateColor"]["B"], param["ModulateColor"]["A"])
  176. palette_param_panel_data[i] = param
  177. param_panel.set_block_signal(true)
  178. param_panel.load_parameters(param["ElementIndex"], basic_color, param["Tolerance"], modulate_color, int(param["BlendMode"]))
  179. param_panel.set_block_signal(false)
  180. else:
  181. param_panel.visible = false
  182. update_canvas()
  183. func get_current_palette_param_list():
  184. if _current_palette_index == -1 or _current_part == null:
  185. return []
  186. var color_palette = _current_part["Palettes"][_current_palette_index]
  187. if main_content_tab_container.current_tab == 0:
  188. return color_palette["ElementPaletteParam"]
  189. else:
  190. return color_palette["IconPaletteParam"]
  191. func update_canvas():
  192. if AvatarDollDataMgr.initialed == false or _current_part == null or _current_state_code == null:
  193. canvas_2d.load_elements([])
  194. canvas_2d.zoom_fit()
  195. return
  196. if main_content_tab_container.current_tab == 0:
  197. var palettes = AvatarDollDataMgr.get_render_palettes(
  198. _current_avatar_type,
  199. _current_avatar_index,
  200. _current_state_code,
  201. _current_palette_index,
  202. false)
  203. var elements = _current_part["Elements"][_current_state_code]
  204. canvas_2d.load_elements(elements)
  205. for element_index in palettes:
  206. canvas_2d.update_palette(element_index, palettes[element_index])
  207. else:
  208. canvas_2d.load_icon(_current_part["IconAssetId"])
  209. canvas_2d.update_palette(0, get_current_palette_param_list())
  210. canvas_2d.queue_redraw()
  211. func _on_visibility_changed() -> void:
  212. if is_visible_in_tree() == true:
  213. update_state_selecter(_current_state_code)
  214. update_palette_listview(_current_palette_index)
  215. update_palette_property()
  216. update_palette_param()
  217. update_canvas()
  218. canvas_2d.sync_background()
  219. else:
  220. canvas_2d.cancle_free_transform()
  221. func _on_avatar_type_combo_item_selected(_index: int) -> void:
  222. _current_avatar_type = avatar_type_combo.get_item_text(avatar_type_combo.selected)
  223. update_avatar_part_listview()
  224. canvas_2d.load_elements([])
  225. canvas_2d.zoom_fit()
  226. func _on_avatar_part_listview_item_selected():
  227. _current_avatar_index = int(avatar_part_listview.get_selected().get_text(0))
  228. _current_part = AvatarDollDataMgr.avatar_doll_data[_current_avatar_type][_current_avatar_index]
  229. update_state_selecter(_current_state_code)
  230. update_palette_listview()
  231. update_canvas()
  232. canvas_2d.zoom_fit()
  233. func _on_palette_add_button_preessed():
  234. pass
  235. func _on_palette_listview_item_selected():
  236. var index = int(palette_listview.get_selected().get_text(0))
  237. _current_palette_index = index
  238. update_palette_property()
  239. update_palette_param()
  240. update_canvas()
  241. func _on_main_content_tab_container_tab_changed(new_index: int):
  242. update_palette_listview(_current_palette_index)
  243. if new_index == 0:
  244. state_selecter.visible = true
  245. camera_position_icon = canvas_2d.camera.position
  246. camera_zoom_icon = canvas_2d.current_zoom
  247. canvas_2d.zoom_camera(camera_zoom_texture)
  248. canvas_2d.camera.position = camera_position_texture
  249. canvas_2d.set_background(Vector2(2048, 2048))
  250. else:
  251. state_selecter.visible = false
  252. camera_position_texture = canvas_2d.camera.position
  253. camera_zoom_texture = canvas_2d.current_zoom
  254. canvas_2d.zoom_camera(camera_zoom_icon)
  255. canvas_2d.camera.position = camera_position_icon
  256. canvas_2d.set_background(Vector2(64, 64))
  257. update_canvas()
  258. func _on_palette_param_panel_action(index, action):
  259. match action:
  260. "UP":
  261. var palette_param = get_current_palette_param_list()
  262. var t = palette_param[index - 1]
  263. palette_param[index - 1] = palette_param[index]
  264. palette_param[index] = t
  265. update_palette_param()
  266. "DOWN":
  267. var palette_param = get_current_palette_param_list()
  268. var t = palette_param[index + 1]
  269. palette_param[index + 1] = palette_param[index]
  270. palette_param[index] = t
  271. update_palette_param()
  272. "REMOVE":
  273. var msg_box = MessageBox.warning(self, "警告", "确定删除吗?", MessageBox.StandardButton.YES | MessageBox.StandardButton.NO)
  274. msg_box.accepted.connect(func():
  275. var palette_param = get_current_palette_param_list()
  276. palette_param.remove_at(index)
  277. update_palette_param()
  278. )
  279. func _on_palette_param_add_button_preessed():
  280. if not AvatarDollDataMgr.initialed or palette_param_count >= MAX_PALETTE_PARAM_PANEL:
  281. return
  282. var panel = palette_param_panels[palette_param_count]
  283. var palette_param = get_current_palette_param_list()
  284. palette_param.append(panel.get_paramters())
  285. panel.reset_parameters()
  286. palette_param_count += 1
  287. for i in range(MAX_PALETTE_PARAM_PANEL):
  288. panel = palette_param_panels[i]
  289. if i < palette_param_count:
  290. panel.visible = true
  291. else:
  292. panel.visible = false
  293. palette_param_panels[palette_param_count - 1].set_selected(true)
  294. func _on_palette_param_panel_value_change(index: int, data):
  295. var palette_param = get_current_palette_param_list()
  296. palette_param[index] = data
  297. update_canvas()
  298. func _on_state_selected(state_code: String):
  299. _current_state_code = state_code
  300. update_palette_param()
  301. update_canvas()
  302. func _on_name_line_edit_text_submitted(new_text):
  303. pass
  304. func _on_intro_text_edit_text_submitted(new_text):
  305. pass