mirror of https://github.com/liamg/aminal.git
97 lines
1.7 KiB
Go
97 lines
1.7 KiB
Go
package gui
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/liamg/aminal/buffer"
|
|
)
|
|
|
|
func (gui *GUI) textbox(col uint16, row uint16, text string, fg [3]float32, bg [3]float32) {
|
|
lines := []string{}
|
|
line := ""
|
|
word := ""
|
|
|
|
maxWidth := int(gui.terminal.ActiveBuffer().ViewWidth()) - 4
|
|
maxHeight := (int(gui.terminal.ActiveBuffer().ViewHeight()) / 2) - 2
|
|
|
|
if maxHeight < 1 {
|
|
return
|
|
}
|
|
|
|
longestLine := 0
|
|
|
|
addWord := func() {
|
|
if len(line)+len(word) <= maxWidth {
|
|
line = fmt.Sprintf("%s%s", line, word)
|
|
if len(line) < maxWidth {
|
|
line = fmt.Sprintf("%s ", line)
|
|
} else {
|
|
lines = append(lines, line)
|
|
line = ""
|
|
}
|
|
} else {
|
|
lines = append(lines, line)
|
|
line = word
|
|
for len(line) > maxWidth {
|
|
// break word into bits
|
|
}
|
|
}
|
|
|
|
word = ""
|
|
}
|
|
|
|
addLine := func() bool {
|
|
addWord()
|
|
if len(line) > longestLine {
|
|
longestLine = len(line)
|
|
}
|
|
lines = append(lines, line)
|
|
if len(lines) >= maxHeight-1 {
|
|
lines = append(lines, "...")
|
|
return true
|
|
}
|
|
line = ""
|
|
return false
|
|
}
|
|
|
|
done := false
|
|
|
|
DONE:
|
|
for _, c := range text {
|
|
switch c {
|
|
case 0x0d:
|
|
continue
|
|
case 0x0a:
|
|
if done = addLine(); done {
|
|
break DONE
|
|
}
|
|
case ' ':
|
|
addWord()
|
|
default:
|
|
word = fmt.Sprintf("%s%c", word, c)
|
|
}
|
|
}
|
|
if word != "" {
|
|
addWord()
|
|
}
|
|
if line != "" && !done {
|
|
addLine()
|
|
}
|
|
|
|
for hx := col; hx < col+uint16(longestLine)+1; hx++ {
|
|
for hy := row - 1; hy < row+uint16(len(lines))+1; hy++ {
|
|
gui.renderer.DrawCellBg(buffer.NewBackgroundCell(bg), uint(hx), uint(hy), nil, true)
|
|
}
|
|
}
|
|
|
|
x := float32(col) * gui.renderer.cellWidth
|
|
|
|
f := gui.fontMap.DefaultFont()
|
|
f.SetColor(fg[0], fg[1], fg[2], 1)
|
|
|
|
for i, line := range lines {
|
|
y := float32(row+1+uint16(i))*gui.renderer.cellHeight + f.MinY()
|
|
f.Print(x, y, fmt.Sprintf(" %s", line))
|
|
}
|
|
}
|