go-widgets
Ein Widget-Baum, von Go gezeichnet, auf jeder Oberfläche, die Go erreicht. Ein natives
Fenster unter X11, Wayland, macOS und Windows; ein <canvas> in einem Browser-Tab; ein
Terminal; eine Android-APK. Keine C-Toolchain, keine Webview, kein System-Widget-Satz:
Jedes Modul baut mit CGO_ENABLED=0, und jedes Pixel zeichnet das
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 windowDas ist
cmd/windowdemo,
gekürzt. Dieselbe box in einem Browser, einem Terminal oder einem PNG gezeichnet ist derselbe
Code mit einer anderen Oberfläche darunter.
Warum ein Toolkit alles zeichnet
Ein Widget, das den plattformeigenen Button aufruft, ist so portabel wie die am wenigsten
fähige Plattform, auf die es zielt, und sieht auf jeder anders aus. go-widgets geht den
umgekehrten Weg: Das Draw eines Widgets spricht immer nur mit einem
painter.Painter, einer Handvoll
Primitive (ein Rechteck füllen, eines umranden, ein Pixel setzen, Text zeichnen). Ob
aus diesen Aufrufen RGBA-Pixel oder Terminalzellen werden, ist Sache des Back-Ends,
nicht des Widgets.
Was das kostet, wird offen gesagt: standardmäßig kein natives Aussehen und keine Barrierefreiheit geschenkt – das Toolkit veröffentlicht seinen eigenen Barrierefreiheitsbaum an jede Plattform. Was es dafür bekommt, ist ein einziger Widget-Satz, einmal getestet, mit demselben Verhalten überall, und ein Binary, das sich von jeder Maschine aus für jede dieser Plattformen cross-kompilieren lässt.
Wie es weitergeht
| Eine erste Anwendung | aus app-template oder aus einem nackten Fenster |
| Wie ein Widget auf den Bildschirm kommt | die Painter-Schnittstelle, der Widget-Satz, Skins |
| Die Painter-Schnittstelle | die Primitive, mit denen jedes Widget gezeichnet wird |
| Das Toolkit | 160 Widget-Typen, Themes, Layouts, Text, Barrierefreiheit |
| Skins | die Teile und Zustände eines Widgets in einer Datendatei |
| Zustand lebt in einem View-Model | warum Widget-Felder nicht von Hand zugewiesen werden |
| MVVM | Observables, Commands, Binder, Rückgängig |
| Das Daten-Rückgrat | typisierte Datensätze, Abfragen, ein lokaler oder entfernter Speicher |
| Wohin es zeichnet | jedes Back-End und wie es ausgewählt wird |
| Ein natives Fenster | X11, Wayland, Cocoa, Win32, GTK4, Android, wasmbox, ein Browser-Tab |
| Eine Anwendung und ihr Tray | Lebenszyklus, Erscheinungsbild, ein Menüleisten-Symbol |
| Ein Browser-Tab | ein einfaches <canvas> oder ein wasmdesk-Fenster |
| Ein Terminal | zellennative Widgets und ein interaktiver Runner |
| Android | eine echte APK, gezeichnet von einem CGO-freien Prozess |
| Snapshots | ein Widget als SVG oder PNG |
| Regeln, die die CI durchsetzt | mvvmlint und bricolint |
| Module | alle neunzehn, mit ihren Quellen und Referenzen |
| Stand | was wo geprüft ist und was noch fehlt |
Lizenz
BSD-3-Clause.
Erstellt am von tannevaled
Geändert am von tannevaled