-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcanvas.go
More file actions
77 lines (66 loc) · 1.99 KB
/
canvas.go
File metadata and controls
77 lines (66 loc) · 1.99 KB
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
package main
import "strings"
type Canvas struct {
buffer strings.Builder
brush rune
needRedraw bool
}
func (c *Canvas) ClearBuffer() {
c.buffer.Reset()
}
func (c *Canvas) AddString(s string) {
c.buffer.WriteString(s)
}
func (c *Canvas) AddRune(r rune) {
c.buffer.WriteRune(r)
}
func (c *Canvas) ToString() string {
return c.buffer.String()
}
func (c *Canvas) SetBrush(b rune) {
c.brush = b
}
func (c *Canvas) DrawBox(position, size Vector2d) {
c.buffer.WriteString(terminal.background(0, 0, 0))
c.buffer.WriteString(terminal.foreground(255, 255, 255))
c.buffer.WriteString(terminal.pos2d(position))
for range size.y {
c.buffer.WriteString(CURSOR_SAVE)
c.buffer.WriteString(strings.Repeat(string(c.brush), size.x))
c.buffer.WriteString(CURSOR_LOAD)
c.buffer.WriteString(terminal.cursorDown(1))
}
}
func (c *Canvas) VerticalLine(position Vector2d, h int, r rune) {
c.buffer.WriteString(terminal.pos2d(position))
for range h {
c.buffer.WriteString(CURSOR_SAVE)
c.buffer.WriteRune(r)
c.buffer.WriteString(CURSOR_LOAD)
c.buffer.WriteString(terminal.cursorDown(1))
}
}
func (c *Canvas) HorizontalLine(position Vector2d, w int, r rune) {
c.buffer.WriteString(terminal.pos2d(position))
for range w {
c.buffer.WriteRune(r)
}
}
func (c *Canvas) DrawSquare(position, size Vector2d) {
var tl, tr, bl, br rune = '╔', '╗', '╚', '╝'
var hr, vr rune = '═', '║'
// Draw the lines
c.HorizontalLine(position, size.x, hr)
c.HorizontalLine(Vector2d{position.x, position.y + size.y}, size.x, hr)
c.VerticalLine(position, size.y, vr)
c.VerticalLine(Vector2d{position.x + size.x, position.y}, size.y, vr)
// Draw the corners
c.buffer.WriteString(terminal.pos2d(position))
c.buffer.WriteRune(tl)
c.buffer.WriteString(terminal.pos(position.x+size.x, position.y))
c.buffer.WriteRune(tr)
c.buffer.WriteString(terminal.pos(position.x, position.y+size.y))
c.buffer.WriteRune(bl)
c.buffer.WriteString(terminal.pos(position.x+size.x, position.y+size.y))
c.buffer.WriteRune(br)
}