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:
commit
9c6ccf2fb1
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user