summaryrefslogtreecommitdiff
path: root/tui/builder.go
blob: e969cec352d31a0320dcc37b273df3ae8ca166fa (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
package tui

import (
	"github.com/rivo/uniseg"
)

type builder struct {
	runs []textRun
	width int
}

func (b *builder) add(s string, style *Style) {
	b.width += uniseg.StringWidth(s)
	if len(b.runs) == 0 || style != b.runs[len(b.runs) - 1].style {
		b.runs = append(b.runs, textRun {s, style, false})
	} else {
		run := b.runs[len(b.runs) - 1]
		run.text += s
		b.runs[len(b.runs) - 1] = run
	}
}

func (b *builder) addRun(run textRun) {
	b.width += uniseg.StringWidth(run.text)
	b.runs = append(b.runs, run)
}

func (b *builder) addRuns(runs []textRun) {
	for _, run := range runs {
		b.addRun(run)
	}
}

func (b *builder) flush() []textRun {
	runs := b.runs
	b.width = 0
	b.runs = nil
	return runs
}