User interface toolkit for Go with support for SDL2 and HTML Canvas render targets.
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.
 
 
 
 
 
Noah Petherbridge fb9127f0d5 Add version number and documentation 1 year ago
docs Add README, LICENSE and Examples 1 year ago
eg Tooltip Widget and Event Refactor 1 year ago
theme Cut lib/render into its own package, change all imports 1 year ago
LICENSE.md Add README, LICENSE and Examples 1 year ago
README.md Tooltip Widget and Event Refactor 1 year ago
button.go Tooltip Widget and Event Refactor 1 year ago
check_button.go Tooltip Widget and Event Refactor 1 year ago
checkbox.go Tooltip Widget and Event Refactor 1 year ago
debug.go Supervisor, Frame Pack and Misc Fixes 1 year ago
docs.go Add version number and documentation 1 year ago
dragdrop.go Code Layout Refactor 2 years ago
enums.go Tooltip Widget and Event Refactor 1 year ago
frame.go Tooltip Widget and Event Refactor 1 year ago
frame_pack.go Tooltip Widget and Event Refactor 1 year ago
frame_place.go Tooltip Widget and Event Refactor 1 year ago
functions.go Supervisor, Frame Pack and Misc Fixes 1 year ago
go.mod Add version number and documentation 1 year ago
go.sum Place Strategy for Frame Widget 1 year ago
image.go Tooltip Widget and Event Refactor 1 year ago
label.go Tooltip Widget and Event Refactor 1 year ago
main_window.go Tooltip Widget and Event Refactor 1 year ago
menu.go Tooltip Widget and Event Refactor 1 year ago
supervisor.go Tooltip Widget and Event Refactor 1 year ago
tooltip.go Tooltip Widget and Event Refactor 1 year ago
tooltip_test.go Add version number and documentation 1 year ago
version.go Add version number and documentation 1 year ago
widget.go Tooltip Widget and Event Refactor 1 year ago
window.go Tooltip Widget and Event Refactor 1 year ago

README.md

ui: User Interface Toolkit for Go

GoDoc

Package ui is a user interface toolkit for Go that targets desktop applications (SDL2, for Linux, MacOS and Windows) as well as web browsers (WebAssembly rendering to an HTML Canvas).

Screenshot

(Screenshot is from Project: Doodle’s GUITest debug screen showing a Window, several Frames, Labels, Buttons and a Checkbox widget.)

It is very much a work in progress and may contain bugs and its API may change as bugs are fixed or features added.

This library is being developed in conjunction with my drawing-based maze game, Project: Doodle. The rendering engine library is at go/render which provides the SDL2 and Canvas back-ends. (GitHub mirror: kirsle/render)

Notice: the canonical source repository for this project is at git.kirsle.net/go/ui with a mirror available on GitHub at kirsle/ui. Issues and pull requests are accepted on GitHub.

Example

package main

import (
    "fmt"

    "git.kirsle.net/go/render"
    "git.kirsle.net/go/ui"
)

func main() {
    mw, err := ui.NewMainWindow("Hello World")
    if err != nil {
        panic(err)
    }

    mw.SetBackground(render.White)

    // Draw a label.
    label := ui.NewLabel(ui.Label{
        Text: "Hello, world!",
        Font: render.Text{
            FontFilename: "../DejaVuSans.ttf",
            Size:         32,
            Color:        render.SkyBlue,
            Shadow:       render.SkyBlue.Darken(40),
        },
    })
    mw.Pack(label, ui.Pack{
        Side: ui.N,
        PadY:   12,
    })

    // Draw a button.
    button := ui.NewButton("My Button", ui.NewLabel(ui.Label{
        Text: "Click me!",
        Font: render.Text{
            FontFilename: "../DejaVuSans.ttf",
            Size:         12,
            Color:        render.Red,
            Padding:      4,
        },
    }))
    button.Handle(ui.Click, func(p render.Point) {
        fmt.Println("I've been clicked!")
    })
    mw.Pack(button, ui.Pack{
        Side: ui.N,
    })

    // Add the button to the MainWindow's Supervisor so it can be
    // clicked on and interacted with.
    mw.Add(button)

    mw.MainLoop()
}

Widgets and Features

The following widgets have been implemented or are planned for the future.

Widgets are designed to be composable, making use of pre-existing widgets to create more complex ones. The widgets here are ordered from simplest to most complex.

Fully implemented widgets:

Work in progress widgets:

Wish list for the longer-term future:

Supervisor for Interaction

Some widgets that support user interaction (such as Button, CheckButton and Checkbox) need to be added to the Supervisor which watches over them and communicates events that they’re interested in.

func SupervisorSDL2Example() {
    // NOTE: using the render/sdl engine.
    window := sdl.New("Hello World", 800, 600)
    window.Setup()

    // One Supervisor is needed per UI.
    supervisor := ui.NewSupervisor()

    // A button for our UI.
    btn := ui.NewButton("Button1", ui.NewLabel(ui.Label{
        Text: "Click me!",
    }))

    // Add it to the Supervisor.
    supervisor.Add(btn)

    // Main loop
    for {
        // Check for keyboard/mouse events
        ev, _ := window.Poll()

        // Ping the Supervisor Loop function with the event state, so
        // it can trigger events on the widgets under its care.
        supervisor.Loop(ev)
    }
}

You only need one Supervisor instance per UI. Add() each interactive widget to it, and call its Loop() method in your main loop so it can update the state of the widgets under its care.

The MainWindow includes its own Supervisor, see below.

MainWindow for Simple Applications

The MainWindow widget may be used for “simple” UI applications where all you want is a GUI and you don’t want to manage your own SDL2 (or Canvas) engine.

MainWindow is only to be used one time per application, and it sets up its own SDL2 render context and creates the main window. It also contains a Frame widget for the window contents and you may Pack() widgets into the window the same as you would a Frame.

MainWindow includes its own Supervisor: just call the .Add(Widget) method to add interactive widgets to the supervisor. The MainLoop() of the window calls Supervisor.Loop() automatically.

License

MIT.