loader.go

 1package gocui
 2
 3import "time"
 4
 5func (g *Gui) loaderTick() {
 6	go func() {
 7		for range time.Tick(time.Millisecond * 50) {
 8			for _, view := range g.Views() {
 9				if view.HasLoader {
10					g.userEvents <- userEvent{func(g *Gui) error { return nil }}
11					break
12				}
13			}
14		}
15	}()
16}
17
18func (v *View) loaderLines() [][]cell {
19	duplicate := make([][]cell, len(v.lines))
20	for i := range v.lines {
21		if i < len(v.lines)-1 {
22			duplicate[i] = make([]cell, len(v.lines[i]))
23			copy(duplicate[i], v.lines[i])
24		} else {
25			duplicate[i] = make([]cell, len(v.lines[i])+2)
26			copy(duplicate[i], v.lines[i])
27			duplicate[i][len(duplicate[i])-2] = cell{chr: ' '}
28			duplicate[i][len(duplicate[i])-1] = Loader()
29		}
30	}
31
32	return duplicate
33}
34
35// Loader can show a loading animation
36func Loader() cell {
37	characters := "|/-\\"
38	now := time.Now()
39	nanos := now.UnixNano()
40	index := nanos / 50000000 % int64(len(characters))
41	str := characters[index : index+1]
42	chr := []rune(str)[0]
43	return cell{
44		chr: chr,
45	}
46}