Este artículo detalla el desarrollo de un motor de interfaz de usuario (UI) personalizado en Python utilizando PyGame, creado por Mohammed Nasr para facilitar la experimentación rápida con interfaces interactivas. El objetivo principal era crear una capa de UI transparente que no impactara negativamente el rendimiento del renderizado gráfico y que permitiera una iteración rápida gracias a la flexibilidad de Python. Desde cero: Arquitectura inicial. La primera versión se basó en una arquitectura simple: una lista plana de componentes. Cada frame, el motor realizaba un 'hit-test' (detección de clics), una actualización global de los componentes y un renderizado individual. Aunque sencilla de implementar, esta estructura era poco práctica para UIs complejas. La familia: Estructura en árbol. Para mejorar la escalabilidad, se adoptó una estructura en árbol, inspirada en motores de UI como Flutter y Jetpack Compose. Cada nodo es o bien un nodo de diseño (layout) o un nodo de contenido, evitando la complejidad de los nodos híbridos. Los nodos de diseño implementan measure() (para calcular el tamaño) y distribute() (para asignar posición y tamaño). Este enfoque permite que el tamaño y la posición de los componentes se calculen recursivamente, propagando información desde los nodos hoja hasta la raíz del árbol. Refinamiento del motor: El desarrollo continuó con la adición de características clave. Se implementó soporte para threading para evitar bloqueos de la interfaz durante operaciones asíncronas, un sistema de listeners de eventos para manejar eventos más allá de los clics del ratón, optimizaciones de rendimiento mediante el uso de 'dirty flags' (indicadores de que un componente necesita ser redibujado) y un sistema de 'UI Stages' para la navegación entre diferentes pantallas o secciones de la interfaz. Más allá de lo básico: El autor identifica áreas de mejora futuras, incluyendo la adopción de una API declarativa (donde la UI se define como una descripción del estado deseado, en lugar de una serie de instrucciones), mayor composabilidad (permitiendo la creación de interfaces a partir de pequeños componentes reutilizables) y un sistema de estilos personalizables. El motor actual es adecuado para prototipos rápidos, pero la evolución futura apunta a una mayor flexibilidad, mantenibilidad y rendimiento, inspirándose en arquitecturas de UI modernas.
