EditorTileSelector.gd 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. class_name EditorTileSelector
  2. extends Control
  3. @export var tile_name := ""
  4. @export_enum("Tile", "Entity", "Terrain") var type := 0
  5. @export var icon_texture: Resource = null
  6. @export var icon_region_override := Rect2(0, 0, 0, 0)
  7. @export var secondary_icon_texture: Resource = null
  8. @export var secondary_icon_region_override := Rect2(0, 0, 0, 0)
  9. @export_category("Entity")
  10. @export var entity_scene: PackedScene = null
  11. @export var tile_offset := Vector2i(0, 8)
  12. @export_category("Tile")
  13. @export var source_id := 0
  14. @export var terrain_id := 0
  15. @export var tile_coords := Vector2i.ZERO
  16. @export var flip_h := false
  17. @export var flip_v := false
  18. var texture_rect_region := Rect2(0, 0, 0, 0)
  19. signal tile_selected(selector: EditorTileSelector)
  20. var mouse_hovered := false
  21. var disabled := false
  22. func _ready() -> void:
  23. set_icon_texture()
  24. set_second_icon_texture()
  25. update_visuals()
  26. set_process(false)
  27. if tile_selected.is_connected(owner.on_tile_selected) == false:
  28. tile_selected.connect(owner.on_tile_selected)
  29. %NameLabel.text = tile_name
  30. func _process(_delta: float) -> void:
  31. var target_position = get_viewport().get_mouse_position()
  32. target_position.x = clamp(target_position.x, %Panel.size.x / 2, (get_viewport().get_visible_rect().size.x) - %Panel.size.x / 2)
  33. %NamePanel.position = target_position
  34. func set_icon_texture():
  35. if icon_texture == null:
  36. return
  37. if icon_texture is JSON:
  38. $ResourceSetterNew.resource_json = icon_texture
  39. $ResourceSetterNew.update_resource()
  40. else:
  41. %Icon.texture = ResourceSetter.get_resource(icon_texture, %Icon)
  42. func set_second_icon_texture():
  43. if secondary_icon_texture == null:
  44. return
  45. if secondary_icon_texture is JSON:
  46. $ResourceSetterNew2.resource_json = secondary_icon_texture
  47. $ResourceSetterNew2.update_resource()
  48. elif secondary_icon_texture is ThemedResource:
  49. %SecondaryIcon.texture = ResourceSetter.get_resource(secondary_icon_texture, %SecondaryIcon)
  50. else:
  51. %SecondaryIcon.texture = secondary_icon_texture
  52. func on_pressed() -> void:
  53. tile_selected.emit(self)
  54. func update_visuals() -> void:
  55. if icon_region_override != Rect2(0, 0, 0, 0):
  56. %Icon.region_rect = icon_region_override
  57. if secondary_icon_region_override != Rect2(0, 0, 0, 0):
  58. %SecondaryIcon.region_rect = secondary_icon_region_override
  59. modulate = Color.WHITE if not disabled else Color.DIM_GRAY
  60. func set_mouse_hovered(hovered := false) -> void:
  61. %NamePanel.visible = hovered and tile_name.is_empty() == false
  62. mouse_hovered = hovered
  63. $Button.disabled = disabled
  64. set_process(hovered)
  65. func on_mouse_entered() -> void:
  66. set_mouse_hovered(true)
  67. func on_mouse_exited() -> void:
  68. set_mouse_hovered(false)