┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/kitemviews/kfileitemmodel.cpp5
-rw-r--r--src/kitemviews/kitemlistview.cpp56
-rw-r--r--src/kitemviews/kitemlistview.h6
3 files changed, 37 insertions, 30 deletions
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp
index f9ba397fa..ede3c3623 100644
--- a/src/kitemviews/kfileitemmodel.cpp
+++ b/src/kitemviews/kfileitemmodel.cpp
@@ -471,7 +471,10 @@ bool KFileItemModel::isExpandable(int index) const
int KFileItemModel::expandedParentsCount(int index) const
{
if (index >= 0 && index < count()) {
- return m_itemData.at(index)->values.value("expandedParentsCount").toInt();
+ const int parentsCount = m_itemData.at(index)->values.value("expandedParentsCount").toInt();
+ if (parentsCount > 0) {
+ return parentsCount;
+ }
}
return 0;
}
diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp
index 247354419..4f0d68d2e 100644
--- a/src/kitemviews/kitemlistview.cpp
+++ b/src/kitemviews/kitemlistview.cpp
@@ -833,6 +833,7 @@ void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges)
if (!hasMultipleRanges) {
doLayout(animateChangedItemCount(count) ? Animation : NoAnimation, index, count);
+ updateSiblingsInformation();
}
}
@@ -841,7 +842,9 @@ void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges)
}
if (hasMultipleRanges) {
+ m_endTransactionAnimationHint = NoAnimation;
endTransaction();
+ updateSiblingsInformation();
}
}
@@ -919,6 +922,7 @@ void KItemListView::slotItemsRemoved(const KItemRangeList& itemRanges)
m_activeTransactions = 0;
doLayout(animateChangedItemCount(count) ? Animation : NoAnimation, index, -count);
m_activeTransactions = activeTransactions;
+ updateSiblingsInformation();
}
}
@@ -927,7 +931,9 @@ void KItemListView::slotItemsRemoved(const KItemRangeList& itemRanges)
}
if (hasMultipleRanges) {
+ m_endTransactionAnimationHint = NoAnimation;
endTransaction();
+ updateSiblingsInformation();
}
}
@@ -954,14 +960,8 @@ void KItemListView::slotItemsMoved(const KItemRange& itemRange, const QList<int>
}
}
- 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,
@@ -1353,15 +1353,9 @@ void KItemListView::doLayout(LayoutAnimationHint hint, int changedIndex, int cha
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);
@@ -1409,10 +1403,10 @@ void KItemListView::doLayout(LayoutAnimationHint hint, int changedIndex, int cha
}
if (supportsExpanding && changedCount == 0) {
- if (firstExpansionIndex < 0) {
- firstExpansionIndex = i;
+ if (firstSibblingIndex < 0) {
+ firstSibblingIndex = i;
}
- lastExpansionIndex = i;
+ lastSibblingIndex = i;
}
}
@@ -1476,8 +1470,9 @@ void KItemListView::doLayout(LayoutAnimationHint hint, int changedIndex, int cha
recycleWidget(m_visibleItems.value(index));
}
- if (supportsExpanding) {
- updateSiblingsInformation(firstExpansionIndex, lastExpansionIndex);
+ if (supportsExpanding && firstSibblingIndex >= 0) {
+ Q_ASSERT(lastSibblingIndex >= 0);
+ updateSiblingsInformation(firstSibblingIndex, lastSibblingIndex);
}
if (m_grouped) {
@@ -1999,16 +1994,21 @@ void KItemListView::updateGroupHeaderHeight()
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;
@@ -2054,10 +2054,12 @@ void KItemListView::updateSiblingsInformation(int firstIndex, int lastIndex)
}
}
+ 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);
diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h
index dbb746d92..118ed2f03 100644
--- a/src/kitemviews/kitemlistview.h
+++ b/src/kitemviews/kitemlistview.h
@@ -498,10 +498,12 @@ private:
/**
* Updates the siblings-information for all visible items that are inside
- * the range of \p firstIndex and \p lastIndex.
+ * the range of \p firstIndex and \p lastIndex. If firstIndex or lastIndex
+ * is smaller than 0, the siblings-information for all visible items gets
+ * updated.
* @see KItemListWidget::setSiblingsInformation()
*/
- void updateSiblingsInformation(int firstIndex, int lastIndex);
+ void updateSiblingsInformation(int firstIndex = -1, int lastIndex = -1);
/**
* Helper method for updateExpansionIndicators().