ImRAD - Constructor de GUI para la biblioteca ImGui
(github.com/tpecholt)- ImRAD es un constructor de GUI para ImGui que genera código C++ utilizable directamente en la aplicación y luego lo vuelve a analizar para poder seguir modificando la UI generada
- Soporta enlace de datos, eventos y la adición manual de código de UI, y el código generado se separa con marcadores de comentarios para que el usuario pueda insertar código sin dejar de usar el diseñador
- Se ejecuta en Windows, Linux y MacOS, y el código generado funciona en Windows, Linux, MacOS y Android
- El layout usa box layout y
SameLine,Spacing,NextColumnen lugar de posiciones absolutas, y mantiene las relaciones padre-hijo y el orden entre widgets - El código fuente de ImRAD está bajo GPL, pero el código generado por la herramienta y
imrad.h, que usa el código generado, están excluidos de GPL, por lo que pueden incluirse en proyectos open source o comerciales
El rol de ImRAD y cómo genera código
- ImRAD es un constructor de GUI para la biblioteca ImGui
- Genera y analiza código C++ que puede usarse directamente en la aplicación
- A diferencia de otras herramientas, soporta un flujo donde la UI generada puede seguir modificándose
-
Enlace de datos
- Eventos
- Adición manual de código de UI
- El código generado se guarda en archivos
.hy.cpp, y puede revisarse rápidamente con la vista previa de código
-
Plataformas compatibles y tipos de ventana
- ImRAD en sí se ejecuta en Windows, Linux y MacOS
- El código generado se ejecuta en Windows, Linux, MacOS y Android
- Soporta el diseño de varios tipos de ventana
- Ventanas flotantes, popups y popups modales
MainWindow, incluida la integración con GLFW- ImRAD genera llamadas de GLFW para sincronizar la barra de título, las banderas de redimensionamiento, el autoajuste y otros elementos entre la ventana de ImGui y la ventana del sistema operativo
Activity- Ventana sin decoraciones que llena toda el área del viewport
- Solo puede mostrarse una activity a la vez
- Se usa principalmente en apps de Android
- También incluye plantillas
main.cppgeneral basado en GLFWMainActivity.java,AndroidManifest.xml,main.cpp,CMakeLists.txtpara Android
Widgets y funciones de layout
- Soporta una amplia variedad de widgets de ImGui
- Widgets básicos como
Text,Checkbox,Combo,Button,Slider,ColorEdit - Widgets contenedores como
Child,Table,CollapsingHeader,TreeNode,TabBar - Widgets como
Splitter,DockSpace - Edición de
MenuBary menús contextuales CustomWidgetpara llamar código de widgets externos
- Widgets básicos como
- El layout se genera usando
SameLine,Spacing,NextColumnen lugar de posiciones absolutas- Esto hace que los widgets respeten de forma consistente el item spacing y el frame padding
- Las relaciones padre-hijo y el orden de los hijos, importantes en widgets contenedores como
Table, quedan claros - También permite una ubicación alternativa que mantiene la distancia relativa desde la esquina del padre seleccionada, útil para widgets superpuestos
- Soporta box layout
- Es un mecanismo de layout implementado sobre las funciones de ImGui
- Permite estirar widgets redimensionables en horizontal o vertical
- Se pueden insertar spacers para crear alineación
- También puede usarse Table Layout Helper, que genera layouts horizontales usando
Tableinvisibles
Enlaces, eventos y código del usuario
- Como ImGui es una biblioteca GUI de modo inmediato, el estado de widgets como textos de entrada o elementos de combobox debe configurarse dentro del código generado al momento de dibujar, y ImRAD lo maneja mediante enlace de propiedades
- Las variables de clase pueden gestionarse con un sencillo class wizard o con el cuadro de diálogo de enlaces
- El uso de enlace de propiedades permite que la UI generada siga siendo diseñable mientras se comporta de forma dinámica
- Soporta la generación de manejadores de eventos y código auxiliar
- Por ejemplo, un diálogo modal genera automáticamente una función miembro
OpenPopupcon un callback lambda que se llama al cerrarse - Los manejadores de eventos separan el código de manejo de eventos del usuario de la parte generada para que el diseñador siga funcionando
- Por ejemplo, un diálogo modal genera automáticamente una función miembro
- El código generado se separa con marcadores de comentarios
- El usuario puede agregar código adicional alrededor del código generado
- Esto puede usarse para llamadas a popups que dependen del draw o para ciertos cálculos de variables
- También puede delegarse mediante
CustomWidgeta callbacks del usuario
Configuración, estilo y variantes en tiempo de ejecución
- Window configuration es una variante de UI que puede activarse en tiempo de ejecución
- Resulta útil para distintas plataformas o rotación de pantalla, entre otros casos
- Los estilos son configuraciones que agrupan colores, variables de estilo y fuentes
- Además del estilo predeterminado de ImGui, el usuario puede definir estilos nuevos
- Los estilos pueden guardarse como archivos INI bajo la carpeta
style
- Las dialog units pueden configurarse como píxeles independientes del dispositivo
- Esto es útil para Android y para apps con reconocimiento de DPI
- ImRAD rastrea los cambios en los archivos abiertos
- Mientras se diseña en ImRAD, el usuario también puede editar los mismos archivos en el IDE que prefiera
- Los cambios de estilo INI también se reflejan de inmediato
Dependencias y opciones del código generado
- El código generado puede usarse directamente en un proyecto y, por defecto, solo depende de la biblioteca ImGui y del header complementario
imrad.h - Actualmente
imrad.hincluye tanto la interfaz como la implementación- Para generar la implementación en
main.cpp, hay que definirIMRAD_H_IMPLEMENTATIONantes del include
- Para generar la implementación en
- El código generado usa la rutina de formateo
ImRad::Format- En C++20 delega por defecto a
std::format - Si se define
IMRAD_WITH_FMT, puede usarse la bibliotecafmt - Si no hay ninguno de los dos, usa una rutina de formateo simple que omite las banderas de formato
- En C++20 delega por defecto a
- Algunas funciones requieren dependencias adicionales y activación explícita
- El widget
MainWindowoImagenecesita bibliotecas extra como GLFW y STB - Se requiere definir
IMRAD_WITH_LOAD_TEXTURE
- El widget
imrad.hpuede usar la biblioteca zlib para cargar assets desde archivos zip- Esto se activa con
IMRAD_WITH_MINIZIP
- Esto se activa con
- Puede generar código con cadenas traducibles
- Si
imrad.hse compila conIMRAD_WITH_GETTEXT, puede traducirse con gettext/libintl - También puede usarse libintl-lite, que no tiene dependencias
- Si
Licencia y distribución
- El código fuente de ImRAD está bajo licencia GPL
- El código generado por la herramienta queda excluido de GPL
- Puede incluirse en proyectos open source o comerciales
- La licencia del código generado la decide el usuario
imrad.h, que usa el código generado, también está excluido de GPL- La versión más reciente se compila con CMake después de clonar el repositorio
- También hay que traer los submódulos del directorio
3rdparty
- También hay que traer los submódulos del directorio
- Las versiones algo más antiguas pueden descargarse desde Releases
- El tutorial y la documentación detallada pueden consultarse en la wiki
1 comentarios
Opiniones de Hacker News
Una de las partes más sorprendentes de este proyecto es que tiene un parser hecho a mano para leer el subconjunto de C++ que puede generar.
Todo está implementado en un solo header, y se ve impresionante y a la vez una locura.
https://github.com/tpecholt/imrad/blob/main/src/cpp_parser.h
No estoy muy familiarizado con la programación, así que solo entendí que este proyecto tiene algo capaz de leer datos.
Me gustaría que alguien explicara por qué es tan notable una herramienta capaz de leer C++.
Realmente genial. Puede que sea por la nostalgia de Visual Basic, pero para mí este proyecto es como la cereza del pastel de imgui.
Sería genial que estuviera como app HTML5 en wasm, para poder crear una GUI rápidamente en el navegador y copiar y pegar el resultado en el editor.
Dice que “genera y parsea código C++, y ese código puede usarse directamente en la aplicación”; me pregunto si lo de parsear es para volver a leer el código que él mismo genera.
Parece que sí es para leer el código que genera. El parser hecho a mano no maneja todo el lenguaje, solo un subconjunto.
Por ejemplo, tiene hardcodeado el reconocimiento de contenedores de STL, y probablemente solo maneja lo que puede aparecer en el código generado.
En esta etapa no crea un árbol de sintaxis abstracta (AST). Parece que hace tokenización y análisis léxico, y que quien lo llama tiene que entender cómo avanzar la “máquina de estados” de parsing.
La creación del AST y la generación de código parecen hacerse en este archivo de más de 9000 líneas: https://github.com/tpecholt/imrad/blob/main/src/node.cpp
Dice que “ImRAD se ejecuta en Windows, Linux y MacOS”.
Excelente. En los últimos años estuve creando apps en C++ con ImGui, y creo que esto me habría ahorrado mucho tiempo.
Si el creador de dear-imgui dijo que el nombre es “dear”, ¿no debería decir “for the Dear library”?
IMGUI significa GUI de modo inmediato, y ocornut dijo que se inspiró en otro IMGUI llamado “simgui”.
“Unos 15 meses después lo renombré a ‘dear imgui’, porque ‘imgui’ estaba acaparando toda la sigla. Sigo lamentando la confusión que esto ha causado hasta hoy”.
https://github.com/ocornut/imgui/issues/7892
El namespace también se llama ImGui, y definitivamente no es solo “Dear”.
Creo que no debería tener demasiado sudo metido ahí. Fuera de eso, se ve realmente genial.
Me pregunto si el código C++ generado también se puede usar desde algo como Python cuando se usan los bindings de pyimgui.
Me pregunto por qué un constructor de GUI para ImGui no está implementado con ImGui mismo.
Genial. Estoy haciendo un proyecto con ImGui y siempre pensaba que sería bueno tener algo así. Voy a probarlo.
Steam es un sistema multiplataforma popular; ¿podría usarse también para aplicaciones que no sean juegos? ¿Incluso para aplicaciones empresariales?
Cosas como varias líneas, tipografías y, según el caso, RTL; a ImGUI le falta en esas áreas.