50 lines
1.4 KiB
GDScript
50 lines
1.4 KiB
GDScript
class_name DynamicFontSizeLabel
|
|
extends Label
|
|
|
|
@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
|
|
|
|
|
|
func _ready() -> void:
|
|
resized.connect(_on_resized)
|
|
_update_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
|