first commit
This commit is contained in:
96
godot_client/scripts/character/character_card.gd
Normal file
96
godot_client/scripts/character/character_card.gd
Normal file
@@ -0,0 +1,96 @@
|
||||
extends PanelContainer
|
||||
class_name CharacterCard
|
||||
## Character Card Component
|
||||
##
|
||||
## Displays a single character's summary information with select/delete actions.
|
||||
|
||||
#region Signals
|
||||
signal selected(character_id: String)
|
||||
signal delete_requested(character_id: String)
|
||||
#endregion
|
||||
|
||||
#region Node References
|
||||
@onready var name_label: Label = $MarginContainer/HBoxContainer/InfoVBox/NameLabel
|
||||
@onready var class_label: Label = $MarginContainer/HBoxContainer/InfoVBox/ClassLabel
|
||||
@onready var level_label: Label = $MarginContainer/HBoxContainer/InfoVBox/LevelLabel
|
||||
@onready var gold_label: Label = $MarginContainer/HBoxContainer/InfoVBox/GoldLabel
|
||||
@onready var location_label: Label = $MarginContainer/HBoxContainer/InfoVBox/LocationLabel
|
||||
@onready var select_button: Button = $MarginContainer/HBoxContainer/ActionVBox/SelectButton
|
||||
@onready var delete_button: Button = $MarginContainer/HBoxContainer/ActionVBox/DeleteButton
|
||||
#endregion
|
||||
|
||||
#region Private Variables
|
||||
var _character_id: String = ""
|
||||
var _character_data: Dictionary = {}
|
||||
var _pending_data: Dictionary = {} # Store data if set before _ready
|
||||
#endregion
|
||||
|
||||
#region Lifecycle
|
||||
func _ready() -> void:
|
||||
#_apply_style()
|
||||
select_button.pressed.connect(_on_select_pressed)
|
||||
delete_button.pressed.connect(_on_delete_pressed)
|
||||
|
||||
# Apply pending data if set before _ready
|
||||
if not _pending_data.is_empty():
|
||||
_apply_character_data(_pending_data)
|
||||
_pending_data = {}
|
||||
#endregion
|
||||
|
||||
#region Public Methods
|
||||
func set_character_data(data: Dictionary) -> void:
|
||||
"""Set character data and update display."""
|
||||
if not is_node_ready():
|
||||
# Store for later if called before _ready
|
||||
_pending_data = data
|
||||
return
|
||||
|
||||
_apply_character_data(data)
|
||||
|
||||
|
||||
func _apply_character_data(data: Dictionary) -> void:
|
||||
"""Actually apply the character data to UI elements."""
|
||||
_character_data = data
|
||||
_character_id = data.get("character_id", "")
|
||||
|
||||
name_label.text = data.get("name", "Unknown")
|
||||
class_label.text = data.get("class_name", "Unknown Class")
|
||||
level_label.text = "Level %d" % data.get("level", 1)
|
||||
gold_label.text = "%d Gold" % data.get("gold", 0)
|
||||
location_label.text = _format_location(data.get("current_location", ""))
|
||||
|
||||
|
||||
func get_character_id() -> String:
|
||||
return _character_id
|
||||
#endregion
|
||||
|
||||
#region Private Methods
|
||||
#func _apply_style() -> void:
|
||||
#"""Apply card styling."""
|
||||
#var style = StyleBoxFlat.new()
|
||||
#style.bg_color = ThemeColors.BACKGROUND_CARD
|
||||
#style.border_width_all = 1
|
||||
#style.border_color = ThemeColors.BORDER_DEFAULT
|
||||
#style.corner_radius_all = 8
|
||||
#style.content_margin_left = 0
|
||||
#style.content_margin_right = 0
|
||||
#style.content_margin_top = 0
|
||||
#style.content_margin_bottom = 0
|
||||
#add_theme_stylebox_override("panel", style)
|
||||
|
||||
|
||||
func _format_location(location_id: String) -> String:
|
||||
"""Convert location_id to display name."""
|
||||
if location_id.is_empty():
|
||||
return "Unknown"
|
||||
return location_id.replace("_", " ").capitalize()
|
||||
#endregion
|
||||
|
||||
#region Signal Handlers
|
||||
func _on_select_pressed() -> void:
|
||||
selected.emit(_character_id)
|
||||
|
||||
|
||||
func _on_delete_pressed() -> void:
|
||||
delete_requested.emit(_character_id)
|
||||
#endregion
|
||||
Reference in New Issue
Block a user