asset_window.gd 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. extends Control
  2. signal goto_asset_using(using_type: String, asset_id: int, avatar_type: String, avatar_part_index: int, state_code: String, element_index: int)
  3. @onready var asset_listview: Tree = $HSplitContainer/AssetPanel/MarginContainer/VBoxContainer/AssetListview
  4. @onready var canvas_2d: Node2D = $HSplitContainer/HSplitContainer/PanelContainer2/SubViewportContainer/SubViewport/Canvas2d
  5. @onready var use_listview: Tree = $HSplitContainer/HSplitContainer/PanelContainer/MarginContainer/VBoxContainer/UseListview
  6. @onready var refresh_button: Button = $HSplitContainer/AssetPanel/MarginContainer/VBoxContainer/HBoxContainer/RefreshButton
  7. @onready var add_button: Button = $HSplitContainer/AssetPanel/MarginContainer/VBoxContainer/HBoxContainer/AddButton
  8. @onready var file_dialog: FileDialog = $FileDialog
  9. @onready var file_name_line_edit: LineEdit = $HSplitContainer/HSplitContainer/PanelContainer/MarginContainer/VBoxContainer/GridContainer/FileNameLineEdit
  10. @onready var file_path_line_edit: LineEdit = $HSplitContainer/HSplitContainer/PanelContainer/MarginContainer/VBoxContainer/GridContainer/FilePathLineEdit
  11. @onready var image_size_line_edit: LineEdit = $HSplitContainer/HSplitContainer/PanelContainer/MarginContainer/VBoxContainer/GridContainer/ImageSizeLineEdit
  12. var icon_checked: Texture2D = preload("res://Resources/UI/using.png")
  13. var icon_missing_file: Texture2D = preload("res://Resources/UI/missing_file.png")
  14. var icon_replace: Texture2D = preload("res://Resources/UI/replace.png")
  15. var icon_delete: Texture2D = preload("res://Resources/UI/Trash.png")
  16. var current_asset_id = -1
  17. func _ready() -> void:
  18. init_gui()
  19. func init_gui():
  20. get_tree().get_root().files_dropped.connect(_on_files_dropped)
  21. visibility_changed.connect(_on_visibility_changed)
  22. canvas_2d.set_editable(false)
  23. refresh_button.pressed.connect(_on_refresh_button_pressed)
  24. add_button.pressed.connect(_on_add_button_pressed)
  25. file_dialog.files_selected.connect(_on_file_dialog_files_selected)
  26. file_dialog.file_selected.connect(_on_file_dialog_file_selected)
  27. asset_listview.columns = 4
  28. asset_listview.hide_root = true
  29. asset_listview.set_column_custom_minimum_width(0, 16)
  30. asset_listview.set_column_custom_minimum_width(2, 16)
  31. asset_listview.set_column_custom_minimum_width(3, 16)
  32. asset_listview.set_column_expand(0, false)
  33. asset_listview.set_column_expand(1, true)
  34. asset_listview.set_column_expand(2, false)
  35. asset_listview.set_column_expand(3, false)
  36. asset_listview.item_selected.connect(_on_asset_listview_item_selected)
  37. #asset_listview.item_activated.connect(_on_asset_listview_item_activated)
  38. asset_listview.create_item()
  39. use_listview.columns = 4
  40. use_listview.set_column_title(0, "Type")
  41. use_listview.set_column_title(1, "Scope")
  42. use_listview.set_column_title(2, "Name")
  43. use_listview.set_column_title(3, "State")
  44. use_listview.set_column_custom_minimum_width(0, 65)
  45. use_listview.set_column_custom_minimum_width(1, 75)
  46. use_listview.set_column_custom_minimum_width(3, 75)
  47. use_listview.set_column_expand(0, false)
  48. use_listview.set_column_expand(1, false)
  49. use_listview.set_column_expand(2, true)
  50. use_listview.set_column_expand(3, false)
  51. use_listview.create_item()
  52. use_listview.item_activated.connect(_on_use_listview_item_activated)
  53. pass
  54. func load_data():
  55. if not AvatarDollDataMgr.initialed:
  56. return
  57. asset_listview.clear()
  58. asset_listview.create_item() # root
  59. # asset_listview
  60. var assetMap = AvatarDollDataMgr.avatar_doll_data["AssetMap"]
  61. for asset_id in assetMap:
  62. if asset_id == 0:
  63. continue
  64. var asset_name = AvatarDollDataMgr.get_asset_name(asset_id)
  65. var item = asset_listview.create_item()
  66. item.set_cell_mode(0, TreeItem.CELL_MODE_ICON)
  67. item.set_cell_mode(2, TreeItem.CELL_MODE_ICON)
  68. item.set_text(1, asset_name)
  69. item.set_icon(3, icon_delete)
  70. item.set_metadata(0, asset_id)
  71. var asset_using = AvatarDollDataMgr.get_asset_using(asset_id)
  72. if asset_using.size() > 0:
  73. item.set_icon(0, icon_checked)
  74. if not FileAccess.file_exists(assetMap[asset_id][0]):
  75. item.set_icon(2, icon_missing_file)
  76. else:
  77. item.set_icon(2, icon_replace)
  78. if current_asset_id == asset_id:
  79. var use_sel = use_listview.get_selected()
  80. var state_code = null
  81. if use_sel:
  82. state_code = use_sel.get_text(3)
  83. asset_listview.set_selected(item, 0)
  84. for use_item in use_listview.get_root().get_children():
  85. if use_item.get_text(3) == state_code:
  86. use_listview.set_selected(use_item, 0)
  87. break
  88. func update_data():
  89. # canvas_2d
  90. var asset_id = current_asset_id
  91. if asset_id <= 0:
  92. canvas_2d.load_elements([])
  93. canvas_2d.queue_redraw()
  94. return
  95. var texture = AvatarDollDataMgr.get_asset(asset_id)
  96. var element = {
  97. "AssetId": asset_id,
  98. "Layer": 0,
  99. "LayerOffset": 0,
  100. "PositionX": 0,
  101. "PositionY": 0,
  102. "Rotation": 0,
  103. "ScaleX": 1.0,
  104. "ScaleY": 1.0,
  105. "Skew": 0,
  106. }
  107. canvas_2d.load_elements([element])
  108. canvas_2d.set_background(texture.get_size())
  109. canvas_2d.zoom_fit()
  110. canvas_2d.queue_redraw()
  111. # property
  112. file_name_line_edit.text = AvatarDollDataMgr.get_asset_name(asset_id)
  113. file_path_line_edit.text = AvatarDollDataMgr.avatar_doll_data["AssetMap"][asset_id][0]
  114. image_size_line_edit.text = "%d x %d" % [texture.get_size().x, texture.get_size().y]
  115. # using
  116. var asset_using = AvatarDollDataMgr.get_asset_using(asset_id)
  117. for using in asset_using:
  118. var new_item = use_listview.create_item()
  119. if using[0] == "icon":
  120. new_item.set_text(0, using[0]) # type
  121. new_item.set_text(1, using[1]) # scope
  122. new_item.set_text(2, AvatarDollDataMgr.avatar_doll_data[using[1]][using[2]]["Name"]) # name
  123. new_item.set_text(3, "") # state
  124. else:
  125. new_item.set_text(0, using[0]) # type
  126. new_item.set_text(1, using[1]) # scope
  127. new_item.set_text(2, AvatarDollDataMgr.avatar_doll_data[using[1]][using[2]]["Name"]) # name
  128. new_item.set_text(3, using[3]) # state
  129. new_item.set_metadata(0, using)
  130. pass
  131. func _on_visibility_changed() -> void:
  132. if is_visible_in_tree() == true:
  133. load_data()
  134. func _on_files_dropped(files):
  135. if not AvatarDollDataMgr.initialed:
  136. return
  137. var rect = asset_listview.get_global_transform() * asset_listview.get_rect()
  138. if rect.has_point(get_global_mouse_position()):
  139. for file_path in files:
  140. var asset_id = AvatarDollDataMgr.load_asset(file_path)
  141. load_data()
  142. func _on_asset_listview_item_selected():
  143. use_listview.clear()
  144. use_listview.create_item() # root
  145. canvas_2d.load_elements([])
  146. var item = asset_listview.get_selected()
  147. if item == null:
  148. return
  149. current_asset_id = item.get_metadata(0)
  150. var column = asset_listview.get_column_at_position(asset_listview.get_local_mouse_position())
  151. if column == 2:
  152. var msg = "是否把 %s 替换为其他资源?" % AvatarDollDataMgr.get_asset_name(current_asset_id)
  153. var msg_box = MessageBox.question(self,
  154. "提示", msg,
  155. MessageBox.StandardButton.YES | MessageBox.StandardButton.NO)
  156. msg_box.accepted.connect(func():
  157. file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE
  158. file_dialog.show()
  159. )
  160. elif column == 3:
  161. var msg = "确定删除 %s 吗?\n所有相关引用也将被一并删除!" % AvatarDollDataMgr.get_asset_name(current_asset_id)
  162. var msg_box = MessageBox.warning(self,
  163. "警告", msg,
  164. MessageBox.StandardButton.YES | MessageBox.StandardButton.NO)
  165. msg_box.resize(Vector2(500, 150))
  166. msg_box.accepted.connect(func():
  167. AvatarDollDataMgr.remove_asset(current_asset_id)
  168. current_asset_id = -1
  169. load_data()
  170. update_data()
  171. )
  172. update_data()
  173. func _on_use_listview_item_activated():
  174. var item = use_listview.get_selected()
  175. if item == null:
  176. return
  177. var using = item.get_metadata(0)
  178. if using[0] == "icon":
  179. goto_asset_using.emit(using[0], current_asset_id, using[1], using[2], "", -1)
  180. else:
  181. goto_asset_using.emit(using[0], current_asset_id, using[1], using[2], using[3], using[4])
  182. func _on_refresh_button_pressed():
  183. AvatarDollDataMgr.reload_all_asset()
  184. load_data()
  185. update_data()
  186. func _on_add_button_pressed():
  187. file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILES
  188. file_dialog.show()
  189. func _on_file_dialog_files_selected(files):
  190. for file_path in files:
  191. var asset_id = AvatarDollDataMgr.load_asset(file_path)
  192. load_data()
  193. func _on_file_dialog_file_selected(file):
  194. AvatarDollDataMgr.replace_asset(current_asset_id, file)
  195. load_data()
  196. update_data()
  197. for item in asset_listview.get_root().get_children():
  198. if item.get_metadata(0) == current_asset_id:
  199. asset_listview.set_selected(item, 0)
  200. break