gcla / gowid

Compositional widgets for terminal user interfaces, written in Go, inspired by urwid.
MIT License
692 stars 31 forks source link
go golang tcell tui urwid widgets

# Terminal User Interface Widgets in Go

Gowid provides widgets and a framework for making terminal user interfaces. It's written in Go and inspired by urwid.

Widgets out-of-the-box include:

All widgets support interaction with the mouse when the terminal allows.

Gowid is built on top of the fantastic tcell package.

There are many alternatives to gowid - see Similar Projects

The most developed gowid application is currently termshark, a terminal UI for tshark.

Installation

go get github.com/gcla/gowid/...

Examples

Make sure $GOPATH/bin is in your PATH (or ~/go/bin if GOPATH isn't set), then tab complete "gowid-" e.g.

gowid-fib

Here is a port of urwid's palette example:

Here is urwid's graph example:

And urwid's fibonacci example:

A demonstration of gowid's terminal widget, a port of urwid's terminal widget:

Finally, here is an animation of termshark in action:

Hello World

This example is an attempt to mimic urwid's "Hello World" example.

package main

import (
    "github.com/gcla/gowid"
    "github.com/gcla/gowid/widgets/divider"
    "github.com/gcla/gowid/widgets/pile"
    "github.com/gcla/gowid/widgets/styled"
    "github.com/gcla/gowid/widgets/text"
    "github.com/gcla/gowid/widgets/vpadding"
)

//======================================================================

func main() {

    palette := gowid.Palette{
        "banner":  gowid.MakePaletteEntry(gowid.ColorWhite, gowid.MakeRGBColor("#60d")),
        "streak":  gowid.MakePaletteEntry(gowid.ColorNone, gowid.MakeRGBColor("#60a")),
        "inside":  gowid.MakePaletteEntry(gowid.ColorNone, gowid.MakeRGBColor("#808")),
        "outside": gowid.MakePaletteEntry(gowid.ColorNone, gowid.MakeRGBColor("#a06")),
        "bg":      gowid.MakePaletteEntry(gowid.ColorNone, gowid.MakeRGBColor("#d06")),
    }

    div := divider.NewBlank()
    outside := styled.New(div, gowid.MakePaletteRef("outside"))
    inside := styled.New(div, gowid.MakePaletteRef("inside"))

    helloworld := styled.New(
        text.NewFromContentExt(
            text.NewContent([]text.ContentSegment{
                text.StyledContent("Hello World", gowid.MakePaletteRef("banner")),
            }),
            text.Options{
                Align: gowid.HAlignMiddle{},
            },
        ),
        gowid.MakePaletteRef("streak"),
    )

    f := gowid.RenderFlow{}

    view := styled.New(
        vpadding.New(
            pile.New([]gowid.IContainerWidget{
                &gowid.ContainerWidget{IWidget: outside, D: f},
                &gowid.ContainerWidget{IWidget: inside, D: f},
                &gowid.ContainerWidget{IWidget: helloworld, D: f},
                &gowid.ContainerWidget{IWidget: inside, D: f},
                &gowid.ContainerWidget{IWidget: outside, D: f},
            }),
            gowid.VAlignMiddle{},
            f),
        gowid.MakePaletteRef("bg"),
    )

    app, _ := gowid.NewApp(gowid.AppArgs{
        View:    view,
        Palette: &palette,
    })

    app.SimpleMainLoop()
}

Running the example above displays this:

Documentation

Similar Projects

Gowid is late to the TUI party. There are many options from which to choose - please read https://appliedgo.net/tui/ for a nice summary for the Go language. Here is a selection:

Dependencies

Gowid depends on these great open-source packages:

Contact

License

License: MIT