extends TextureButton @onready var label: Label = $CenterContainer/Label # Adjust path to your Label node var unlock_id = "" # Store the unlock ID func _ready(): label.visible = false # Hide label initially adjust_label_font_size() # Connect the pressed signal pressed.connect(_on_button_pressed) func setup(unlock_data): Log.pr("Setting up button for unlock:", unlock_data.unlock_name) unlock_id = unlock_data.unlock_id # Store the ID if label: label.visible = false label.text = unlock_data.unlock_name + " " + str(unlock_data.get_next_rank()) label.text = label.text + " - " + Global.currency_symbol + str(unlock_data.get_next_cost()) label.text = label.text + "\n" + unlock_data.get_next_modifiers_string() #self.disabled = unlock_data.is_unlocked adjust_label_font_size() else: Log.pr("Warning: Label node not found in button.") func _on_button_pressed(): Log.pr("Button pressed, unlocking item:", unlock_id) Unlocks.unlock_item(unlock_id) func adjust_label_font_size(): if not label: return var available_width = size.x - 10 var available_height = size.y - 10 # Start with a reasonable font size var font_size = 32 var min_font_size = 8 # Get or create a font var font = label.get_theme_font("font") # Binary search for the optimal font size while font_size > min_font_size: label.add_theme_font_size_override("font_size", font_size) # Force update and get the actual text size await get_tree().process_frame var text_size = font.get_string_size(label.text, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size) # Check if it fits if text_size.x <= available_width and text_size.y <= available_height: break # Reduce font size and try again font_size -= 1 label.add_theme_font_size_override("font_size", font_size) label.visible = true # Show label after resizing is complete # Call this function whenever you change the label text func set_label_text(new_text: String): if label: label.visible = false # Hide while resizing label.text = new_text adjust_label_font_size()