-
-
Notifications
You must be signed in to change notification settings - Fork 296
/
render.go
54 lines (45 loc) · 1.29 KB
/
render.go
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
48
49
50
51
52
53
54
package ui
// Renderer wraps the Render method.
type Renderer interface {
// Render renders onto a Buffer.
Render(bb *BufferBuilder)
}
// Render creates a new Buffer with the given width, and lets a Renderer render
// onto it.
func Render(r Renderer, width int) *Buffer {
if r == nil {
return nil
}
bb := NewBufferBuilder(width)
r.Render(bb)
return bb.Buffer()
}
// NewModeLineRenderer returns a Renderer for a mode line.
func NewModeLineRenderer(title, filter string) Renderer {
return modeLineRenderer{title, filter}
}
type modeLineRenderer struct {
title string
filter string
}
func (ml modeLineRenderer) Render(bb *BufferBuilder) {
bb.WriteString(ml.title, styleForMode.String())
bb.WriteSpaces(1, "")
bb.WriteString(ml.filter, styleForFilter.String())
bb.Dot = bb.Cursor()
}
func NewModeLineWithScrollBarRenderer(base Renderer, n, low, high int) Renderer {
return &modeLineWithScrollBarRenderer{base, n, low, high}
}
type modeLineWithScrollBarRenderer struct {
base Renderer
n, low, high int
}
func (ml modeLineWithScrollBarRenderer) Render(bb *BufferBuilder) {
ml.base.Render(bb)
scrollbarWidth := bb.Width - CellsWidth(bb.Lines[len(bb.Lines)-1]) - 2
if scrollbarWidth >= 3 {
bb.WriteSpaces(1, "")
writeHorizontalScrollbar(bb, ml.n, ml.low, ml.high, scrollbarWidth)
}
}