ChessBuilder/Systems/CardDisplay.gd

98 lines
No EOL
3.1 KiB
GDScript

class_name CardDisplay extends Control
const CARD_WIDTH = 150
const CARD_HEIGHT = 250
const CARD_MARGIN = 10
var cardDisplays = []
var selectedCard = null
var container: HBoxContainer
func _ready():
# Create the container first
container = HBoxContainer.new()
container.name = "Hand"
container.position = Vector2(10, 500)
add_child(container)
func update_hand(hand: Array):
clear_cards()
for card in hand:
add_card_display(card)
func add_card_display(card):
var cardPanel = PanelContainer.new()
cardPanel.custom_minimum_size = Vector2(CARD_WIDTH, CARD_HEIGHT)
var vbox = VBoxContainer.new()
vbox.set_meta("card_id", card.id)
cardPanel.add_child(vbox)
var nameLabel = Label.new()
nameLabel.text = card.cardName
nameLabel.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
vbox.add_child(nameLabel)
var rankLabel = Label.new()
rankLabel.text = "Rank " + str(card.rank)
rankLabel.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
vbox.add_child(rankLabel)
var descLabel = Label.new()
descLabel.text = card.description
descLabel.autowrap_mode = TextServer.AUTOWRAP_WORD
descLabel.custom_minimum_size = Vector2(CARD_WIDTH - 10, 0)
vbox.add_child(descLabel)
var unitWhitelistLabel = Label.new()
unitWhitelistLabel.text = ", ".join(card.unitWhitelist)
unitWhitelistLabel.autowrap_mode = TextServer.AUTOWRAP_WORD
unitWhitelistLabel.custom_minimum_size = Vector2(CARD_WIDTH - 10, 0)
vbox.add_child(unitWhitelistLabel)
var idLabel = Label.new()
idLabel.text = card.id.substr(card.id.length() - 8, -1)
idLabel.autowrap_mode = true
idLabel.custom_minimum_size = Vector2(CARD_WIDTH - 10, 0)
vbox.add_child(idLabel)
cardPanel.gui_input.connect(func(event): _on_card_clicked(event, card))
cardDisplays.append(cardPanel)
container.add_child(cardPanel)
func _on_card_clicked(event: InputEvent, card: Card):
if event is InputEventMouseButton and event.pressed:
if selectedCard == null || selectedCard.id != card.id:
selectedCard = card
container.emit_signal("card_pressed", card)
elif selectedCard.id == card.id:
selectedCard = null
highlight_selectedCard(selectedCard)
func highlight_selectedCard(selected: Card) -> void:
for display in cardDisplays:
var style = StyleBoxFlat.new()
style.bg_color = Utils.DARK_CELL # 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 cardDisplays:
var vbox = display.get_child(0)
if vbox.get_meta("card_id") == uuid:
return selectedCard
return null
func getSelectedCard() -> Card:
return selectedCard
func clear_cards():
for display in cardDisplays:
display.queue_free()
cardDisplays.clear()
selectedCard = null