        |
sdlui: Widget toolkit para C usando SDL2 y con sintaxis similar a la de tcl/tk
Introducción
sdlui es un widget toolkit para C usando SDL2 y con sintaxis similar a la de tcl/tk.
El objetivo es una librería que permita crear un UI moderno y atractivo en unas pocas líneas.
Está pensado para usarse junto a la libbg para procesamiento de datos y acceso a disco en segundo plano. Esto es porque la thread principal no debe realizar operaciones que gasten más que unos pocos milisegundos, ya que el bucle principal debe ejecutar un ciclo cada 17ms para que la librería pueda hacer animaciones suaves a 60fps.
Como características principales, tiene:
- Layers: funcionan aproximadamente como los fragments de Android, aunque también se pueden usar para crear ventanas flotantes.
- Transiciones: cuando se cambia la pantalla que se muestra, se puede hacer que entren o salgan como si fueran "paneles", o que haga un fadein/fadeout.
- (TODO) Escalado: poniendo un "*" como prefijo de un número, multiplicará ese número por la escala establecida al UI en el momento de hacer los cálculos de tamaño de esos elementos y el pintado de los mismos (sólo en los número puestos en el sdlui_add() o sdlui_configure, p.ej. "-fontsize *22").
- (TODO) Temas: permite poner los colores en variables (configuraciones del tipo "%s%i"), de manera que se puedan cambiar en tiempo real. También se pueden meter como una alias (para usar con "$nombrealias").
- Widgets definidos por el usuario: los widgets por defecto (label, frame e image) son widgets definidos usando el mismo API que disponen los usuarios para definir nuevos widgets.
- Widgets compuestos: Se puede hacer nuevos widgets simplemente componiendo los widgets existentes, opcionalmente haciendo uso de las funciones sdlui_draw_XXXX() para poner bordes, fondos redondeados, etc. Así es como se definen los widgets de "input", "button", "tableheader", "tableelement", etc.
- Aliases: Se pueden definir alias para poder llegar a las partes interesantes de una layer. Esto es para poder poner cada layer en un .c/.h independiente y hacer un API de mostrar/usar/configurar/quitar ese layer.
- Userptr: Tantos userptr como se quieran a través del API sdlui_userdata_XXXX(), ya que estos tienen una cadena que los identifica. Esto es para la implementación de las pantallas de la aplicación usando layers.
- Configuraciones: Cuando se crea un elemento o se reconfigura, se le dan una serie de opciones, con la posibilidad de usar opciones por defecto, opciones de los ancestros (con upvars del estilo de "^nombreconfancestro" o "^1^nombreconfpadre" o "^2^nombreconfabuelo"), o coger la opción de un "alias".
- Valores condicionales: Se puede poner un valor condicional tipo existe-y-not-false/false o bien con una comparación, ejemplos "-foreground {^foreground?^foreground:#333333}" "-background {^current==2:#303030:#ffffff}"
- Concepto de "focus": se mantiene una variable con el elemento que tiene el "focus", para poder enviarle la entrada de texto, así como usar esa información para el pintado del elemento y la navegación entre elementos con la tecla TAB. Los elementos que tienen definida la propiedad click ("-click accion") se consideran focusables. Al definir una propiedad se puede poner que se valor dependa de si tiene foco usando un condicional, como en "-foreground {^focus?^focusforeground:^disabledforeground}" (significa: si uno de sus padres tiene foco, poner como foreground el contenido de la propiedad focusforeground del padre más cercano; si no, hacer lo mismo pero con la propiedad disabledforeground).
- Interactividad "de serie" en widgets compuestos Se peude hacer que al hacer click en un widget compuesto se cambie un valor de un upvar: "-click ::set::^seleccion=1"
- assets: realmente se refiere a imágenes, y existe un API que hace trivial el trabajar con ellas. Además, dichas imágenes se encuentran en formato raw rgba, con lo que es sencillo manipularlas.
- fonts: se pueden cargar fuentes ttf desde archivo o bien tenerlas embebidas en el propio ejecutable. Se les da un nombre para poder referenciarlas en las configuraciones de los widgets.
- variables: se pueden registrar variables de tipo cadena, de manera que los widgets puedan manipularlas (p.ej. para poner el valor de un inputbox, o el estado de un scrollbar), y se puede solicitar que se informe de que cambian con un sdlui_onwrite(), ya que cada vez que alguien la cambie llamará a sdlui_variable_setdirty() para que repinte los widgets que dependen de dicha variable y llame a los callbacks de onwrite de dicha variable.
- trazas gráficas: funciones para pintar trazas por encima de todo el UI: sdlui_debug_XXXX(), aunque también se puede usar para resaltar elementos en el momento de hover, o también cuando se usan paneles dockables para marcar la barra roja de la drop-zone de panel cuando se hace drag&drop de un panel.
Conceptos
widgetinstance
Es una instancia de un widget.
Se estructuran en un árbol, y el widgetinstance tiene como nombre el path completo, usando el punto como separador, al igual que se hace en tcl/tk. Por ejemplo:
.cuerpo.menuopciones.identificacion.imagen
widgetclass
Básicamente es una función que dice el tamaño de ese tipo de widget según su contenido y es capaz de "pintarlo" a un SDL_Surface.
Para hacer su cometido usa sdlui_widgetdata(), que le da acceso a la información sobre la instancia que tiene que pintar, y sdlui_conf_getlitorvar(), que obtiene el valor de una configuración (p.ej. "text") para saber qué tiene que pintar y cómo hacerlo.
|