if (!hasMultipleRanges) {
doLayout(animateChangedItemCount(count) ? Animation : NoAnimation, index, count);
+ updateSiblingsInformation();
}
}
}
if (hasMultipleRanges) {
+ m_endTransactionAnimationHint = NoAnimation;
endTransaction();
+ updateSiblingsInformation();
}
}
m_activeTransactions = 0;
doLayout(animateChangedItemCount(count) ? Animation : NoAnimation, index, -count);
m_activeTransactions = activeTransactions;
+ updateSiblingsInformation();
}
}
}
if (hasMultipleRanges) {
+ m_endTransactionAnimationHint = NoAnimation;
endTransaction();
+ updateSiblingsInformation();
}
}
}
}
- if (supportsItemExpanding()) {
- // The siblings information only gets updated in KItemListView::doLayout() if
- // items have been inserted or removed. In the case of just moving the items
- // the siblings must be updated manually:
- updateSiblingsInformation(firstVisibleMovedIndex, lastVisibleMovedIndex);
- }
-
doLayout(NoAnimation);
+ updateSiblingsInformation();
}
void KItemListView::slotItemsChanged(const KItemRangeList& itemRanges,
const int lastVisibleIndex = m_layouter->lastVisibleIndex();
- int firstExpansionIndex = -1;
- int lastExpansionIndex = -1;
+ int firstSibblingIndex = -1;
+ int lastSibblingIndex = -1;
const bool supportsExpanding = supportsItemExpanding();
- if (supportsExpanding && changedCount != 0) {
- // Any inserting or removing of items might result in changing the siblings-information
- // of other visible items.
- firstExpansionIndex = firstVisibleIndex;
- lastExpansionIndex = lastVisibleIndex;
- }
QList<int> reusableItems = recycleInvisibleItems(firstVisibleIndex, lastVisibleIndex, hint);
}
if (supportsExpanding && changedCount == 0) {
- if (firstExpansionIndex < 0) {
- firstExpansionIndex = i;
+ if (firstSibblingIndex < 0) {
+ firstSibblingIndex = i;
}
- lastExpansionIndex = i;
+ lastSibblingIndex = i;
}
}
recycleWidget(m_visibleItems.value(index));
}
- if (supportsExpanding) {
- updateSiblingsInformation(firstExpansionIndex, lastExpansionIndex);
+ if (supportsExpanding && firstSibblingIndex >= 0) {
+ Q_ASSERT(lastSibblingIndex >= 0);
+ updateSiblingsInformation(firstSibblingIndex, lastSibblingIndex);
}
if (m_grouped) {
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);
void KItemListView::updateSiblingsInformation(int firstIndex, int lastIndex)
{
- const int firstVisibleIndex = m_layouter->firstVisibleIndex();
- const int lastVisibleIndex = m_layouter->lastVisibleIndex();
- const bool isRangeVisible = firstIndex >= 0 &&
- lastIndex >= firstIndex &&
- lastIndex >= firstVisibleIndex &&
- firstIndex <= lastVisibleIndex;
- if (!isRangeVisible) {
+ if (!supportsItemExpanding()) {
return;
}
+ if (firstIndex < 0 || lastIndex < 0) {
+ firstIndex = m_layouter->firstVisibleIndex();
+ lastIndex = m_layouter->lastVisibleIndex();
+ } else {
+ const bool isRangeVisible = (firstIndex <= m_layouter->lastVisibleIndex() &&
+ lastIndex >= m_layouter->firstVisibleIndex());
+ if (!isRangeVisible) {
+ return;
+ }
+ }
+
int previousParents = 0;
QBitArray previousSiblings;
}
}
+ Q_ASSERT(previousParents >= 0);
for (int i = rootIndex; i <= lastIndex; ++i) {
// Update the parent-siblings in case if the current item represents
// a child or an upper parent.
const int currentParents = m_model->expandedParentsCount(i);
+ Q_ASSERT(currentParents >= 0);
if (previousParents < currentParents) {
previousParents = currentParents;
previousSiblings.resize(currentParents);