SWT
Eclipse SWT cross platform (OSX/Linux/Windows) native controls for Go: https://github.com/timob/swt. Check the Readme, on how to get started.
This package is used by Cyan for its UI. Go's concurrency, synchronization and function closure features are useful in UI event/callback code. It is very suited to this kind of programming. UIs can be made very responsive, by easily running things in the background from an event handler.
Having a native Go UI option would be better, but this will take time.
Example
Demonstrates adding tab and tree controls to a window. (from examples dir)
package main import ( "github.com/timob/javabind" "github.com/timob/swt" "log" "os" ) // Example as shown at https://www.eclipse.org/swt/ func main() { err := javabind.SetupJVM(os.Getenv("CLASSPATH")) if err != nil { log.Fatal(err) } var SWT *swt.SWT display := swt.NewWidgetsDisplay() shell := swt.NewWidgetsShell3(display) shell.SetLayout(swt.NewLayoutGridLayout2(2, true)) tabFolder := swt.NewWidgetsTabFolder(shell, SWT.NONE()) tabFolder.SetLayoutData(swt.NewLayoutGridData5(SWT.FILL(), SWT.FILL(), true, true, 2, 1)) item := swt.NewWidgetsTabItem(tabFolder, SWT.NONE()) item.SetText("Widget") composite := swt.NewWidgetsComposite(tabFolder, SWT.NONE()) composite.SetLayout(swt.NewLayoutGridLayout()) tree := swt.NewWidgetsTree(composite, SWT.BORDER()) item.SetControl(composite) tree.SetHeaderVisible(true) tree.SetLayoutData(swt.NewLayoutGridData4(SWT.FILL(), SWT.FILL(), true, true)) column1 := swt.NewWidgetsTreeColumn(tree, SWT.NONE()) column1.SetText("Standard") column2 := swt.NewWidgetsTreeColumn(tree, SWT.NONE()) column2.SetText("Widget") branch := swt.NewWidgetsTreeItem(tree, SWT.NONE()) branch.SetText2([]string{"Efficient", "Portable"}) leaf := swt.NewWidgetsTreeItem2(branch, SWT.NONE()) leaf.SetText2([]string{"Cross", "Platform"}) branch.SetExpanded(true) branch = swt.NewWidgetsTreeItem(tree, SWT.NONE()) branch.SetText2([]string{"Native", "Controls"}) leaf = swt.NewWidgetsTreeItem2(branch, SWT.NONE()) leaf.SetText2([]string{"Cross", "Platform"}) branch = swt.NewWidgetsTreeItem(tree, SWT.NONE()) branch.SetText2([]string{"Cross", "Platform"}) column1.Pack() column2.Pack() item = swt.NewWidgetsTabItem(tabFolder, SWT.NONE()) item.SetText("Toolkit") button := swt.NewWidgetsButton(shell, SWT.CHECK()) button.SetText("Totally") button.SetSelection(true) button.SetLayoutData(swt.NewLayoutGridData4(SWT.CENTER(), SWT.CENTER(), false, false)) listener := NewSelectionListener(button) button = swt.NewWidgetsButton(shell, SWT.PUSH()) button.SetText("Awesome") button.SetLayoutData(swt.NewLayoutGridData4(SWT.CENTER(), SWT.CENTER(), false, false)) shell.Pack() shell.Open() for !shell.IsDisposed() { if !display.ReadAndDispatch() { display.Sleep() } } }
Example apps:
AWS Plus: small utility to work with AWS