A continuación encontrarás traducido al castellano el artículo escrito por Gabriel Ludosanu y publicado originalmente en el Blog oficial de Xojo.
Mientras que estaba trabajando en uno de mis proyectos necesitaba encontrar una forma rápida de cambiar la fuente utilizada por los controles en toda la aplicación.
Acceder a cada una de las ventanas y actualizar cada uno de sus controles individualmente funciona, pero es realmente tedioso; especialmente cuando se trata de probar varias fuentes o bien añadir nuevos elementos de interfaz de usuario. Por tanto, cree un pequeño módulo que aplica una fuente a todos los controles soportados en una DesktopWindow, incluyendo los controles que se encuentran ubicados en instancias de DesktopContainer.
Module AppWideFont
Public Sub SetFont(Extends window As DesktopWindow, fontName As String)
ApplyFontTo(window.Controls, fontName)
End Sub
Protected Function GetMonospaceFont() As String
#If TargetWindows
Return "Cascadia Mono"
#ElseIf TargetMacOS
Return "Menlo"
#ElseIf TargetLinux
Return "DejaVu Sans Mono"
#Else
Return "Courier New"
#EndIf
End Function
Private Sub ApplyFontTo(controls As Iterable, fontName As String)
For Each c As Object In controls
If c IsA DesktopContainer Then
ApplyFontTo(DesktopContainer(c).Controls, fontName)
End If
Select Case c
Case IsA DesktopLabel
DesktopLabel(c).FontName = fontName
Case IsA DesktopTextField
DesktopTextField(c).FontName = fontName
Case IsA DesktopTextArea
DesktopTextArea(c).FontName = fontName
Case IsA DesktopListBox
DesktopListBox(c).FontName = fontName
Case IsA DesktopButton
DesktopButton(c).FontName = fontName
Case IsA DesktopCheckBox
DesktopCheckBox(c).FontName = fontName
Case IsA DesktopRadioButton
DesktopRadioButton(c).FontName = fontName
Case IsA DesktopPopupMenu
DesktopPopupMenu(c).FontName = fontName
End Select
Next
End Sub
End Module
El método SetFont es una extensión de método de modo que se puede llamar directamente desde cualquier DesktopWindow.
Por ejemplo, en el evento Opening de una ventana:
Self.SetFont("Arial")
O si quiero utilizar una fuente monoespaciada:
Self.SetFont(AppWideFont.GetMonospaceFont)
La función GetMonospaceFont es un utilitario que devuelve una fuente monoespaciada adecuada para Windows, macOS o Linux.
El módulo utiliza la colección de controles disponible en una ventana (vía Controls) y comprueba de forma recursiva cualquier control DesktopContainer que pueda contener, de esta forma sólo necesito utilizar una línea de código por ventana. Actualmente puede detectar etiquetas, cambios de texto, áreas de texto, listados, botones, cajas de verificación, botones de radio y menús desplegables.
Si añadiese otro tipo de control más tarde podré ampliar el bloque Select Case con otra comprobación.
Esto me ha ahorrado cambiar de forma constante los ajustes de fuente a lo largo del proyecto y me ha proporcionado una ubicación centralizada para manejar la tipografía de los controles de la aplicación.