summaryrefslogtreecommitdiffstats
path: root/vendor
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2019-02-15 20:54:03 +1100
committerJesse Duffield <jessedduffield@gmail.com>2019-02-15 20:54:03 +1100
commit306ac41fd847ef2d50c4262fcb439dbf6cd9b29b (patch)
tree125910b5fb4013eb552280ceb9730becc84915b3 /vendor
parentc1019934058d92c5edd2d1829b543c6d2ed1ace9 (diff)
bump gocui to support loader animations on views
Diffstat (limited to 'vendor')
-rw-r--r--vendor/github.com/jesseduffield/gocui/gui.go37
-rw-r--r--vendor/github.com/jesseduffield/gocui/view.go43
2 files changed, 68 insertions, 12 deletions
diff --git a/vendor/github.com/jesseduffield/gocui/gui.go b/vendor/github.com/jesseduffield/gocui/gui.go
index a50d0c522..41599a9be 100644
--- a/vendor/github.com/jesseduffield/gocui/gui.go
+++ b/vendor/github.com/jesseduffield/gocui/gui.go
@@ -5,6 +5,9 @@
package gocui
import (
+ standardErrors "errors"
+ "time"
+
"github.com/go-errors/errors"
"github.com/jesseduffield/termbox-go"
@@ -12,10 +15,10 @@ import (
var (
// ErrQuit is used to decide if the MainLoop finished successfully.
- ErrQuit = errors.New("quit")
+ ErrQuit = standardErrors.New("quit")
// ErrUnknownView allows to assert if a View must be initialized.
- ErrUnknownView = errors.New("unknown view")
+ ErrUnknownView = standardErrors.New("unknown view")
)
// OutputMode represents the terminal's output mode (8 or 256 colors).
@@ -163,7 +166,7 @@ func (g *Gui) SetView(name string, x0, y0, x1, y1 int, overlaps byte) (*View, er
v.SelBgColor, v.SelFgColor = g.SelBgColor, g.SelFgColor
v.Overlaps = overlaps
g.views = append(g.views, v)
- return v, ErrUnknownView
+ return v, errors.Wrap(ErrUnknownView, 0)
}
// SetViewOnTop sets the given view on top of the existing ones.
@@ -175,7 +178,7 @@ func (g *Gui) SetViewOnTop(name string) (*View, error) {
return v, nil
}
}
- return nil, ErrUnknownView
+ return nil, errors.Wrap(ErrUnknownView, 0)
}
// SetViewOnBottom sets the given view on bottom of the existing ones.
@@ -187,7 +190,7 @@ func (g *Gui) SetViewOnBottom(name string) (*View, error) {
return v, nil
}
}
- return nil, ErrUnknownView
+ return nil, errors.Wrap(ErrUnknownView, 0)
}
// Views returns all the views in the GUI.
@@ -203,7 +206,7 @@ func (g *Gui) View(name string) (*View, error) {
return v, nil
}
}
- return nil, ErrUnknownView
+ return nil, errors.Wrap(ErrUnknownView, 0)
}
// ViewByPosition returns a pointer to a view matching the given position, or
@@ -216,7 +219,7 @@ func (g *Gui) ViewByPosition(x, y int) (*View, error) {
return v, nil
}
}
- return nil, ErrUnknownView
+ return nil, errors.Wrap(ErrUnknownView, 0)
}
// ViewPosition returns the coordinates of the view with the given name, or
@@ -227,7 +230,7 @@ func (g *Gui) ViewPosition(name string) (x0, y0, x1, y1 int, err error) {
return v.x0, v.y0, v.x1, v.y1, nil
}
}
- return 0, 0, 0, 0, ErrUnknownView
+ return 0, 0, 0, 0, errors.Wrap(ErrUnknownView, 0)
}
// DeleteView deletes a view by name.
@@ -238,7 +241,7 @@ func (g *Gui) DeleteView(name string) error {
return nil
}
}
- return ErrUnknownView
+ return errors.Wrap(ErrUnknownView, 0)
}
// SetCurrentView gives the focus to a given view.
@@ -249,7 +252,7 @@ func (g *Gui) SetCurrentView(name string) (*View, error) {
return v, nil
}
}
- return nil, ErrUnknownView
+ return nil, errors.Wrap(ErrUnknownView, 0)
}
// CurrentView returns the currently focused view, or nil if no view
@@ -364,6 +367,7 @@ func (g *Gui) SetManagerFunc(manager func(*Gui) error) {
// MainLoop runs the main loop until an error is returned. A successful
// finish should return ErrQuit.
func (g *Gui) MainLoop() error {
+ g.loaderTick()
if err := g.flush(); err != nil {
return err
}
@@ -705,3 +709,16 @@ func (g *Gui) execKeybinding(v *View, kb *keybinding) (bool, error) {
}
return true, nil
}
+
+func (g *Gui) loaderTick() {
+ go func() {
+ for range time.Tick(time.Millisecond) {
+ for _, view := range g.Views() {
+ if view.HasLoader {
+ g.userEvents <- userEvent{func(g *Gui) error { return nil }}
+ break
+ }
+ }
+ }
+ }()
+}
diff --git a/vendor/github.com/jesseduffield/gocui/view.go b/vendor/github.com/jesseduffield/gocui/view.go
index f691960b4..7cf632c84 100644
--- a/vendor/github.com/jesseduffield/gocui/view.go
+++ b/vendor/github.com/jesseduffield/gocui/view.go
@@ -8,6 +8,7 @@ import (
"bytes"
"io"
"strings"
+ "time"
"github.com/go-errors/errors"
@@ -87,6 +88,9 @@ type View struct {
// Overlaps describes which edges are overlapping with another view's edges
Overlaps byte
+
+ // If HasLoader is true, the message will be appended with a spinning loader animation
+ HasLoader bool
}
type viewLine struct {
@@ -322,7 +326,11 @@ func (v *View) draw() error {
}
if v.tainted {
v.viewLines = nil
- for i, line := range v.lines {
+ lines := v.lines
+ if v.HasLoader {
+ lines = v.loaderLines()
+ }
+ for i, line := range lines {
wrap := 0
if v.Wrap {
wrap = maxX
@@ -334,7 +342,9 @@ func (v *View) draw() error {
v.viewLines = append(v.viewLines, vline)
}
}
- v.tainted = false
+ if !v.HasLoader {
+ v.tainted = false
+ }
}
if v.Autoscroll && len(v.viewLines) > maxY {
@@ -564,3 +574,32 @@ func linesToString(lines [][]cell) string {
return strings.Join(str, "\n")
}
+
+func (v *View) loaderLines() [][]cell {
+ duplicate := make([][]cell, len(v.lines))
+ for i := range v.lines {
+ if i < len(v.lines)-1 {
+ duplicate[i] = make([]cell, len(v.lines[i]))
+ copy(duplicate[i], v.lines[i])
+ } else {
+ duplicate[i] = make([]cell, len(v.lines[i])+2)
+ copy(duplicate[i], v.lines[i])
+ duplicate[i][len(duplicate[i])-2] = cell{chr: ' '}
+ duplicate[i][len(duplicate[i])-1] = Loader()
+ }
+ }
+
+ return duplicate
+}
+
+func Loader() cell {
+ characters := "|/-\\"
+ now := time.Now()
+ nanos := now.UnixNano()
+ index := nanos / 50000000 % int64(len(characters))
+ str := characters[index : index+1]
+ chr := []rune(str)[0]
+ return cell{
+ chr: chr,
+ }
+}