resizeToContents - QTableView to consider cells outside visible area

This makes sizeHintForColumn and sizeHintForRow considering indexes that
are outside the visual area - which is what most people want. It is
a bit weird that scrolling gives '...'

That will make the behavior a bit more like QTreeView, that considers
indexes outside the visual area.

Furthermore it is important since the user cannot just resize a column
when QHeaderView::ResizeToContens is used.

Task-number: QTBUG-4206

Change-Id: Icb209a19ce9e62cd30ca7159a4ad2aa9aadc1b6a
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
This commit is contained in:
Thorbjørn Martsum 2013-04-11 07:32:43 +02:00 committed by The Qt Project
parent 64a2e00e37
commit 70410467f0

View File

@ -2230,7 +2230,8 @@ int QTableView::sizeHintForRow(int row) const
int hint = 0;
QModelIndex index;
int columnsProcessed = 0;
for (int column = left; column <= right; ++column) {
int column = left;
for (; column <= right; ++column) {
int logicalColumn = d->horizontalHeader->logicalIndex(column);
if (d->horizontalHeader->isSectionHidden(logicalColumn))
continue;
@ -2248,6 +2249,47 @@ int QTableView::sizeHintForRow(int row) const
break;
}
int actualRight = d->model->columnCount(d->root) - 1;
int idxLeft = left;
int idxRight = column - 1;
while (columnsProcessed != maximumProcessCols && (idxLeft > 0 || idxRight < actualRight)) {
int logicalIdx = -1;
if ((columnsProcessed % 2 && idxLeft > 0) || idxRight == actualRight) {
while (idxLeft > 0) {
--idxLeft;
int logcol = d->horizontalHeader->logicalIndex(idxLeft);
if (d->horizontalHeader->isSectionHidden(logcol))
continue;
logicalIdx = logcol;
break;
}
} else {
while (idxRight < actualRight) {
++idxRight;
int logcol = d->horizontalHeader->logicalIndex(idxRight);
if (d->horizontalHeader->isSectionHidden(logcol))
continue;
logicalIdx = logcol;
break;
}
}
if (logicalIdx < 0)
continue;
index = d->model->index(row, logicalIdx, d->root);
if (d->wrapItemText) {// for wrapping boundaries
option.rect.setY(rowViewportPosition(index.row()));
option.rect.setHeight(rowHeight(index.row()));
option.rect.setX(columnViewportPosition(index.column()));
option.rect.setWidth(columnWidth(index.column()));
}
hint = d->heightHintForIndex(index, hint, option);
++columnsProcessed;
}
return d->showGrid ? hint + 1 : hint;
}
@ -2286,7 +2328,8 @@ int QTableView::sizeHintForColumn(int column) const
int hint = 0;
int rowsProcessed = 0;
QModelIndex index;
for (int row = top; row <= bottom; ++row) {
int row = top;
for (; row <= bottom; ++row) {
int logicalRow = d->verticalHeader->logicalIndex(row);
if (d->verticalHeader->isSectionHidden(logicalRow))
continue;
@ -2298,6 +2341,40 @@ int QTableView::sizeHintForColumn(int column) const
break;
}
int actualBottom = d->model->rowCount(d->root) - 1;
int idxTop = top;
int idxBottom = row - 1;
while (rowsProcessed != maximumProcessRows && (idxTop > 0 || idxBottom < actualBottom)) {
int logicalIdx = -1;
if ((rowsProcessed % 2 && idxTop > 0) || idxBottom == actualBottom) {
while (idxTop > 0) {
--idxTop;
int logrow = d->verticalHeader->logicalIndex(idxTop);
if (d->verticalHeader->isSectionHidden(logrow))
continue;
logicalIdx = logrow;
break;
}
} else {
while (idxBottom < actualBottom) {
++idxBottom;
int logrow = d->verticalHeader->logicalIndex(idxBottom);
if (d->verticalHeader->isSectionHidden(logrow))
continue;
logicalIdx = logrow;
break;
}
}
if (logicalIdx < 0)
continue;
index = d->model->index(logicalIdx, column, d->root);
hint = d->widthHintForIndex(index, hint, option);
++rowsProcessed;
}
return d->showGrid ? hint + 1 : hint;
}