In KItemListViewLayouter, we have always stored a QRectF for each item,
which is "the area that the item occupies". However, the size of the
QRectF is already stored in the size hint resolver.
Therefore, it is sufficient to store the position of the top left
corner of the QRectF in a QPointF and construct the QRectF on demand.
This patch reduces the memory usage by 16 bytes for each item in the
view:
* a QRectF is 4 doubles -> 32 byes
* a QPointF contains only 2 doubles -> 16 bytes
REVIEW: 113487
+ QSizeF sizeHint;
+ if (m_sizeHintResolver) {
+ sizeHint = m_sizeHintResolver->sizeHint(index);
+ } else {
+ sizeHint = m_itemSize;
+ }
+
if (m_scrollOrientation == Qt::Horizontal) {
// Rotate the logical direction which is always vertical by 90°
// to get the physical horizontal direction
if (m_scrollOrientation == Qt::Horizontal) {
// Rotate the logical direction which is always vertical by 90°
// to get the physical horizontal direction
- const QRectF& b = m_itemInfos[index].rect;
- QRectF bounds(b.y(), b.x(), b.height(), b.width());
- QPointF pos = bounds.topLeft();
+ const QPointF logicalPos = m_itemInfos[index].pos;
+ QPointF pos(logicalPos.y(), logicalPos.x());
pos.rx() -= m_scrollOffset;
pos.rx() -= m_scrollOffset;
- bounds.moveTo(pos);
- return bounds;
+ return QRectF(pos, sizeHint);
- QRectF bounds = m_itemInfos[index].rect;
- bounds.moveTo(bounds.topLeft() - QPointF(m_itemOffset, m_scrollOffset));
- return bounds;
+ if (sizeHint.width() <= 0) {
+ // In Details View, a size hint with negative width is used internally.
+ sizeHint.rwidth() = m_itemSize.width();
+ }
+
+ QPointF pos = m_itemInfos[index].pos;
+ pos -= QPointF(m_itemOffset, m_scrollOffset);
+ return QRectF(pos, sizeHint);
}
QRectF KItemListViewLayouter::groupHeaderRect(int index) const
}
QRectF KItemListViewLayouter::groupHeaderRect(int index) const
// current column. As the scroll-direction is
// Qt::Horizontal and m_itemRects is accessed directly,
// the logical height represents the visual width.
// current column. As the scroll-direction is
// Qt::Horizontal and m_itemRects is accessed directly,
// the logical height represents the visual width.
- qreal width = minimumGroupHeaderWidth();
- const qreal y = m_itemInfos[index].rect.y();
+ qreal headerWidth = minimumGroupHeaderWidth();
+ const qreal y = m_itemInfos[index].pos.y();
const int maxIndex = m_itemInfos.count() - 1;
while (index <= maxIndex) {
const int maxIndex = m_itemInfos.count() - 1;
while (index <= maxIndex) {
- QRectF bounds = m_itemInfos[index].rect;
- if (bounds.y() != y) {
+ const QPointF pos = m_itemInfos[index].pos;
+ if (pos.y() != y) {
- if (bounds.height() > width) {
- width = bounds.height();
+ qreal itemWidth;
+ if (m_sizeHintResolver) {
+ itemWidth = m_sizeHintResolver->sizeHint(index).width();
+ } else {
+ itemWidth = m_itemSize.width();
+ }
+
+ if (itemWidth > headerWidth) {
+ headerWidth = itemWidth;
- size = QSizeF(width, m_size.height());
+ size = QSizeF(headerWidth, m_size.height());
}
return QRectF(pos, size);
}
}
return QRectF(pos, size);
}
}
ItemInfo& itemInfo = m_itemInfos[index];
}
ItemInfo& itemInfo = m_itemInfos[index];
- itemInfo.rect = QRectF(x, y, itemSize.width(), requiredItemHeight);
+ itemInfo.pos = QPointF(x, y);
itemInfo.column = column;
itemInfo.row = row;
itemInfo.column = column;
itemInfo.row = row;
int mid = 0;
do {
mid = (min + max) / 2;
int mid = 0;
do {
mid = (min + max) / 2;
- if (m_itemInfos[mid].rect.top() < m_scrollOffset) {
+ if (m_itemInfos[mid].pos.y() < m_scrollOffset) {
min = mid + 1;
} else {
max = mid - 1;
min = mid + 1;
} else {
max = mid - 1;
if (mid > 0) {
// Include the row before the first fully visible index, as it might
// be partly visible
if (mid > 0) {
// Include the row before the first fully visible index, as it might
// be partly visible
- if (m_itemInfos[mid].rect.top() >= m_scrollOffset) {
+ if (m_itemInfos[mid].pos.y() >= m_scrollOffset) {
- Q_ASSERT(m_itemInfos[mid].rect.top() < m_scrollOffset);
+ Q_ASSERT(m_itemInfos[mid].pos.y() < m_scrollOffset);
- const qreal rowTop = m_itemInfos[mid].rect.top();
- while (mid > 0 && m_itemInfos[mid - 1].rect.top() == rowTop) {
+ const qreal rowTop = m_itemInfos[mid].pos.y();
+ while (mid > 0 && m_itemInfos[mid - 1].pos.y() == rowTop) {
max = maxIndex;
do {
mid = (min + max) / 2;
max = maxIndex;
do {
mid = (min + max) / 2;
- if (m_itemInfos[mid].rect.y() <= bottom) {
+ if (m_itemInfos[mid].pos.y() <= bottom) {
min = mid + 1;
} else {
max = mid - 1;
}
} while (min <= max);
min = mid + 1;
} else {
max = mid - 1;
}
} while (min <= max);
- while (mid > 0 && m_itemInfos[mid].rect.y() > bottom) {
+ while (mid > 0 && m_itemInfos[mid].pos.y() > bottom) {
--mid;
}
m_lastVisibleIndex = mid;
--mid;
}
m_lastVisibleIndex = mid;
qreal m_groupHeaderMargin;
struct ItemInfo {
qreal m_groupHeaderMargin;
struct ItemInfo {