| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- @tool
- extends PanelContainer
- signal select(index)
- @onready var color_panel := %Color
- @onready var terrain_icon_slot := %TerrainIcon
- @onready var type_icon_slot := %TypeIcon
- @onready var type_icon_panel := %TerrainIconPanel
- @onready var name_label := %Name
- @onready var layout_container := %Layout
- @onready var icon_layout_container := %IconLayout
- var selected := false
- var tileset:TileSet
- var terrain:Dictionary
- var grid_mode := false
- var color_style_list:StyleBoxFlat
- var color_style_grid:StyleBoxFlat
- var color_style_decoration:StyleBoxFlat
- var _terrain_texture:Texture2D
- var _terrain_texture_rect:Rect2i
- var _icon_draw_connected := false
- func _ready():
- update()
- func update():
- if !terrain or !terrain.valid:
- return
- if !tileset:
- return
-
- name_label.text = terrain.name
- tooltip_text = "%s (%d)" % [terrain.name, terrain.id]
-
- color_style_list = color_panel.get_theme_stylebox("panel").duplicate()
- color_style_grid = color_panel.get_theme_stylebox("panel").duplicate()
- color_style_decoration = color_panel.get_theme_stylebox("panel").duplicate()
-
- color_style_list.bg_color = terrain.color
- color_style_list.corner_radius_top_left = 8
- color_style_list.corner_radius_bottom_left = 8
- color_style_list.corner_radius_top_right = 0
- color_style_list.corner_radius_bottom_right = 0
- color_style_list.content_margin_left = -1
- color_style_list.content_margin_right = -1
- color_style_list.border_width_left = 0
- color_style_list.border_width_right = 0
- color_style_list.border_width_top = 0
- color_style_list.border_width_bottom = 0
-
- color_style_grid.bg_color = terrain.color
- color_style_grid.corner_radius_top_left = 6
- color_style_grid.corner_radius_bottom_left = 6
- color_style_grid.corner_radius_top_right = 6
- color_style_grid.corner_radius_bottom_right = 6
- color_style_grid.content_margin_left = -1
- color_style_grid.content_margin_right = -1
- color_style_grid.border_width_left = 0
- color_style_grid.border_width_right = 0
- color_style_grid.border_width_top = 0
- color_style_grid.border_width_bottom = 0
-
- color_style_decoration.bg_color = terrain.color
- color_style_decoration.corner_radius_top_left = 8
- color_style_decoration.corner_radius_bottom_left = 8
- color_style_decoration.corner_radius_top_right = 8
- color_style_decoration.corner_radius_bottom_right = 8
- color_style_decoration.content_margin_left = -1
- color_style_decoration.content_margin_right = -1
- color_style_decoration.border_width_left = 4
- color_style_decoration.border_width_right = 4
- color_style_decoration.border_width_top = 4
- color_style_decoration.border_width_bottom = 4
-
- match terrain.type:
- BetterTerrain.TerrainType.MATCH_TILES:
- type_icon_slot.texture = load("res://addons/better-terrain/icons/MatchTiles.svg")
- BetterTerrain.TerrainType.MATCH_VERTICES:
- type_icon_slot.texture = load("res://addons/better-terrain/icons/MatchVertices.svg")
- BetterTerrain.TerrainType.CATEGORY:
- type_icon_slot.texture = load("res://addons/better-terrain/icons/NonModifying.svg")
- BetterTerrain.TerrainType.DECORATION:
- type_icon_slot.texture = load("res://addons/better-terrain/icons/Decoration.svg")
-
- var has_icon = false
- if terrain.has("icon"):
- if terrain.icon.has("path") and not terrain.icon.path.is_empty():
- terrain_icon_slot.texture = load(terrain.icon.path)
- _terrain_texture = null
- terrain_icon_slot.queue_redraw()
- has_icon = true
- elif terrain.icon.has("source_id") and tileset.has_source(terrain.icon.source_id):
- var source := tileset.get_source(terrain.icon.source_id) as TileSetAtlasSource
- var coord := terrain.icon.coord as Vector2i
- var rect := source.get_tile_texture_region(coord, 0)
- _terrain_texture = source.texture
- _terrain_texture_rect = rect
- terrain_icon_slot.queue_redraw()
- has_icon = true
-
- if not has_icon:
- var tiles = BetterTerrain.get_tile_sources_in_terrain(tileset, get_index())
- if tiles.size() > 0:
- var source := tiles[0].source as TileSetAtlasSource
- var coord := tiles[0].coord as Vector2i
- var rect := source.get_tile_texture_region(coord, 0)
- _terrain_texture = source.texture
- _terrain_texture_rect = rect
- terrain_icon_slot.queue_redraw()
-
- if _terrain_texture:
- terrain_icon_slot.texture = null
-
- if not _icon_draw_connected:
- terrain_icon_slot.connect("draw", func():
- if _terrain_texture:
- terrain_icon_slot.draw_texture_rect_region(_terrain_texture, Rect2i(0,0, 44, 44), _terrain_texture_rect)
- )
- _icon_draw_connected = true
-
- update_style()
- func update_style():
- if terrain.type == BetterTerrain.TerrainType.DECORATION:
- type_icon_panel.visible = false
- color_panel.custom_minimum_size = Vector2i(52,52)
- else:
- type_icon_panel.visible = true
- color_panel.custom_minimum_size = Vector2i(24,24)
-
- if grid_mode:
- if terrain.type == BetterTerrain.TerrainType.DECORATION:
- color_panel.add_theme_stylebox_override("panel", color_style_decoration)
- color_panel.size_flags_vertical = Control.SIZE_FILL
- icon_layout_container.size_flags_vertical = Control.SIZE_EXPAND_FILL
- else:
- color_panel.add_theme_stylebox_override("panel", color_style_grid)
- color_panel.size_flags_vertical = Control.SIZE_SHRINK_BEGIN
- icon_layout_container.size_flags_vertical = Control.SIZE_FILL
- custom_minimum_size = Vector2(0, 60)
- size_flags_horizontal = Control.SIZE_FILL
- layout_container.vertical = true
- name_label.visible = false
- icon_layout_container.add_theme_constant_override("separation", -24)
- else:
- if terrain.type == BetterTerrain.TerrainType.DECORATION:
- color_panel.add_theme_stylebox_override("panel", color_style_decoration)
- else:
- color_panel.add_theme_stylebox_override("panel", color_style_list)
- icon_layout_container.size_flags_vertical = Control.SIZE_FILL
- custom_minimum_size = Vector2(2000, 60)
- size_flags_horizontal = Control.SIZE_EXPAND_FILL
- layout_container.vertical = false
- name_label.visible = true
- color_panel.size_flags_vertical = Control.SIZE_FILL
- icon_layout_container.add_theme_constant_override("separation", 4)
- func set_selected(value:bool = true):
- selected = value
- if value:
- select.emit(get_index())
- queue_redraw()
- func _draw():
- if selected:
- draw_rect(Rect2(Vector2.ZERO, get_rect().size), Color(0.15, 0.70, 1, 0.3))
- func _on_focus_entered():
- queue_redraw()
- selected = true
- select.emit(get_index())
- func _on_focus_exited():
- queue_redraw()
|