Skip to content

Instantly share code, notes, and snippets.

@jroimartin
Last active November 5, 2016 20:42
Show Gist options
  • Save jroimartin/b78c4c33c67a289dc028dd7d562e1f6e to your computer and use it in GitHub Desktop.
Save jroimartin/b78c4c33c67a289dc028dd7d562e1f6e to your computer and use it in GitHub Desktop.
gocui: updating widgets from goroutines
package main
import (
"errors"
"fmt"
"log"
"strings"
"time"
"github.com/jroimartin/gocui"
)
type StatusbarWidget struct {
name string
x, y int
w int
val float64
}
func NewStatusbarWidget(name string, x, y, w int) *StatusbarWidget {
return &StatusbarWidget{name: name, x: x, y: y, w: w}
}
func (w *StatusbarWidget) SetVal(val float64) error {
if val < 0 || val > 1 {
return errors.New("invalid value")
}
w.val = val
return nil
}
func (w *StatusbarWidget) Val() float64 {
return w.val
}
func (w *StatusbarWidget) Layout(g *gocui.Gui) error {
v, err := g.SetView(w.name, w.x, w.y, w.x+w.w, w.y+2)
if err != nil && err != gocui.ErrUnknownView {
return err
}
v.Clear()
rep := int(w.val * float64(w.w-1))
fmt.Fprint(v, strings.Repeat("▒", rep))
return nil
}
func main() {
g, err := gocui.NewGui()
if err != nil {
log.Panicln(err)
}
defer g.Close()
status := NewStatusbarWidget("status", 1, 1, 50)
g.SetManager(status)
if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
log.Panicln(err)
}
go update(g, status)
if err := g.MainLoop(); err != nil && err != gocui.ErrQuit {
log.Panicln(err)
}
}
func quit(g *gocui.Gui, v *gocui.View) error {
return gocui.ErrQuit
}
func update(g *gocui.Gui, sw *StatusbarWidget) {
for {
g.Execute(func(g *gocui.Gui) error {
val := sw.Val() + 0.05
if val < 0 || val > 1 {
return nil
}
return sw.SetVal(val)
})
time.Sleep(500 * time.Millisecond)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment