experimental package to reduce boilerplate when working with the Gio immediate mode GUI.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Greg 11e2dbad38 Update Gio version. 2 years ago
cmd Update Gio version. 2 years ago
examples Add form example, add /examples directory. 2 years ago
.gitignore Add form example, add /examples directory. 2 years ago
README.md Documentation fix. 2 years ago
grid.go Update Gio version. 2 years ago
main.go Update Gio version. 2 years ago
prof.go Memory profiling code. Updates to reduce memory footprint. 2 years ago

README.md

GIOWrap

An experimental wrapper package for the Gio immediate mode GUI, designed to reduce boilerplate.

go run ~/go/src/git.wow.st/gmp/giowrap/cmd/hello/main.go

The basic concept is to define a Context type that contains the Gio variables required for layout and drawing. Context contains a pointer to app.Window and ui.Ops so that, once layout is complete, you can call Context.Draw() to draw your objects in your window.

The following types and functions are defined in order to transform a Context variable during layout:

type Layout func(Context) Context

type Widget interface {
	Layout(Context) Context
}

type WidgetCombinator func(...Widget) Widget

type Enclosure interface {
	Begin(Context) Context
	End(Context) Context
}

func Enclose(e Enclosure, w ...Widget) Widget { ... }

The giowrap package also includes a private package-global variable called extra that is a []interface{}, allowing arbitrary data to be maintained by UI elements. Elements can request access to the structure when they are allocated and they are returned a unique integer index into the slice. This can be used, for example, to define themes, and control the operation of a WidgetCombinator during operation. For example:

type fWidget struct { l Layout }
func NewfWidget(l layout) fWidget { return fWidget{ l: l } }

func Flexible(v float32) Widget {
	return NewfWidget(func(ctx Context) Context {
		extra.data[extra.cur].(*FlexOpts).flexible = v
		return ctx
	})
}

...
	ctx = myFlex(
			w1,
			giowrap.Flexible(0.5),
			w2,
			giowrap.Flexible(1),
			w3,
		).Layout(ctx)
	ctx.Draw()
...