X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/a237f42ee3f4e5d190d5553637f4fa2ffbe5bc7c..0222d552811efb7049de2d024247b0b8eaeffe2b:/src/kitemviews/kfileitemmodel.cpp diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 0d851dcd9..d64954698 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -33,7 +34,7 @@ KFileItemModel::KFileItemModel(KDirLister* dirLister, QObject* parent) : KItemModelBase("name", parent), m_dirLister(dirLister), - m_naturalSorting(true), + m_naturalSorting(KGlobalSettings::naturalSorting()), m_sortFoldersFirst(true), m_sortRole(NameRole), m_roles(), @@ -63,7 +64,7 @@ KFileItemModel::KFileItemModel(KDirLister* dirLister, QObject* parent) : Q_ASSERT(dirLister); connect(dirLister, SIGNAL(canceled()), this, SLOT(slotCanceled())); - connect(dirLister, SIGNAL(completed()), this, SLOT(slotCompleted())); + connect(dirLister, SIGNAL(completed(KUrl)), this, SLOT(slotCompleted())); connect(dirLister, SIGNAL(newItems(KFileItemList)), this, SLOT(slotNewItems(KFileItemList))); connect(dirLister, SIGNAL(itemsDeleted(KFileItemList)), this, SLOT(slotItemsDeleted(KFileItemList))); connect(dirLister, SIGNAL(refreshItems(QList >)), this, SLOT(slotRefreshItems(QList >))); @@ -95,6 +96,8 @@ KFileItemModel::KFileItemModel(KDirLister* dirLister, QObject* parent) : connect(m_resortAllItemsTimer, SIGNAL(timeout()), this, SLOT(resortAllItems())); Q_ASSERT(m_minimumUpdateIntervalTimer->interval() <= m_maximumUpdateIntervalTimer->interval()); + + connect(KGlobalSettings::self(), SIGNAL(naturalSortingChanged()), this, SLOT(slotNaturalSortingChanged())); } KFileItemModel::~KFileItemModel() @@ -183,6 +186,20 @@ bool KFileItemModel::showHiddenFiles() const return dirLister ? dirLister->showingDotFiles() : false; } +void KFileItemModel::setShowFoldersOnly(bool enabled) +{ + KDirLister* dirLister = m_dirLister.data(); + if (dirLister) { + dirLister->setDirOnlyMode(enabled); + } +} + +bool KFileItemModel::showFoldersOnly() const +{ + KDirLister* dirLister = m_dirLister.data(); + return dirLister ? dirLister->dirOnlyMode() : false; +} + QMimeData* KFileItemModel::createMimeData(const QSet& indexes) const { QMimeData* data = new QMimeData(); @@ -367,6 +384,7 @@ void KFileItemModel::setRoles(const QSet& roles) } } + m_groups.clear(); resetRoles(); QSetIterator it(roles); @@ -467,7 +485,7 @@ void KFileItemModel::setExpanded(const QSet& urls) return; } - const int pos = dirLister->url().url().length(); + const int pos = dirLister->url().path().length(); // Assure that each sub-path of the URLs that should be // expanded is added to m_urlsToExpand too. KDirLister @@ -478,7 +496,7 @@ void KFileItemModel::setExpanded(const QSet& urls) const KUrl& url = it1.next(); KUrl urlToExpand = dirLister->url(); - const QStringList subDirs = url.url().mid(pos).split(QDir::separator()); + const QStringList subDirs = url.path().mid(pos).split(QDir::separator()); for (int i = 0; i < subDirs.count(); ++i) { urlToExpand.addPath(subDirs.at(i)); m_urlsToExpand.insert(urlToExpand); @@ -847,6 +865,12 @@ void KFileItemModel::slotClear(const KUrl& url) Q_UNUSED(url); } +void KFileItemModel::slotNaturalSortingChanged() +{ + m_naturalSorting = KGlobalSettings::naturalSorting(); + resortAllItems(); +} + void KFileItemModel::dispatchPendingItemsToInsert() { if (!m_pendingItemsToInsert.isEmpty()) { @@ -1101,6 +1125,30 @@ KFileItemModel::Role KFileItemModel::roleIndex(const QByteArray& role) const return rolesHash.value(role, NoRole); } +QByteArray KFileItemModel::roleByteArray(Role role) const +{ + static const char* const roles[RolesCount] = { + 0, // NoRole + "name", + "size", + "date", + "permissions", + "owner", + "group", + "type", + "destination", + "path", + "comment", + "tags", + "rating", + "isDir", + "isExpanded", + "isExpandable", + "expansionLevel" + }; + return roles[role]; +} + QHash KFileItemModel::retrieveData(const KFileItem& item) const { // It is important to insert only roles that are fast to retrieve. E.g. @@ -1187,12 +1235,8 @@ QHash KFileItemModel::retrieveData(const KFileItem& item) if (forceRootExpansionLevel) { m_rootExpansionLevel = ForceRootExpansionLevel; } else { - const QString rootDir = rootUrl.directory(KUrl::AppendTrailingSlash); + const QString rootDir = rootUrl.path(KUrl::AddTrailingSlash); m_rootExpansionLevel = rootDir.count('/'); - if (m_rootExpansionLevel == 1) { - // Special case: The root is already reached and no parent is available - --m_rootExpansionLevel; - } } } @@ -1200,7 +1244,7 @@ QHash KFileItemModel::retrieveData(const KFileItem& item) data.insert("expansionLevel", -1); } else { const QString dir = item.url().directory(KUrl::AppendTrailingSlash); - const int level = dir.count('/') - m_rootExpansionLevel - 1; + const int level = dir.count('/') - m_rootExpansionLevel; data.insert("expansionLevel", level); } } @@ -1254,18 +1298,7 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b) const case NameRole: // The name role is handled as default fallback after the switch break; - - case DateRole: { - const KDateTime dateTimeA = itemA.time(KFileItem::ModificationTime); - const KDateTime dateTimeB = itemB.time(KFileItem::ModificationTime); - if (dateTimeA < dateTimeB) { - result = -1; - } else if (dateTimeA > dateTimeB) { - result = +1; - } - break; - } - + case SizeRole: { if (itemA.isDir()) { Q_ASSERT(itemB.isDir()); // see "if (m_sortFoldersFirst || m_sortRole == SizeRole)" above @@ -1287,29 +1320,36 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b) const break; } - case TypeRole: { - result = QString::compare(a->values.value("type").toString(), - b->values.value("type").toString()); + case DateRole: { + const KDateTime dateTimeA = itemA.time(KFileItem::ModificationTime); + const KDateTime dateTimeB = itemB.time(KFileItem::ModificationTime); + if (dateTimeA < dateTimeB) { + result = -1; + } else if (dateTimeA > dateTimeB) { + result = +1; + } break; } - - case CommentRole: { - result = QString::compare(a->values.value("comment").toString(), - b->values.value("comment").toString()); + + case RatingRole: { + result = a->values.value("rating").toInt() - b->values.value("rating").toInt(); break; } - + + case PermissionsRole: + case OwnerRole: + case GroupRole: + case TypeRole: + case DestinationRole: + case PathRole: + case CommentRole: case TagsRole: { - result = QString::compare(a->values.value("tags").toString(), - b->values.value("tags").toString()); + const QByteArray role = roleByteArray(m_sortRole); + result = QString::compare(a->values.value(role).toString(), + b->values.value(role).toString()); break; } - - case RatingRole: { - result = a->values.value("rating").toInt() - b->values.value("rating").toInt(); - break; - } - + default: break; }