asset_panel.gd 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. extends PanelContainer
  2. signal asset_updated()
  3. @onready var refresh_button: Button = $MarginContainer/VBoxContainer/HBoxContainer/RefreshButton
  4. @onready var item_list: ItemList = $MarginContainer/VBoxContainer/ItemList
  5. @onready var search_line_edit: LineEdit = $MarginContainer/VBoxContainer/HBoxContainer/SearchLineEdit
  6. var search_text = ""
  7. func _ready() -> void:
  8. init_gui()
  9. func _process(_delta: float) -> void:
  10. pass
  11. func init_gui():
  12. visibility_changed.connect(_on_visibility_changed)
  13. refresh_button.pressed.connect(_on_refresh_button_pressed)
  14. search_line_edit.text_changed.connect(_on_search)
  15. item_list.set_drag_forwarding(_on_itemlist_get_drag_data, Callable(), Callable())
  16. func update_data():
  17. if not AvatarDollDataMgr.initialed:
  18. return
  19. item_list.clear()
  20. item_list.add_item("__blank__", AvatarDollDataMgr.blank_texture)
  21. for asset_id in AvatarDollDataMgr.avatar_asset:
  22. var text = AvatarDollDataMgr.avatar_asset_name[asset_id]
  23. if search_text == "" or search_text in text:
  24. var icon = AvatarDollDataMgr.avatar_asset[asset_id]
  25. var index = item_list.add_item(text, icon)
  26. func _on_visibility_changed():
  27. if is_visible_in_tree():
  28. update_data()
  29. func _on_refresh_button_pressed():
  30. AvatarDollDataMgr.reload_all_asset()
  31. update_data()
  32. asset_updated.emit()
  33. func _on_itemlist_get_drag_data(at_position: Vector2):
  34. var item_index = item_list.get_item_at_position(at_position)
  35. var asset_name = item_list.get_item_text(item_index)
  36. var icon = item_list.get_item_icon(item_index)
  37. var drag_preview = Control.new()
  38. var _size = icon.get_size()
  39. var _scale = 100.0 / max(_size.x, _size.y)
  40. var bg = ColorRect.new()
  41. bg.size = Vector2(100, 100)
  42. bg.position = Vector2(-50.0, -50.0)
  43. bg.color = Color(0.0, 0.675, 0.86, 0.5)
  44. drag_preview.add_child(bg)
  45. var texture = TextureRect.new()
  46. texture.texture = icon
  47. texture.scale = Vector2(_scale, _scale)
  48. texture.position = Vector2(-50.0, -50.0)
  49. drag_preview.add_child(texture)
  50. item_list.set_drag_preview(drag_preview)
  51. var data = {
  52. "type": "asset_panel_drag",
  53. "data": {
  54. "asset_name": asset_name
  55. }
  56. }
  57. return data
  58. func _on_search(new_text):
  59. search_text = new_text
  60. update_data()