go-widgets
Un único árbol de widgets, pintado por Go, en cada superficie a la que llega
Go. Una ventana nativa en X11, Wayland, macOS y Windows; un <canvas> en una
pestaña del navegador; un terminal; un APK de Android. Sin cadena de herramientas
de C, sin webview, sin conjunto de widgets del sistema: todos los módulos se
compilan con CGO_ENABLED=0, y cada píxel lo dibuja el toolkit.
w, err := window.Open(window.Config{Title: "Hello"})
if err != nil {
return err
}
defer w.Close()
box := toolkit.NewVBox()
box.Append(toolkit.NewLabel("Hello from go-widgets"))
box.Append(toolkit.NewButton("Click me", func() { /* ... */ }))
return w.Run(box) // an X11 or Wayland window, an NSWindow, a Win32 windowEso es
cmd/windowdemo,
abreviado. El mismo box dibujado en un navegador, un terminal o un PNG es el
mismo código con otra superficie debajo.
Por qué un solo toolkit lo dibuja todo
Un widget que recurre al botón propio de la plataforma es tan portable como la
plataforma menos capaz a la que se dirige, y tiene un aspecto distinto en cada
una. go-widgets va en sentido contrario: el Draw de un widget solo habla con un
painter.Painter, un puñado de
primitivas (rellenar un rectángulo, trazar su contorno, fijar un píxel, dibujar
texto). Que esas llamadas se conviertan en píxeles RGBA o en celdas de terminal
es asunto del backend, no del widget.
Lo que cuesta se dice sin rodeos: ningún aspecto nativo por defecto y ninguna accesibilidad gratuita; el toolkit publica su propio árbol de accesibilidad en cada plataforma. Lo que aporta es un único conjunto de widgets, probado una sola vez, con el mismo comportamiento en todas partes, y un binario que se compila de forma cruzada desde cualquier máquina hacia cualquiera de ellas.
Por dónde seguir
| Una primera aplicación | desde app-template, o desde una ventana vacía |
| Cómo llega un widget a la pantalla | la costura del painter, el conjunto de widgets, las skins |
| La costura del painter | las primitivas con las que se dibuja cada widget |
| El toolkit | 160 tipos de widget, temas, layouts, texto, accesibilidad |
| Skins | las partes y los estados de un widget en un archivo de datos |
| El estado vive en un view-model | por qué los campos de los widgets no se asignan a mano |
| MVVM | observables, comandos, binders, deshacer |
| La columna vertebral de datos | registros tipados, consultas, un almacén local o remoto |
| Dónde pinta | cada backend y cómo se elige |
| Una ventana nativa | X11, Wayland, Cocoa, Win32, GTK4, Android, wasmbox, una pestaña del navegador |
| Una aplicación y su bandeja | ciclo de vida, apariencia, un icono en la barra de menús |
| Una pestaña del navegador | un simple <canvas>, o una ventana de wasmdesk |
| Un terminal | widgets nativos de celdas y un ejecutor interactivo |
| Android | un APK real pintado por un proceso sin CGO |
| Instantáneas | un widget como SVG o PNG |
| Reglas que impone la CI | mvvmlint y bricolint |
| Módulos | los diecinueve, con sus fuentes y referencias |
| Estado | qué está verificado y dónde, y qué no está hecho |
Licencia
BSD-3-Clause.
Creada el por tannevaled
Modificada el por tannevaled