#include <KDebug>
-#define KITEMLISTVIEWLAYOUTER_DEBUG
+// #define KITEMLISTVIEWLAYOUTER_DEBUG
KItemListViewLayouter::KItemListViewLayouter(QObject* parent) :
QObject(parent),
pos.rx() = 0;
size = QSizeF(m_size.width(), m_groupHeaderHeight);
} else {
- size = QSizeF(firstItemRect.width(), m_groupHeaderHeight);
+ size = QSizeF(minimumGroupHeaderWidth(), m_groupHeaderHeight);
}
return QRectF(pos, size);
}
return rows * m_columnCount;
}
-int KItemListViewLayouter::itemsPerOffset() const
-{
- return m_columnCount;
-}
-
bool KItemListViewLayouter::isFirstGroupItem(int itemIndex) const
{
+ const_cast<KItemListViewLayouter*>(this)->doLayout();
return m_groupItemIndexes.contains(itemIndex);
}
// (in average a character requires the halve width of the font height).
//
// TODO: Let the group headers provide a minimum width and respect this width here
- const qreal minimumGroupHeaderWidth = m_groupHeaderHeight * 15 / 2;
- if (requiredItemHeight < minimumGroupHeaderWidth) {
- requiredItemHeight = minimumGroupHeaderWidth;
+ const qreal headerWidth = minimumGroupHeaderWidth();
+ if (requiredItemHeight < headerWidth) {
+ requiredItemHeight = headerWidth;
}
}
}
if (itemCount > 0) {
+ // Calculate the maximum y-range of the last row for m_maximumScrollOffset
m_maximumScrollOffset = m_itemRects.last().bottom();
+ const qreal rowY = m_itemRects.last().y();
+
+ int index = m_itemRects.count() - 2;
+ while (index >= 0 && m_itemRects.at(index).bottom() >= rowY) {
+ m_maximumScrollOffset = qMax(m_maximumScrollOffset, m_itemRects.at(index).bottom());
+ --index;
+ }
+
m_maximumItemOffset = m_columnCount * m_columnWidth;
} else {
m_maximumScrollOffset = 0;
const int maxIndex = m_model->count() - 1;
- // Calculate the first visible index that is (at least partly) visible
+ // Calculate the first visible index that is fully visible
int min = 0;
int max = maxIndex;
int mid = 0;
do {
mid = (min + max) / 2;
- if (m_itemRects[mid].bottom() < m_scrollOffset) {
+ if (m_itemRects[mid].top() < m_scrollOffset) {
min = mid + 1;
} else {
max = mid - 1;
}
} while (min <= max);
- while (mid < maxIndex && m_itemRects[mid].bottom() < m_scrollOffset) {
- ++mid;
+ if (mid > 0) {
+ // Include the row before the first fully visible index, as it might
+ // be partly visible
+ if (m_itemRects[mid].top() >= m_scrollOffset) {
+ --mid;
+ Q_ASSERT(m_itemRects[mid].top() < m_scrollOffset);
+ }
+
+ const qreal rowTop = m_itemRects[mid].top();
+ while (mid > 0 && m_itemRects[mid - 1].top() == rowTop) {
+ --mid;
+ }
}
m_firstVisibleIndex = mid;
return true;
}
+qreal KItemListViewLayouter::minimumGroupHeaderWidth() const
+{
+ return m_groupHeaderHeight * 15 / 2;
+}
+
#include "kitemlistviewlayouter_p.moc"