2.5 KiB
2.5 KiB
Go UI package planning
Pietro Gagliardi http://github.com/andlabs
Goals
- Simple, easy to use GUI library for hard-coding GUI layouts
- Go-like: uses Go's concurrency features, interfaces, etc. and behaves like other Go libraries
- Portable; runs on all OSs Go supports and uses native toolkits (wherever possible)
- Minimal: only support what's absolutely necessary (for instance, only events that we will actually use in a program); if functionality can be done cleanly in an existing thing, use that (for instnaces, if adjustable sliding dividers are ever added, they can be made part of
Stack
instead of their own thing) - Lightweight and fast
- Error-safe
- Correct: uses APIs properly and conforms to system-specific UI design guidelines
Layouts
Layouts control positioning and sizing. Layouts are controls, so they can be added recursively. The layout types are:
Stack
: a stack of controls, all sized alike, with padding between controls and spacing around the whole set. Controls can be arranged horizontally or vertically. (Analogues: Qt'sQBoxLayout
)
- TODO change the name?
RadioSet
: likeStack
but for radio buttons: only has radio buttons and handles exclusivity automatically (this is also the only way to add radio buttons)Grid
: a grid of controls; they size themselves. Spacing is handled likeStack
. (Analogues: Qt'sQGridLayout
)Form
: a set of label-control pairs arranged to resemble options on a dialog form. Sizing, positioning, and spacing are handled in an OS-dependent way. (Analogues: Qt'sQFormLayout
)
Windows
There's only one (maybe two, if I choose to add floating toolboxes) window type. You can add one control to the content area of a window.
In the case of dialogue boxes, you can call a function, say RunDaialogue()
, that runs the dialogue modal, and adds standard OK/Cancel/Apply buttons for you.
An example
package main
import (
"github.com/andlabs/ui"
)
func main() {
win := ui.NewWindow("Hello")
form := ui.NewForm()
name := ui.NewLineEntry()
form.Append("Enter your name:", name)
button := ui.NewButton("Click Me")
form.Append("", button)
win.SetControl(form)
events, err := win.RunDialogue(ui.OkCancel)
if err != nil {
panic(err)
}
done := false
for !done {
select {
case event := <-events:
switch event {
case ui.Ok:
ui.MsgBox("Hi", "Hello, " + name.Text(), ui.Ok)
case ui.Cancel:
done = true
}
case <-button.Click:
ui.MsgBox("Hi", "You clicked me!", ui.Ok)
}
}
window.Close()
}