Skip to content

Commit

Permalink
ScrollableTableWidget: Configurable item spacing and drawing column l…
Browse files Browse the repository at this point in the history
…ines
  • Loading branch information
past-due committed Oct 11, 2023
1 parent 6213a70 commit c4971d2
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 1 deletion.
50 changes: 49 additions & 1 deletion lib/widget/table.cpp
Expand Up @@ -392,7 +392,7 @@ std::shared_ptr<ScrollableTableWidget> ScrollableTableWidget::make(const std::ve
result->scrollableList->setCalcLayout(LAMBDA_CALCLAYOUT_SIMPLE({
if (auto psParent = std::dynamic_pointer_cast<ScrollableTableWidget>(psWidget->parent()))
{
int y0 = psParent->header->y() + psParent->header->height();
int y0 = psParent->header->y() + psParent->header->height() + psParent->scrollableList->getItemSpacing();
psWidget->setGeometry(0, y0, psParent->width(), psParent->height() - y0);
}
}));
Expand Down Expand Up @@ -697,3 +697,51 @@ const Vector2i& ScrollableTableWidget::getColumnPadding()
{
return columnPadding;
}

void ScrollableTableWidget::setDrawColumnLines(bool bEnabled)
{
drawColumnLines = bEnabled;
}

void ScrollableTableWidget::setItemSpacing(uint32_t value)
{
scrollableList->setItemSpacing(value);
}

void ScrollableTableWidget::displayRecursive(WidgetGraphicsContext const& context)
{
WIDGET::displayRecursive(context);

// *after* displaying all children, draw the column lines (if desired)
if (!drawColumnLines)
{
return;
}

if (!context.clipContains(geometry())) {
return;
}

int xOffset = context.getXOffset();
int yOffset = context.getYOffset();

int x0 = x() + xOffset;
int y0 = y() + yOffset + scrollableList->y();
int y1 = y0 + scrollableList->height();

lines.reserve(columnWidths.size());

// draw a line between every column widget
int lastColumnEndX = -columnPadding.x;
for (size_t colIdx = 0; colIdx < columnWidths.size(); ++colIdx)
{
// column lines
int columnXPos = lastColumnEndX + columnPadding.x + columnPadding.x;
int columRightLineXPos = columnXPos + static_cast<int>(columnWidths[colIdx]) + columnPadding.x;

lines.emplace_back(x0 + columRightLineXPos, y0, x0 + columRightLineXPos, y1);
lastColumnEndX = columnXPos + static_cast<int>(columnWidths[colIdx]);
}

iV_Lines(lines, WZCOL_MENU_SEPARATOR);
}
9 changes: 9 additions & 0 deletions lib/widget/table.h
Expand Up @@ -140,6 +140,11 @@ class ScrollableTableWidget: public WIDGET
// Change the table background color
void setBackgroundColor(PIELIGHT const &color);

// Configure whether to draw column lines for list rows
void setDrawColumnLines(bool bEnabled);

void setItemSpacing(uint32_t value);

uint16_t getScrollPosition() const;
void setScrollPosition(uint16_t newPosition);

Expand All @@ -156,6 +161,7 @@ class ScrollableTableWidget: public WIDGET

protected:
virtual void geometryChanged() override;
virtual void displayRecursive(WidgetGraphicsContext const& context) override;

private:
size_t totalPaddingWidthFor(size_t numColumns) const;
Expand Down Expand Up @@ -187,6 +193,9 @@ class ScrollableTableWidget: public WIDGET

std::vector<std::shared_ptr<TableRow>> rows;

std::vector<glm::ivec4> lines;
bool drawColumnLines = false;

bool userDidResizeColumnWidths = false;
};

Expand Down

0 comments on commit c4971d2

Please sign in to comment.