updateCache();
}
+ if (m_itemIndex == 0) {
+ // No top- or left-line should be drawn for the first group-header
+ return;
+ }
+
+ painter->setPen(m_lineColor);
+
if (m_scrollOrientation == Qt::Horizontal) {
- painter->setPen(m_lineColor);
- const qreal x = m_roleBounds.x() - 2 * m_styleOption.padding;
- painter->drawLine(x, 0, x, size().height() - 1);
-
- } else if (m_itemIndex > 0) {
- painter->setPen(m_lineColor);
- const qreal y = m_roleBounds.y() - m_styleOption.padding;
- painter->drawLine(0, y, size().width() - 1, y);
+ painter->drawLine(0, 0, 0, size().height() - 1);
+ } else {
+ painter->drawLine(0, 0, size().width() - 1, 0);
}
}
m_lineColor = mixedColor(c1, c2, 10);
m_roleColor = mixedColor(c1, c2, 70);
- int padding = m_styleOption.padding;
- int horizontalMargin = 0;
- if (m_scrollOrientation == Qt::Vertical) {
- // The x-position of the group-header-widget will always be 0,
- // Add a minimum margin.
- horizontalMargin = qMax(2, m_styleOption.horizontalMargin);
- } else {
- padding *= 2;
- }
+ const int padding = qMax(1, m_styleOption.padding);
+ const int horizontalMargin = qMax(2, m_styleOption.horizontalMargin);
const QFontMetrics fontMetrics(m_styleOption.font);
const qreal roleHeight = fontMetrics.height();
+
+ const int y = (m_scrollOrientation == Qt::Vertical) ? padding : horizontalMargin;
m_roleBounds = QRectF(horizontalMargin + padding,
- size().height() - roleHeight - padding,
- size().width() - 2 * (horizontalMargin + padding),
+ y,
+ size().width() - 2 * padding - horizontalMargin,
roleHeight);
m_dirtyCache = false;
groupHeader->setPos(-widget->x(), -groupHeaderRect.height());
groupHeader->resize(size().width(), groupHeaderRect.size().height());
} else {
- groupHeader->setPos(groupHeaderRect.x() - itemRect.x(), -groupHeaderRect.height());
+ groupHeader->setPos(groupHeaderRect.x() - itemRect.x(), -widget->y());
groupHeader->resize(groupHeaderRect.size());
}
}
void KItemListView::updateGroupHeaderHeight()
{
- const qreal groupHeaderHeight = m_styleOption.fontMetrics.height() + m_styleOption.padding * 2;
-
+ qreal groupHeaderHeight = m_styleOption.fontMetrics.height();
qreal groupHeaderMargin = 0;
+
if (scrollOrientation() == Qt::Horizontal) {
+ // The vertical margin above and below the header should be
+ // equal to the horizontal margin, not the vertical margin
+ // from m_styleOption.
+ groupHeaderHeight += 2 * m_styleOption.horizontalMargin;
groupHeaderMargin = m_styleOption.horizontalMargin;
} else if (m_itemSize.isEmpty()){
- groupHeaderMargin = groupHeaderHeight / 2;
+ groupHeaderHeight += 2 * m_styleOption.padding;
+ groupHeaderMargin = m_styleOption.iconSize / 2;
} else {
- groupHeaderMargin = m_styleOption.verticalMargin * 2;
+ groupHeaderHeight += 2 * m_styleOption.padding;
+ groupHeaderMargin = m_styleOption.iconSize / 4;
}
m_layouter->setGroupHeaderHeight(groupHeaderHeight);
m_layouter->setGroupHeaderMargin(groupHeaderMargin);
return QRectF();
}
- pos.ry() -= m_groupHeaderHeight;
-
QSizeF size;
if (m_scrollOrientation == Qt::Vertical) {
pos.rx() = 0;
+ pos.ry() -= m_groupHeaderHeight;
size = QSizeF(m_size.width(), m_groupHeaderHeight);
} else {
- size = QSizeF(minimumGroupHeaderWidth(), m_groupHeaderHeight);
+ pos.rx() -= m_itemMargin.width();
+ pos.ry() = 0;
+
+ // Determine the maximum width used in the
+ // 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_itemRects[index].y();
+ const int maxIndex = m_itemRects.count() - 1;
+ while (index <= maxIndex) {
+ QRectF bounds = m_itemRects[index];
+ if (bounds.y() != y) {
+ break;
+ }
+
+ if (bounds.height() > width) {
+ width = bounds.height();
+ }
+
+ ++index;
+ }
+
+ size = QSizeF(width, m_size.height());
}
return QRectF(pos, size);
}
// In the horizontal scrolling case all groups are aligned
// at the top, which decreases the available height. For the
// flipped data this means that the width must be decreased.
- size.rwidth() -= m_groupHeaderMargin + m_groupHeaderHeight;
+ size.rwidth() -= m_groupHeaderHeight;
}
}
if (horizontalScrolling) {
// All group headers will always be aligned on the top and not
// flipped like the other properties
- x += m_groupHeaderMargin + m_groupHeaderHeight;
+ x += m_groupHeaderHeight;
}
- if (m_groupItemIndexes.contains(index) && !horizontalScrolling) {
+ if (m_groupItemIndexes.contains(index)) {
// The item is the first item of a group.
// Increase the y-position to provide space
// for the group header.
// group already before
y += m_groupHeaderMargin;
}
- y += m_groupHeaderHeight;
+
+ if (!horizontalScrolling) {
+ y += m_groupHeaderHeight;
+ }
}
}
qreal KItemListViewLayouter::minimumGroupHeaderWidth() const
{
- return m_groupHeaderHeight * 15 / 2;
+ return 100;
}
#include "kitemlistviewlayouter_p.moc"