Initial commit, lots of cleanup and stuff to do, it may not work.
This commit is contained in:
160
uiterm/textview.go
Normal file
160
uiterm/textview.go
Normal file
@ -0,0 +1,160 @@
|
||||
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) {
|
||||
}
|
Reference in New Issue
Block a user