83 lines
2.0 KiB
GDScript
83 lines
2.0 KiB
GDScript
@tool
|
|
class_name IconsFontsRender
|
|
extends RichTextLabel
|
|
|
|
@export_enum("MaterialIcons", "Emojis")
|
|
var icon_font := "MaterialIcons"
|
|
|
|
@export var start_size := 1065
|
|
@export var size_slider: Slider
|
|
@export var search_line_edit : LineEdit
|
|
|
|
func set_icons_size(value:int):
|
|
IconsFonts.preview_size = value
|
|
set("theme_override_font_sizes/normal_font_size", value)
|
|
|
|
func get_font_data() -> Dictionary:
|
|
var data := {}
|
|
match icon_font:
|
|
"MaterialIcons": data = IconsFonts.material_icons
|
|
"Emojis": data = IconsFonts.emojis
|
|
_: text = "Unsupported IconsFont %s" % icon_font
|
|
|
|
return data
|
|
|
|
func get_icon(key:String) -> String:
|
|
match icon_font:
|
|
"MaterialIcons": return IconsFonts.get_icon_char("MaterialIcons", key)
|
|
"Emojis": return str(IconsFonts.emojis[key])
|
|
|
|
return ""
|
|
|
|
func _ready() -> void:
|
|
visibility_changed.connect(_on_visibility_changed)
|
|
|
|
func _on_visibility_changed():
|
|
if visible:
|
|
set_icons_size(IconsFonts.preview_size)
|
|
update_table(search_line_edit.text)
|
|
|
|
func setup():
|
|
set_meta_underline(false)
|
|
set_icons_size(IconsFonts.preview_size)
|
|
|
|
func update_table(filter := ""):
|
|
var table = "[table={columns}, {inline_align}]"
|
|
var columns := int(size.x / IconsFonts.preview_size) + 1
|
|
if columns <= 10:
|
|
# size.x on start gives me 8 and slider.value is 16, so columns equals 1
|
|
# so I add new fallback var start_size = 1056,
|
|
# which is size.x after when it works
|
|
columns = int(start_size / IconsFonts.preview_size) + 1
|
|
|
|
table = table.format({
|
|
"columns": columns,
|
|
"inline_align": INLINE_ALIGNMENT_CENTER
|
|
})
|
|
|
|
var data := get_font_data()
|
|
if !data: return
|
|
|
|
var cells := columns
|
|
for key: String in data:
|
|
if filter and filter.to_lower() not in key: continue
|
|
cells -= 1
|
|
if cells <= 0: cells = columns
|
|
var link := "[url={link}]{icon}[/url]"
|
|
var icon := get_icon(key)
|
|
link = link.format({"link": key, "icon": icon})
|
|
|
|
var cell := "[cell]{link}[/cell]"
|
|
table += cell.format({"link": link})
|
|
|
|
cells = abs(cells)
|
|
while cells > columns:
|
|
cells -= 1
|
|
|
|
if cells > 0:
|
|
for c in cells:
|
|
table += "[cell] [/cell]"
|
|
|
|
table += "[/table]"
|
|
parse_bbcode(table)
|