1
0
mirror of https://github.com/gizak/termui.git synced 2025-04-24 13:48:50 +08:00

Merge 66e013dd832e2b129377a312ef314014b9a6736f into 2b8f0c7960e9553acea6d579a740713066da5e13

This commit is contained in:
Ahmad Karlam 2024-01-30 02:58:06 -08:00 committed by GitHub
commit 9c6ccf2fb1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -6,6 +6,7 @@ package widgets
import (
"image"
"strings"
. "github.com/gizak/termui/v3"
)
@ -24,6 +25,7 @@ type Table struct {
Rows [][]string
ColumnWidths []int
TextStyle Style
TextWrap bool
RowSeparator bool
TextAlignment Alignment
RowStyles map[int]Style
@ -62,6 +64,7 @@ func (self *Table) Draw(buf *Buffer) {
// draw rows
for i := 0; i < len(self.Rows) && yCoordinate < self.Inner.Max.Y; i++ {
row := self.Rows[i]
textWrap := false
colXCoordinate := self.Inner.Min.X
rowStyle := self.TextStyle
@ -77,6 +80,10 @@ func (self *Table) Draw(buf *Buffer) {
// draw row cells
for j := 0; j < len(row); j++ {
if len(row[j]) > columnWidths[j] && self.TextWrap {
row = self.textWrapTransformer(row, i, j, columnWidths[j])
textWrap = true
}
col := ParseStyles(row[j], rowStyle)
// draw row cell
if len(col) > columnWidths[j] || self.TextAlignment == AlignLeft {
@ -127,6 +134,9 @@ func (self *Table) Draw(buf *Buffer) {
yCoordinate++
// draw horizontal separator
if textWrap {
continue
}
horizontalCell := NewCell(HORIZONTAL_LINE, separatorStyle)
if self.RowSeparator && yCoordinate < self.Inner.Max.Y && i != len(self.Rows)-1 {
buf.Fill(horizontalCell, image.Rect(self.Inner.Min.X, yCoordinate, self.Inner.Max.X, yCoordinate+1))
@ -134,3 +144,30 @@ func (self *Table) Draw(buf *Buffer) {
}
}
}
func (self *Table) textWrapTransformer(row []string, i, j, columnWidth int) []string {
// Split words by column width
words := strings.Split(row[j], " ")
newWords := []string{}
nextWords := []string{}
totalChar := 0
for i := 0; i < len(words); i++ {
word := words[i]
if totalChar+len(word)+1 > columnWidth {
nextWords = words[i:]
break
}
newWords = append(newWords, word)
totalChar += len(word) + 1
}
row[j] = strings.Join(newWords, " ")
// Insert new sentence
last := len(self.Rows) - 1
self.Rows = append(self.Rows, self.Rows[last])
copy(self.Rows[i+1:], self.Rows[i:last])
self.Rows[i+1] = make([]string, len(self.Rows[i]))
self.Rows[i+1][j] = strings.Join(nextWords, " ")
return row
}