diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 698314c2fc..3f19a20113 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -124,8 +124,10 @@ void KFileItemModel::loadDirectory(const KUrl& url) void KFileItemModel::refreshDirectory(const KUrl& url) { // Refresh all expanded directories first (Bug 295300) - foreach (const KUrl& expandedUrl, m_expandedDirs) { - m_dirLister->openUrl(expandedUrl, KDirLister::Reload); + QHashIterator expandedDirs(m_expandedDirs); + while (expandedDirs.hasNext()) { + expandedDirs.next(); + m_dirLister->openUrl(expandedDirs.value(), KDirLister::Reload); } m_dirLister->openUrl(url, KDirLister::Reload); @@ -432,11 +434,12 @@ bool KFileItemModel::setExpanded(int index, bool expanded) const KFileItem item = m_itemData.at(index)->item; const KUrl url = item.url(); + const KUrl targetUrl = item.targetUrl(); if (expanded) { - m_expandedDirs.insert(url); + m_expandedDirs.insert(targetUrl, url); m_dirLister->openUrl(url, KDirLister::Keep); } else { - m_expandedDirs.remove(url); + m_expandedDirs.remove(targetUrl); m_dirLister->stop(url); removeFilteredChildren(KFileItemList() << item); @@ -478,7 +481,7 @@ int KFileItemModel::expandedParentsCount(int index) const QSet KFileItemModel::expandedDirectories() const { - return m_expandedDirs; + return m_expandedDirs.values().toSet(); } void KFileItemModel::restoreExpandedDirectories(const QSet& urls) @@ -755,8 +758,13 @@ void KFileItemModel::slotItemsAdded(const KUrl& directoryUrl, const KFileItemLis { Q_ASSERT(!items.isEmpty()); - KUrl parentUrl = directoryUrl; - parentUrl.adjustPath(KUrl::RemoveTrailingSlash); + KUrl parentUrl; + if (m_expandedDirs.contains(directoryUrl)) { + parentUrl = m_expandedDirs.value(directoryUrl); + } else { + parentUrl = directoryUrl; + parentUrl.adjustPath(KUrl::RemoveTrailingSlash); + } if (m_requestRole[ExpandedParentsCountRole]) { KFileItem item = items.first(); @@ -1337,7 +1345,7 @@ QHash KFileItemModel::retrieveData(const KFileItem& item, } if (m_requestRole[IsExpandableRole]) { - data.insert(sharedValue("isExpandable"), item.isDir() && item.url() == item.targetUrl()); + data.insert(sharedValue("isExpandable"), item.isDir()); } if (m_requestRole[ExpandedParentsCountRole]) { diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index 1d2d8c1722..5917e68184 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -466,8 +466,8 @@ private: // Cache for KFileItemModel::groups() mutable QList > m_groups; - // Stores the URLs of the expanded directories. - QSet m_expandedDirs; + // Stores the URLs (key: target url, value: url) of the expanded directories. + QHash m_expandedDirs; // URLs that must be expanded. The expanding is initially triggered in setExpanded() // and done step after step in slotCompleted().