|
|
|
@ -231,6 +231,10 @@ type Table struct {
@@ -231,6 +231,10 @@ type Table struct {
|
|
|
|
|
// The number of visible rows the last time the table was drawn.
|
|
|
|
|
visibleRows int |
|
|
|
|
|
|
|
|
|
// The style of the selected rows. If this value is 0, selected rows are
|
|
|
|
|
// simply inverted.
|
|
|
|
|
selectedStyle tcell.Style |
|
|
|
|
|
|
|
|
|
// An optional function which gets called when the user presses Enter on a
|
|
|
|
|
// selected cell. If entire rows selected, the column value is undefined.
|
|
|
|
|
// Likewise for entire columns.
|
|
|
|
@ -276,6 +280,18 @@ func (t *Table) SetBordersColor(color tcell.Color) *Table {
@@ -276,6 +280,18 @@ func (t *Table) SetBordersColor(color tcell.Color) *Table {
|
|
|
|
|
return t |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// SetSelectedStyle sets a specific style for selected cells. If no such style
|
|
|
|
|
// is set, per default, selected cells are inverted (i.e. their foreground and
|
|
|
|
|
// background colors are swapped).
|
|
|
|
|
//
|
|
|
|
|
// To reset a previous setting to its default, make the following call:
|
|
|
|
|
//
|
|
|
|
|
// table.SetSelectedStyle(tcell.ColorDefault, tcell.ColorDefault, 0)
|
|
|
|
|
func (t *Table) SetSelectedStyle(foregroundColor, backgroundColor tcell.Color, attributes tcell.AttrMask) *Table { |
|
|
|
|
t.selectedStyle = tcell.StyleDefault.Foreground(foregroundColor).Background(backgroundColor) | tcell.Style(attributes) |
|
|
|
|
return t |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// SetSeparator sets the character used to fill the space between two
|
|
|
|
|
// neighboring cells. This is a space character ' ' per default but you may
|
|
|
|
|
// want to set it to Borders.Vertical (or any other rune) if the column
|
|
|
|
@ -743,12 +759,17 @@ ColumnLoop:
@@ -743,12 +759,17 @@ ColumnLoop:
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Helper function which colors the background of a box.
|
|
|
|
|
colorBackground := func(fromX, fromY, w, h int, backgroundColor, textColor tcell.Color, selected bool) { |
|
|
|
|
// backgroundColor == tcell.ColorDefault => Don't color the background.
|
|
|
|
|
// textColor == tcell.ColorDefault => Don't change the text color.
|
|
|
|
|
// attr == 0 => Don't change attributes.
|
|
|
|
|
// invert == true => Ignore attr, set text to backgroundColor or t.backgroundColor;
|
|
|
|
|
// set background to textColor.
|
|
|
|
|
colorBackground := func(fromX, fromY, w, h int, backgroundColor, textColor tcell.Color, attr tcell.AttrMask, invert bool) { |
|
|
|
|
for by := 0; by < h && fromY+by < y+height; by++ { |
|
|
|
|
for bx := 0; bx < w && fromX+bx < x+width; bx++ { |
|
|
|
|
m, c, style, _ := screen.GetContent(fromX+bx, fromY+by) |
|
|
|
|
if selected { |
|
|
|
|
fg, _, _ := style.Decompose() |
|
|
|
|
fg, bg, a := style.Decompose() |
|
|
|
|
if invert { |
|
|
|
|
if fg == textColor || fg == t.bordersColor { |
|
|
|
|
fg = backgroundColor |
|
|
|
|
} |
|
|
|
@ -757,10 +778,16 @@ ColumnLoop:
@@ -757,10 +778,16 @@ ColumnLoop:
|
|
|
|
|
} |
|
|
|
|
style = style.Background(textColor).Foreground(fg) |
|
|
|
|
} else { |
|
|
|
|
if backgroundColor == tcell.ColorDefault { |
|
|
|
|
continue |
|
|
|
|
if backgroundColor != tcell.ColorDefault { |
|
|
|
|
bg = backgroundColor |
|
|
|
|
} |
|
|
|
|
style = style.Background(backgroundColor) |
|
|
|
|
if textColor != tcell.ColorDefault { |
|
|
|
|
fg = textColor |
|
|
|
|
} |
|
|
|
|
if attr != 0 { |
|
|
|
|
a = attr |
|
|
|
|
} |
|
|
|
|
style = style.Background(bg).Foreground(fg) | tcell.Style(a) |
|
|
|
|
} |
|
|
|
|
screen.SetContent(fromX+bx, fromY+by, m, c, style) |
|
|
|
|
} |
|
|
|
@ -769,11 +796,12 @@ ColumnLoop:
@@ -769,11 +796,12 @@ ColumnLoop:
|
|
|
|
|
|
|
|
|
|
// Color the cell backgrounds. To avoid undesirable artefacts, we combine
|
|
|
|
|
// the drawing of a cell by background color, selected cells last.
|
|
|
|
|
cellsByBackgroundColor := make(map[tcell.Color][]*struct { |
|
|
|
|
type cellInfo struct { |
|
|
|
|
x, y, w, h int |
|
|
|
|
text tcell.Color |
|
|
|
|
selected bool |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
cellsByBackgroundColor := make(map[tcell.Color][]*cellInfo) |
|
|
|
|
var backgroundColors []tcell.Color |
|
|
|
|
for rowY, row := range rows { |
|
|
|
|
columnX := 0 |
|
|
|
@ -793,11 +821,7 @@ ColumnLoop:
@@ -793,11 +821,7 @@ ColumnLoop:
|
|
|
|
|
columnSelected := t.columnsSelectable && !t.rowsSelectable && column == t.selectedColumn |
|
|
|
|
cellSelected := !cell.NotSelectable && (columnSelected || rowSelected || t.rowsSelectable && t.columnsSelectable && column == t.selectedColumn && row == t.selectedRow) |
|
|
|
|
entries, ok := cellsByBackgroundColor[cell.BackgroundColor] |
|
|
|
|
cellsByBackgroundColor[cell.BackgroundColor] = append(entries, &struct { |
|
|
|
|
x, y, w, h int |
|
|
|
|
text tcell.Color |
|
|
|
|
selected bool |
|
|
|
|
}{ |
|
|
|
|
cellsByBackgroundColor[cell.BackgroundColor] = append(entries, &cellInfo{ |
|
|
|
|
x: bx, |
|
|
|
|
y: by, |
|
|
|
|
w: bw, |
|
|
|
@ -821,13 +845,18 @@ ColumnLoop:
@@ -821,13 +845,18 @@ ColumnLoop:
|
|
|
|
|
_, _, lj := c.Hcl() |
|
|
|
|
return li < lj |
|
|
|
|
}) |
|
|
|
|
selFg, selBg, selAttr := t.selectedStyle.Decompose() |
|
|
|
|
for _, bgColor := range backgroundColors { |
|
|
|
|
entries := cellsByBackgroundColor[bgColor] |
|
|
|
|
for _, cell := range entries { |
|
|
|
|
if cell.selected { |
|
|
|
|
defer colorBackground(cell.x, cell.y, cell.w, cell.h, bgColor, cell.text, true) |
|
|
|
|
if t.selectedStyle != 0 { |
|
|
|
|
defer colorBackground(cell.x, cell.y, cell.w, cell.h, selBg, selFg, selAttr, false) |
|
|
|
|
} else { |
|
|
|
|
defer colorBackground(cell.x, cell.y, cell.w, cell.h, bgColor, cell.text, 0, true) |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
colorBackground(cell.x, cell.y, cell.w, cell.h, bgColor, cell.text, false) |
|
|
|
|
colorBackground(cell.x, cell.y, cell.w, cell.h, bgColor, tcell.ColorDefault, 0, false) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|