161 lines
2.9 KiB
Go
161 lines
2.9 KiB
Go
package uiterm
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/nsf/termbox-go"
|
|
)
|
|
|
|
type Textview struct {
|
|
Lines []string
|
|
CurrentLine int
|
|
Fg, Bg Attribute
|
|
showTimestamps bool
|
|
parsedLines []string
|
|
|
|
ui *Ui
|
|
x0, y0, x1, y1 int
|
|
}
|
|
|
|
func (t *Textview) uiInitialize(ui *Ui) {
|
|
t.ui = ui
|
|
t.showTimestamps = true
|
|
}
|
|
|
|
func (t *Textview) ToggleTimestamps() {
|
|
if t.showTimestamps == true {
|
|
t.showTimestamps = false
|
|
} else {
|
|
t.showTimestamps = true
|
|
}
|
|
t.updateParsedLines()
|
|
t.uiDraw()
|
|
}
|
|
|
|
func (t *Textview) uiSetActive(active bool) {
|
|
}
|
|
|
|
func (t *Textview) uiSetBounds(x0, y0, x1, y1 int) {
|
|
t.x0 = x0
|
|
t.y0 = y0
|
|
t.x1 = x1
|
|
t.y1 = y1
|
|
t.updateParsedLines()
|
|
t.uiDraw()
|
|
}
|
|
|
|
func (t *Textview) ScrollUp() {
|
|
if newLine := t.CurrentLine + 1; newLine < len(t.parsedLines) {
|
|
t.CurrentLine = newLine
|
|
}
|
|
t.uiDraw()
|
|
}
|
|
|
|
func (t *Textview) ScrollDown() {
|
|
if newLine := t.CurrentLine - 1; newLine >= 0 {
|
|
t.CurrentLine = newLine
|
|
}
|
|
t.uiDraw()
|
|
}
|
|
|
|
func (t *Textview) ScrollTop() {
|
|
if newLine := len(t.parsedLines) - 1; newLine > 0 {
|
|
t.CurrentLine = newLine
|
|
} else {
|
|
t.CurrentLine = 0
|
|
}
|
|
t.uiDraw()
|
|
}
|
|
|
|
func (t *Textview) ScrollBottom() {
|
|
t.CurrentLine = 0
|
|
t.uiDraw()
|
|
}
|
|
|
|
func (t *Textview) updateParsedLines() {
|
|
width := t.x1 - t.x0
|
|
|
|
if t.Lines == nil || width <= 0 {
|
|
t.parsedLines = nil
|
|
return
|
|
}
|
|
|
|
parsed := make([]string, 0, len(t.Lines))
|
|
for _, line := range t.Lines {
|
|
var l = line
|
|
if t.showTimestamps == false {
|
|
l = strings.TrimSpace(strings.Split(line, "]")[1])
|
|
}
|
|
current := ""
|
|
chars := 0
|
|
reader := strings.NewReader(l)
|
|
for {
|
|
if chars >= width {
|
|
parsed = append(parsed, current)
|
|
chars = 0
|
|
current = ""
|
|
}
|
|
if reader.Len() <= 0 {
|
|
if chars > 0 {
|
|
parsed = append(parsed, current)
|
|
}
|
|
break
|
|
}
|
|
if ch, _, err := reader.ReadRune(); err == nil {
|
|
current = current + string(ch)
|
|
chars++
|
|
}
|
|
}
|
|
}
|
|
t.parsedLines = parsed
|
|
}
|
|
|
|
func (t *Textview) AddLine(line string) {
|
|
t.Lines = append(t.Lines, line)
|
|
t.updateParsedLines()
|
|
t.uiDraw()
|
|
}
|
|
|
|
func (t *Textview) Clear() {
|
|
t.Lines = nil
|
|
t.CurrentLine = 0
|
|
t.parsedLines = nil
|
|
t.uiDraw()
|
|
}
|
|
|
|
func (t *Textview) uiDraw() {
|
|
t.ui.beginDraw()
|
|
defer t.ui.endDraw()
|
|
|
|
var reader *strings.Reader
|
|
writeableLines := t.y1 - t.y0
|
|
lineNum := 0
|
|
if writeableLines < len(t.parsedLines) {
|
|
lineNum = len(t.parsedLines) - writeableLines
|
|
}
|
|
//Beep()
|
|
for y := t.y0; y < writeableLines; y++ {
|
|
if lineNum < len(t.parsedLines) {
|
|
reader = strings.NewReader(t.parsedLines[lineNum])
|
|
} else {
|
|
reader = nil
|
|
}
|
|
for x := t.x0; x < t.x1; x++ {
|
|
var chr rune = ' '
|
|
if reader != nil {
|
|
if ch, _, err := reader.ReadRune(); err == nil {
|
|
chr = ch
|
|
} //no err
|
|
} //reader != nil
|
|
termbox.SetCell(x, y, chr, termbox.Attribute(t.Fg), termbox.Attribute(t.Bg))
|
|
} //each x
|
|
lineNum++
|
|
} //each y
|
|
} //func
|
|
|
|
func (t *Textview) uiKeyEvent(key Key) {
|
|
}
|
|
|
|
func (t *Textview) uiCharacterEvent(chr rune) {
|
|
}
|