aerc/lib/ui/context.go -rw-r--r-- 2.5 KiB View raw
                                                                                
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package ui

import (
	"fmt"

	"github.com/gdamore/tcell"
	"github.com/gdamore/tcell/views"
	"github.com/mattn/go-runewidth"
)

// A context allows you to draw in a sub-region of the terminal
type Context struct {
	screen   tcell.Screen
	viewport *views.ViewPort
	x, y     int
}

func (ctx *Context) X() int {
	x, _, _, _ := ctx.viewport.GetPhysical()
	return x
}

func (ctx *Context) Y() int {
	_, y, _, _ := ctx.viewport.GetPhysical()
	return y
}

func (ctx *Context) Width() int {
47 references
width, _ := ctx.viewport.Size() return width } func (ctx *Context) Height() int {
34 references
_, height := ctx.viewport.Size() return height } func NewContext(width, height int, screen tcell.Screen) *Context {
2 references
vp := views.NewViewPort(screen, 0, 0, width, height) return &Context{screen, vp, 0, 0} } func (ctx *Context) Subcontext(x, y, width, height int) *Context {
5 references
vp_width, vp_height := ctx.viewport.Size() if x < 0 || y < 0 { panic(fmt.Errorf("Attempted to create context with negative offset")) } if x+width > vp_width || y+height > vp_height { panic(fmt.Errorf("Attempted to create context larger than parent")) } vp := views.NewViewPort(ctx.viewport, x, y, width, height) return &Context{ctx.screen, vp, ctx.x + x, ctx.y + y} } func (ctx *Context) SetCell(x, y int, ch rune, style tcell.Style) {
1 reference
width, height := ctx.viewport.Size() if x >= width || y >= height { panic(fmt.Errorf("Attempted to draw outside of context")) } crunes := []rune{} ctx.viewport.SetContent(x, y, ch, crunes, style) } func (ctx *Context) Printf(x, y int, style tcell.Style,
21 references
format string, a ...interface{}) int { width, height := ctx.viewport.Size() if x >= width || y >= height { panic(fmt.Errorf("Attempted to draw outside of context")) } str := fmt.Sprintf(format, a...) old_x := x newline := func() bool { x = old_x y++ return y < height } for _, ch := range str { switch ch { case '\n': if !newline() { return runewidth.StringWidth(str) } case '\r': x = old_x default: crunes := []rune{} ctx.viewport.SetContent(x, y, ch, crunes, style) x += runewidth.RuneWidth(ch) if x == old_x+width { if !newline() { return runewidth.StringWidth(str) } } } } return runewidth.StringWidth(str) } func (ctx *Context) Fill(x, y, width, height int, rune rune, style tcell.Style) {
23 references
vp := views.NewViewPort(ctx.viewport, x, y, width, height) vp.Fill(rune, style) } func (ctx *Context) SetCursor(x, y int) {
4 references
ctx.screen.ShowCursor(ctx.x+x, ctx.y+y) } func (ctx *Context) HideCursor() {
5 references
ctx.screen.HideCursor() }