Files
Kalulu/sources/utils/dynamic_font_size_label.gd
T
Adrien Ufferte 59e66efdb3 Clean warnings
2025-07-02 09:32:24 +02:00

57 lines
1.5 KiB
GDScript

extends Label
class_name DynamicFontSizeLabel
@export var autosize_on: bool = true
@export var font_size_override: int = -1
@export var font_size_min: int = 8
@export var font_size_max: int = 100
@export var font_size_width_percent: float = 0.9
var _current_font_size: int
var _default_font_size: int
func _ready() -> void:
resized.connect(_on_resized)
_initialize_default_font_size()
_update_font_size()
func _initialize_default_font_size() -> void:
_default_font_size = get_theme_font_size("font_size")
func _on_resized() -> void:
_update_font_size()
func _update_font_size() -> void:
if not autosize_on:
return
if font_size_override >= 0:
_current_font_size = font_size_override
else:
_current_font_size = _calculate_best_font_size()
add_theme_font_size_override("font_size", _current_font_size)
# Recherche binaire de la taille de police optimale
func _calculate_best_font_size() -> int:
var available_width: float = size.x * font_size_width_percent
var available_height: float = size.y
var font: Font = get_theme_font("font")
var low: int = font_size_min
var high: int = font_size_max
var best_size: int = low
while low <= high:
var mid: int = int((low + high) / 2.0)
var text_size: Vector2 = font.get_string_size(text, HORIZONTAL_ALIGNMENT_LEFT, -1, mid)
# Si le texte rentre, on essaie de l'augmenter
if text_size.x <= available_width and text_size.y <= available_height:
best_size = mid
low = mid + 1 # On essaie une taille plus grande
else:
high = mid - 1 # On essaie une taille plus petite
return best_size