@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)