diff options
| author | Frank Reininghaus <[email protected]> | 2011-09-17 14:35:25 +0200 |
|---|---|---|
| committer | Frank Reininghaus <[email protected]> | 2011-09-17 14:35:25 +0200 |
| commit | 9424f5a789b98b148e3c6b39738da164c73e0431 (patch) | |
| tree | 55fb42e69cf35a775ec8966da64a7aea1a5dc397 /src/kitemviews/kfileitemmodel.cpp | |
| parent | 5070666ad2cd5fe3e559adca00a52aed5d137153 (diff) | |
Implement restoring expanded folders in Details View
Diffstat (limited to 'src/kitemviews/kfileitemmodel.cpp')
| -rw-r--r-- | src/kitemviews/kfileitemmodel.cpp | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index ca1583752..f5d8d41a2 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -45,7 +45,10 @@ KFileItemModel::KFileItemModel(KDirLister* dirLister, QObject* parent) : m_minimumUpdateIntervalTimer(0), m_maximumUpdateIntervalTimer(0), m_pendingItemsToInsert(), - m_rootExpansionLevel(-1) + m_pendingEmitLoadingCompleted(false), + m_rootExpansionLevel(-1), + m_expandedUrls(), + m_restoredExpandedUrls() { resetRoles(); m_requestRole[NameRole] = true; @@ -306,14 +309,18 @@ bool KFileItemModel::setExpanded(int index, bool expanded) return false; } + const KUrl url = m_sortedItems.at(index).url(); if (expanded) { - const KUrl url = m_sortedItems.at(index).url(); + m_expandedUrls.insert(url); + KDirLister* dirLister = m_dirLister.data(); if (dirLister) { dirLister->openUrl(url, KDirLister::Keep); return true; } } else { + m_expandedUrls.remove(url); + KFileItemList itemsToRemove; const int expansionLevel = data(index)["expansionLevel"].toInt(); ++index; @@ -344,6 +351,16 @@ bool KFileItemModel::isExpandable(int index) const return false; } +QSet<KUrl> KFileItemModel::expandedUrls() const +{ + return m_expandedUrls; +} + +void KFileItemModel::restoreExpandedUrls(const QSet<KUrl>& urls) +{ + m_restoredExpandedUrls = urls; +} + void KFileItemModel::onGroupRoleChanged(const QByteArray& current, const QByteArray& previous) { Q_UNUSED(previous); @@ -381,13 +398,38 @@ void KFileItemModel::onSortRoleChanged(const QByteArray& current, const QByteArr void KFileItemModel::slotCompleted() { - if (m_minimumUpdateIntervalTimer->isActive()) { + if (m_restoredExpandedUrls.isEmpty() && m_minimumUpdateIntervalTimer->isActive()) { // dispatchPendingItems() will be called when the timer // has been expired. + m_pendingEmitLoadingCompleted = true; return; } + m_pendingEmitLoadingCompleted = false; dispatchPendingItemsToInsert(); + + if (!m_restoredExpandedUrls.isEmpty()) { + // Try to find a URL that can be expanded. + // Note that the parent folder must be expanded before any of its subfolders become visible. + // Therefore, some URLs in m_restoredExpandedUrls might not be visible yet + // -> we expand the first visible URL we find in m_restoredExpandedUrls. + foreach(const KUrl& url, m_restoredExpandedUrls) { + const int index = m_items.value(url, -1); + if (index >= 0) { + // We have found an expandable URL. Expand it and return - when + // the dir lister has finished, this slot will be called again. + m_restoredExpandedUrls.remove(url); + setExpanded(index, true); + return; + } + } + + // None of the URLs in m_restoredExpandedUrls could be found in the model. This can happen + // if these URLs have been deleted in the meantime. + m_restoredExpandedUrls.clear(); + } + + emit loadingCompleted(); m_minimumUpdateIntervalTimer->start(); } @@ -492,6 +534,8 @@ void KFileItemModel::slotClear() m_data.clear(); emit itemsRemoved(KItemRangeList() << KItemRange(0, removedCount)); } + + m_expandedUrls.clear(); } void KFileItemModel::slotClear(const KUrl& url) @@ -505,6 +549,10 @@ void KFileItemModel::dispatchPendingItemsToInsert() insertItems(m_pendingItemsToInsert); m_pendingItemsToInsert.clear(); } + + if (m_pendingEmitLoadingCompleted) { + emit loadingCompleted(); + } } void KFileItemModel::insertItems(const KFileItemList& items) @@ -669,6 +717,7 @@ void KFileItemModel::removeExpandedItems() removeItems(expandedItems); m_rootExpansionLevel = -1; + m_expandedUrls.clear(); } void KFileItemModel::resetRoles() |
