Added individual styling for selected table cells. Resolves #934

pull/966/head
Oliver 1 month ago
parent dfc1d8680f
commit 79d4cc3212

@ -679,7 +679,7 @@ func (a *Application) draw() *Application {
} }
// Resize if requested. // Resize if requested.
if fullscreen && root != nil { if fullscreen { // root is not nil here.
width, height := screen.Size() width, height := screen.Size()
root.SetRect(0, 0, width, height) root.SetRect(0, 0, width, height)
} }

@ -437,8 +437,8 @@ func (b *Box) DrawForSubclass(screen tcell.Screen, p Primitive) {
} }
// SetFocusFunc sets a callback function which is invoked when this primitive // SetFocusFunc sets a callback function which is invoked when this primitive
// receives focus. Container primitives such as Flex or Grid may not be notified // receives focus. Container primitives such as [Flex] or [Grid] may not be
// if one of their descendents receive focus directly. // notified if one of their descendents receive focus directly.
// //
// Set to nil to remove the callback function. // Set to nil to remove the callback function.
func (b *Box) SetFocusFunc(callback func()) *Box { func (b *Box) SetFocusFunc(callback func()) *Box {
@ -447,8 +447,8 @@ func (b *Box) SetFocusFunc(callback func()) *Box {
} }
// SetBlurFunc sets a callback function which is invoked when this primitive // SetBlurFunc sets a callback function which is invoked when this primitive
// loses focus. This does not apply to container primitives such as Flex or // loses focus. This does not apply to container primitives such as [Flex] or
// Grid. // [Grid].
// //
// Set to nil to remove the callback function. // Set to nil to remove the callback function.
func (b *Box) SetBlurFunc(callback func()) *Box { func (b *Box) SetBlurFunc(callback func()) *Box {

@ -30,19 +30,32 @@ type TableCell struct {
// used to add extra width to a column. See SetExpansion() for details. // used to add extra width to a column. See SetExpansion() for details.
Expansion int Expansion int
// The color of the cell text. // The color of the cell text. You should not use this anymore, it is only
// here for backwards compatibility. Use the Style field instead.
Color tcell.Color Color tcell.Color
// The background color of the cell. // The background color of the cell. You should not use this anymore, it is
// only here for backwards compatibility. Use the Style field instead.
BackgroundColor tcell.Color BackgroundColor tcell.Color
// The style attributes of the cell. You should not use this anymore, it is
// only here for backwards compatibility. Use the Style field instead.
Attributes tcell.AttrMask
// The style of the cell. If this is uninitialized (tcell.StyleDefault), the
// Color and BackgroundColor fields are used instead.
Style tcell.Style
// The style of the cell when it is selected. If this is uninitialized
// (tcell.StyleDefault), the table's selected style is used instead. If that
// is uninitialized as well, the cell's background and text color are
// swapped.
SelectedStyle tcell.Style
// If set to true, the BackgroundColor is not used and the cell will have // If set to true, the BackgroundColor is not used and the cell will have
// the background color of the table. // the background color of the table.
Transparent bool Transparent bool
// The style attributes of the cell.
Attributes tcell.AttrMask
// If set to true, this cell cannot be selected. // If set to true, this cell cannot be selected.
NotSelectable bool NotSelectable bool
@ -60,11 +73,10 @@ type TableCell struct {
// background (using the background of the Table). // background (using the background of the Table).
func NewTableCell(text string) *TableCell { func NewTableCell(text string) *TableCell {
return &TableCell{ return &TableCell{
Text: text, Text: text,
Align: AlignLeft, Align: AlignLeft,
Color: Styles.PrimaryTextColor, Style: tcell.StyleDefault.Foreground(Styles.PrimaryTextColor).Background(Styles.PrimitiveBackgroundColor),
BackgroundColor: Styles.PrimitiveBackgroundColor, Transparent: true,
Transparent: true,
} }
} }
@ -112,14 +124,22 @@ func (c *TableCell) SetExpansion(expansion int) *TableCell {
// SetTextColor sets the cell's text color. // SetTextColor sets the cell's text color.
func (c *TableCell) SetTextColor(color tcell.Color) *TableCell { func (c *TableCell) SetTextColor(color tcell.Color) *TableCell {
c.Color = color if c.Style == tcell.StyleDefault {
c.Color = color
} else {
c.Style = c.Style.Foreground(color)
}
return c return c
} }
// SetBackgroundColor sets the cell's background color. This will also cause the // SetBackgroundColor sets the cell's background color. This will also cause the
// cell's Transparent flag to be set to "false". // cell's Transparent flag to be set to "false".
func (c *TableCell) SetBackgroundColor(color tcell.Color) *TableCell { func (c *TableCell) SetBackgroundColor(color tcell.Color) *TableCell {
c.BackgroundColor = color if c.Style == tcell.StyleDefault {
c.BackgroundColor = color
} else {
c.Style = c.Style.Background(color)
}
c.Transparent = false c.Transparent = false
return c return c
} }
@ -137,14 +157,27 @@ func (c *TableCell) SetTransparency(transparent bool) *TableCell {
// //
// cell.SetAttributes(tcell.AttrUnderline | tcell.AttrBold) // cell.SetAttributes(tcell.AttrUnderline | tcell.AttrBold)
func (c *TableCell) SetAttributes(attr tcell.AttrMask) *TableCell { func (c *TableCell) SetAttributes(attr tcell.AttrMask) *TableCell {
c.Attributes = attr if c.Style == tcell.StyleDefault {
c.Attributes = attr
} else {
c.Style = c.Style.Attributes(attr)
}
return c return c
} }
// SetStyle sets the cell's style (foreground color, background color, and // SetStyle sets the cell's style (foreground color, background color, and
// attributes) all at once. // attributes) all at once.
func (c *TableCell) SetStyle(style tcell.Style) *TableCell { func (c *TableCell) SetStyle(style tcell.Style) *TableCell {
c.Color, c.BackgroundColor, c.Attributes = style.Decompose() c.Style = style
return c
}
// SetSelectedStyle sets the cell's style when it is selected. If this is
// uninitialized (tcell.StyleDefault), the table's selected style is used
// instead. If that is uninitialized as well, the cell's background and text
// color are swapped.
func (c *TableCell) SetSelectedStyle(style tcell.Style) *TableCell {
c.SelectedStyle = style
return c return c
} }
@ -549,12 +582,12 @@ func (t *Table) SetBordersColor(color tcell.Color) *Table {
} }
// SetSelectedStyle sets a specific style for selected cells. If no such style // 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 // is set, the cell's background and text color are swapped. If a cell defines
// background colors are swapped). // its own selected style, that will be used instead.
// //
// To reset a previous setting to its default, make the following call: // To reset a previous setting to its default, make the following call:
// //
// table.SetSelectedStyle(tcell.Style{}) // table.SetSelectedStyle(tcell.StyleDefault)
func (t *Table) SetSelectedStyle(style tcell.Style) *Table { func (t *Table) SetSelectedStyle(style tcell.Style) *Table {
t.selectedStyle = style t.selectedStyle = style
return t return t
@ -1157,7 +1190,11 @@ func (t *Table) Draw(screen tcell.Screen) {
finalWidth = width - columnX finalWidth = width - columnX
} }
cell.x, cell.y, cell.width = x+columnX, y+rowY, finalWidth cell.x, cell.y, cell.width = x+columnX, y+rowY, finalWidth
start, end, _ := printWithStyle(screen, cell.Text, x+columnX, y+rowY, 0, finalWidth, cell.Align, tcell.StyleDefault.Foreground(cell.Color).Attributes(cell.Attributes), true) style := cell.Style
if style == tcell.StyleDefault {
style = tcell.StyleDefault.Background(cell.BackgroundColor).Foreground(cell.Color).Attributes(cell.Attributes)
}
start, end, _ := printWithStyle(screen, cell.Text, x+columnX, y+rowY, 0, finalWidth, cell.Align, style, true)
printed := end - start printed := end - start
if TaggedStringWidth(cell.Text)-printed > 0 && printed > 0 { if TaggedStringWidth(cell.Text)-printed > 0 && printed > 0 {
_, _, style, _ := screen.GetContent(x+columnX+finalWidth-1, y+rowY) _, _, style, _ := screen.GetContent(x+columnX+finalWidth-1, y+rowY)
@ -1272,8 +1309,12 @@ func (t *Table) Draw(screen tcell.Screen) {
} }
columnSelected := t.columnsSelectable && !t.rowsSelectable && column == t.selectedColumn columnSelected := t.columnsSelectable && !t.rowsSelectable && column == t.selectedColumn
cellSelected := !cell.NotSelectable && (columnSelected || rowSelected || t.rowsSelectable && t.columnsSelectable && column == t.selectedColumn && row == t.selectedRow) cellSelected := !cell.NotSelectable && (columnSelected || rowSelected || t.rowsSelectable && t.columnsSelectable && column == t.selectedColumn && row == t.selectedRow)
entries, ok := cellsByBackgroundColor[cell.BackgroundColor] backgroundColor := cell.BackgroundColor
cellsByBackgroundColor[cell.BackgroundColor] = append(entries, &cellInfo{ if cell.Style != tcell.StyleDefault {
_, backgroundColor, _ = cell.Style.Decompose()
}
entries, ok := cellsByBackgroundColor[backgroundColor]
cellsByBackgroundColor[backgroundColor] = append(entries, &cellInfo{
x: bx, x: bx,
y: by, y: by,
w: bw, w: bw,
@ -1282,7 +1323,7 @@ func (t *Table) Draw(screen tcell.Screen) {
selected: cellSelected, selected: cellSelected,
}) })
if !ok { if !ok {
backgroundColors = append(backgroundColors, cell.BackgroundColor) backgroundColors = append(backgroundColors, backgroundColor)
} }
columnX += columnWidth + 1 columnX += columnWidth + 1
} }
@ -1297,18 +1338,25 @@ func (t *Table) Draw(screen tcell.Screen) {
_, _, lj := c.Hcl() _, _, lj := c.Hcl()
return li < lj return li < lj
}) })
selFg, selBg, selAttr := t.selectedStyle.Decompose()
for _, bgColor := range backgroundColors { for _, bgColor := range backgroundColors {
entries := cellsByBackgroundColor[bgColor] entries := cellsByBackgroundColor[bgColor]
for _, info := range entries { for _, info := range entries {
textColor := info.cell.Color
if info.cell.Style != tcell.StyleDefault {
textColor, _, _ = info.cell.Style.Decompose()
}
if info.selected { if info.selected {
if t.selectedStyle != (tcell.Style{}) { if info.cell.SelectedStyle != tcell.StyleDefault {
selFg, selBg, selAttr := info.cell.SelectedStyle.Decompose()
defer colorBackground(info.x, info.y, info.w, info.h, selBg, selFg, false, false, selAttr, false)
} else if t.selectedStyle != tcell.StyleDefault {
selFg, selBg, selAttr := t.selectedStyle.Decompose()
defer colorBackground(info.x, info.y, info.w, info.h, selBg, selFg, false, false, selAttr, false) defer colorBackground(info.x, info.y, info.w, info.h, selBg, selFg, false, false, selAttr, false)
} else { } else {
defer colorBackground(info.x, info.y, info.w, info.h, bgColor, info.cell.Color, false, false, 0, true) defer colorBackground(info.x, info.y, info.w, info.h, bgColor, textColor, false, false, 0, true)
} }
} else { } else {
colorBackground(info.x, info.y, info.w, info.h, bgColor, info.cell.Color, info.cell.Transparent, true, 0, false) colorBackground(info.x, info.y, info.w, info.h, bgColor, textColor, info.cell.Transparent, true, 0, false)
} }
} }
} }

Loading…
Cancel
Save