ChessBuilder/Systems/CardDisplay.gd

97 lines
No EOL
2.7 KiB
GDScript

extends Control
class_name CardDisplay
var card_displays = []
var selected_card = null
const CARD_WIDTH = 150
const CARD_HEIGHT = 250
const CARD_MARGIN = 10
@onready var container: HBoxContainer
func _ready():
container = HBoxContainer.new()
container.name = "Hand"
container.set_position(Vector2(10, 500))
add_child(container)
func update_hand(hand: Array):
clear_cards()
print("update_hand")
for card in hand:
print(card.id)
add_card_display(card)
func add_card_display(card):
var card_panel = PanelContainer.new()
card_panel.custom_minimum_size = Vector2(CARD_WIDTH, CARD_HEIGHT)
var vbox = VBoxContainer.new()
vbox.set_meta("card_id", card.id)
card_panel.add_child(vbox)
var name_label = Label.new()
name_label.text = card.card_name
name_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
vbox.add_child(name_label)
var rank_label = Label.new()
rank_label.text = "Rank " + str(card.rank)
rank_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
vbox.add_child(rank_label)
var desc_label = Label.new()
desc_label.text = card.description
desc_label.autowrap_mode = TextServer.AUTOWRAP_WORD
desc_label.custom_minimum_size = Vector2(CARD_WIDTH - 10, 0)
vbox.add_child(desc_label)
var id_label = Label.new()
id_label.text = card.id
id_label.autowrap_mode = true
id_label.custom_minimum_size = Vector2(CARD_WIDTH - 10, 0)
vbox.add_child(id_label)
card_panel.gui_input.connect(func(event): _on_card_clicked(event, card))
card_displays.append(card_panel)
container.add_child(card_panel)
func _on_card_clicked(event: InputEvent, card: Card):
if event is InputEventMouseButton and event.pressed:
if selected_card == null || selected_card.id != card.id:
selected_card = card
container.emit_signal("card_pressed", card)
elif selected_card.id == card.id:
selected_card = null
highlight_selected_card(selected_card)
# selected_card = card
# highlight_selected_card(card)
# container.emit_signal("card_pressed", card)
func highlight_selected_card(selected: Card) -> void:
for display in card_displays:
var style = StyleBoxFlat.new()
style.bg_color = Color(0.2, 0.2, 0.2, 1) # Default color
var vbox = display.get_child(0)
if selected && vbox.get_meta("card_id") == selected.id:
style.bg_color = Color(0.4, 0.6, 0.4, 1) # Selected color
display.add_theme_stylebox_override("panel", style)
func get_card_by_uuid(uuid: String) -> Card:
for display in card_displays:
var vbox = display.get_child(0)
if vbox.get_meta("card_id") == uuid:
return selected_card
return null
func get_selected_card() -> Card:
return selected_card
func clear_cards():
for display in card_displays:
display.queue_free()
card_displays.clear()
selected_card = null