Fix expansion levels for search results

Force an expansion level of 0 for search results to prevent
showing tabbed child items without parent items.
This commit is contained in:
Peter Penz 2011-12-14 23:43:46 +01:00
parent 0c1ad320d1
commit b27aefa798
2 changed files with 37 additions and 15 deletions

View file

@ -49,7 +49,7 @@ KFileItemModel::KFileItemModel(KDirLister* dirLister, QObject* parent) :
m_pendingItemsToInsert(),
m_pendingEmitLoadingCompleted(false),
m_groups(),
m_rootExpansionLevel(-1),
m_rootExpansionLevel(UninitializedRootExpansionLevel),
m_expandedUrls(),
m_urlsToExpand()
{
@ -807,7 +807,7 @@ void KFileItemModel::slotClear()
m_resortAllItemsTimer->stop();
m_pendingItemsToInsert.clear();
m_rootExpansionLevel = -1;
m_rootExpansionLevel = UninitializedRootExpansionLevel;
const int removedCount = m_itemData.count();
if (removedCount > 0) {
@ -990,7 +990,7 @@ void KFileItemModel::removeItems(const KFileItemList& items)
}
if (count() <= 0) {
m_rootExpansionLevel = -1;
m_rootExpansionLevel = UninitializedRootExpansionLevel;
}
itemRanges << KItemRange(removedAtIndex, removedCount);
@ -1044,7 +1044,7 @@ void KFileItemModel::removeExpandedItems()
Q_ASSERT(m_rootExpansionLevel >= 0);
removeItems(expandedItems);
m_rootExpansionLevel = -1;
m_rootExpansionLevel = UninitializedRootExpansionLevel;
m_expandedUrls.clear();
}
@ -1141,17 +1141,29 @@ QHash<QByteArray, QVariant> KFileItemModel::retrieveData(const KFileItem& item)
}
if (m_requestRole[ExpansionLevelRole]) {
if (m_rootExpansionLevel < 0 && m_dirLister.data()) {
const QString rootDir = m_dirLister.data()->url().directory(KUrl::AppendTrailingSlash);
m_rootExpansionLevel = rootDir.count('/');
if (m_rootExpansionLevel == 1) {
// Special case: The root is already reached and no parent is available
--m_rootExpansionLevel;
if (m_rootExpansionLevel == UninitializedRootExpansionLevel && m_dirLister.data()) {
const KUrl rootUrl = m_dirLister.data()->url();
const QString protocol = rootUrl.protocol();
const bool isSearchUrl = (protocol.contains("search") || protocol == QLatin1String("nepomuk"));
if (isSearchUrl) {
m_rootExpansionLevel = ForceRootExpansionLevel;
} else {
const QString rootDir = rootUrl.directory(KUrl::AppendTrailingSlash);
m_rootExpansionLevel = rootDir.count('/');
if (m_rootExpansionLevel == 1) {
// Special case: The root is already reached and no parent is available
--m_rootExpansionLevel;
}
}
}
const QString dir = item.url().directory(KUrl::AppendTrailingSlash);
const int level = dir.count('/') - m_rootExpansionLevel - 1;
data.insert("expansionLevel", level);
if (m_rootExpansionLevel == ForceRootExpansionLevel) {
data.insert("expansionLevel", 0);
} else {
const QString dir = item.url().directory(KUrl::AppendTrailingSlash);
const int level = dir.count('/') - m_rootExpansionLevel - 1;
data.insert("expansionLevel", level);
}
}
if (item.isMimeTypeKnown()) {

View file

@ -334,8 +334,18 @@ private:
mutable QList<QPair<int, QVariant> > m_groups;
// Stores the smallest expansion level of the root-URL. Is required to calculate
// the "expansionLevel" role in an efficient way. A value < 0 indicates that
// it has not been initialized yet.
// the "expansionLevel" role in an efficient way. A value < 0 indicates a
// special meaning:
enum RootExpansionLevelTypes
{
// m_rootExpansionLevel is uninitialized and must be determined by checking
// the root URL from the KDirLister.
UninitializedRootExpansionLevel = -1,
// All items should be forced to get an expansion level of 0 even if they
// represent child items. This is useful for slaves that provide no parent items
// for child items like e.g. the search IO slaves.
ForceRootExpansionLevel = -2
};
mutable int m_rootExpansionLevel;
// Stores the URLs of the expanded folders.