summaryrefslogtreecommitdiffstats
path: root/termui/render.go
blob: 92a277ad9e3e28542e7866ce79d4185af8bc8e76 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package termui

import (
	"sync"

	tb "github.com/nsf/termbox-go"
)

var renderJobs chan []Bufferer

// So that only one render function can flush/write to the screen at a time
// var renderLock sync.Mutex

// Bufferer should be implemented by all renderable components. Bufferers can render a Buffer.
type Bufferer interface {
	Buffer() *Buffer
	GetXOffset() int
	GetYOffset() int
}

// Render renders all Bufferer in the given order from left to right, right could overlap on left ones.
func Render(bs ...Bufferer) {
	var wg sync.WaitGroup
	for _, b := range bs {
		wg.Add(1)
		go func(b Bufferer) {
			defer wg.Done()
			buf := b.Buffer()
			// set cells in buf
			for p, c := range buf.CellMap {
				if p.In(buf.Area) {
					tb.SetCell(p.X+b.GetXOffset(), p.Y+b.GetYOffset(), c.Ch, tb.Attribute(c.Fg)+1, tb.Attribute(c.Bg)+1)
				}
			}
		}(b)
	}

	// renderLock.Lock()

	wg.Wait()
	tb.Flush()
	// renderLock.Unlock()
}

func Clear() {
	tb.Clear(tb.ColorDefault+1, tb.Attribute(Theme.Bg)+1)
}