┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews/kfileitemmodel.cpp
diff options
context:
space:
mode:
authorFrank Reininghaus <[email protected]>2011-09-17 14:35:25 +0200
committerFrank Reininghaus <[email protected]>2011-09-17 14:35:25 +0200
commit9424f5a789b98b148e3c6b39738da164c73e0431 (patch)
tree55fb42e69cf35a775ec8966da64a7aea1a5dc397 /src/kitemviews/kfileitemmodel.cpp
parent5070666ad2cd5fe3e559adca00a52aed5d137153 (diff)
Implement restoring expanded folders in Details View
Diffstat (limited to 'src/kitemviews/kfileitemmodel.cpp')
-rw-r--r--src/kitemviews/kfileitemmodel.cpp55
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()