This is a small demonstration of the package, with a scrollable grid and a few other widgets.
See gioui.org.
This is a set of widgets made for my own use. They replace (or complements) gioui.org/widget and gioui.org/widget/material but the rest of the gio code is imported without modifications.
The code is copied extensively from the following sources:
- https://github.com/gioui/gio
- https://github.com/gioui/gio-x.git
- https://github.com/gioui/gio-example.git
THIS IS WORK IN PROGRESS - ANYTHING CAN CHANGE AT ANY TIME
Now updated to Gio V0.4.1
The design follows closely Google Material 3, where a few primary colors are used to generate all the other colors. Most other design elements can be tuned by modifying the default theme.
All widgets handle keyboard only operation. Focus is moved py TAB/SHIFT-TAB keys using standard gio
The theme is very much extended, with default values for all colors and sizes. You can set up several themes for different types of buttons etc, and use the themes when declaring the widgets.
Dark and Light mode are both supported, and can be easily selected from a widget.
Everything scales with the text size, and the text size can be set automatically as a fraction of the window size. This makes it easy to write programs that are maximized to fill the screen, or are operating mostly in full-screen mode
The gio module itself does not need to be modified. The excellent work by Elias Naur and Chris Waldon is used without modifications. My widgets are only a high-level extensions, replacing the material widgets in gio.
All widget functions can have any number of options, as func(options ...Option)
. See example below
Here is an example from /examples/hello. The widgets can take a variable number of options for things like width and hints. Otherwise, default fallbacks are used. The defaults are mostly defined in the theme.
package main
import (
"gio-v/wid"
"gioui.org/app"
"gioui.org/font/gofont"
"gioui.org/layout"
"gioui.org/unit"
)
func main() {
go wid.Run(
app.NewWindow(app.Title("Hello Gio demo"), app.Size(unit.Dp(900), unit.Dp(500))),
wid.NewTheme(gofont.Collection(), 14),
hello,
)
app.Main()
}
func hello(th *wid.Theme) layout.Widget {
return wid.List(th, wid.Overlay,
wid.Label(th, "Hello gio..", wid.Middle(), wid.Heading(), wid.Bold()),
wid.Label(th, "A small demo program using 25 lines toal"),
)
}
This implementation does not follow the gio recommendations fully. The widgets are fully persistent, and callbacks and pointers are used extensively. This is done to make it much more user-friendly, and it is primarily intended for desktop applications, where resources are plentiful.
Switches and edits modify the corresponding variables directly, via pointers. When the variable is modified, the corresponding widget is immediately updated without any action from the program. This is typically done from another go-routine.
Note that the program is not yet protected from race conditions. The plan is to include a global lock.
Dual MIT/Unlicense; same as Gio