|
|
|
@ -23,6 +23,10 @@ type TableCell struct {
@@ -23,6 +23,10 @@ type TableCell struct {
|
|
|
|
|
// is cut off. Set to 0 if there is no maximum width.
|
|
|
|
|
MaxWidth int |
|
|
|
|
|
|
|
|
|
// If the total table width is less than the available width, this value is
|
|
|
|
|
// used to add extra width to a column. See SetExpansion() for details.
|
|
|
|
|
Expansion int |
|
|
|
|
|
|
|
|
|
// The color of the cell text.
|
|
|
|
|
Color tcell.Color |
|
|
|
|
|
|
|
|
@ -69,6 +73,27 @@ func (c *TableCell) SetMaxWidth(maxWidth int) *TableCell {
@@ -69,6 +73,27 @@ func (c *TableCell) SetMaxWidth(maxWidth int) *TableCell {
|
|
|
|
|
return c |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// SetExpansion sets the value by which the column of this cell expands if the
|
|
|
|
|
// available width for the table is more than the table width (prior to applying
|
|
|
|
|
// this expansion value). This is a proportional value. The amount of unused
|
|
|
|
|
// horizontal space is divided into widths to be added to each column. How much
|
|
|
|
|
// extra width a column receives depends on the expansion value: A value of 0
|
|
|
|
|
// (the default) will not cause the column to increase in width. Other values
|
|
|
|
|
// are proportional, e.g. a value of 2 will cause a column to grow by twice
|
|
|
|
|
// the amount of a column with a value of 1.
|
|
|
|
|
//
|
|
|
|
|
// Since this value affects an entire column, the maximum over all visible cells
|
|
|
|
|
// in that column is used.
|
|
|
|
|
//
|
|
|
|
|
// This function panics if a negative value is provided.
|
|
|
|
|
func (c *TableCell) SetExpansion(expansion int) *TableCell { |
|
|
|
|
if expansion < 0 { |
|
|
|
|
panic("Table cell expansion values may not be negative") |
|
|
|
|
} |
|
|
|
|
c.Expansion = expansion |
|
|
|
|
return c |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// SetTextColor sets the cell's text color.
|
|
|
|
|
func (c *TableCell) SetTextColor(color tcell.Color) *TableCell { |
|
|
|
|
c.Color = color |
|
|
|
@ -525,7 +550,10 @@ func (t *Table) Draw(screen tcell.Screen) {
@@ -525,7 +550,10 @@ func (t *Table) Draw(screen tcell.Screen) {
|
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
var skipped, lastTableWidth int |
|
|
|
|
var ( |
|
|
|
|
skipped, lastTableWidth, expansionTotal int |
|
|
|
|
expansions []int |
|
|
|
|
) |
|
|
|
|
ColumnLoop: |
|
|
|
|
for column := 0; ; column++ { |
|
|
|
|
// If we've moved beyond the right border, we stop or skip a column.
|
|
|
|
@ -556,8 +584,9 @@ ColumnLoop:
@@ -556,8 +584,9 @@ ColumnLoop:
|
|
|
|
|
widths = append(widths[:t.fixedColumns], widths[t.fixedColumns+1:]...) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// What's this column's width?
|
|
|
|
|
// What's this column's width (without expansion)?
|
|
|
|
|
maxWidth := -1 |
|
|
|
|
expansion := 0 |
|
|
|
|
for _, row := range rows { |
|
|
|
|
if cell := getCell(row, column); cell != nil { |
|
|
|
|
cellWidth := StringWidth(cell.Text) |
|
|
|
@ -567,6 +596,9 @@ ColumnLoop:
@@ -567,6 +596,9 @@ ColumnLoop:
|
|
|
|
|
if cellWidth > maxWidth { |
|
|
|
|
maxWidth = cellWidth |
|
|
|
|
} |
|
|
|
|
if cell.Expansion > expansion { |
|
|
|
|
expansion = cell.Expansion |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if maxWidth < 0 { |
|
|
|
@ -578,9 +610,27 @@ ColumnLoop:
@@ -578,9 +610,27 @@ ColumnLoop:
|
|
|
|
|
widths = append(widths, maxWidth) |
|
|
|
|
lastTableWidth = tableWidth |
|
|
|
|
tableWidth += maxWidth + 1 |
|
|
|
|
expansions = append(expansions, expansion) |
|
|
|
|
expansionTotal += expansion |
|
|
|
|
} |
|
|
|
|
t.columnOffset = skipped |
|
|
|
|
|
|
|
|
|
// If we have space left, distribute it.
|
|
|
|
|
if tableWidth < width { |
|
|
|
|
toDistribute := width - tableWidth |
|
|
|
|
for index := range widths { |
|
|
|
|
if expansionTotal <= 0 { |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
expansion := expansions[index] |
|
|
|
|
expWidth := toDistribute * expansion / expansionTotal |
|
|
|
|
widths[index] += expWidth |
|
|
|
|
tableWidth += expWidth |
|
|
|
|
toDistribute -= expWidth |
|
|
|
|
expansionTotal -= expansion |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Helper function which draws border runes.
|
|
|
|
|
borderStyle := tcell.StyleDefault.Background(t.backgroundColor).Foreground(t.bordersColor) |
|
|
|
|
drawBorder := func(colX, rowY int, ch rune) { |
|
|
|
|