diff options
| author | Peter Penz <[email protected]> | 2012-02-02 15:58:42 +0100 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2012-02-02 16:03:15 +0100 |
| commit | 452c8b8ec8b18e62ff4bae0e49e3f5002ae2f301 (patch) | |
| tree | b7c0eef479dc175d3fa212f18eebb49fe1793d1d /src | |
| parent | 4de262196a47f6baf64bdb054f02c52aae979e8b (diff) | |
Fix sorting issue when sorting by "size"
Root cause of the issue was an overflow in:
result = a - b;
where result is 'int' and a and b are 'KIO::filesize_t'.
BUG: 293086
FIXED-IN: 4.8.1
Diffstat (limited to 'src')
| -rw-r--r-- | src/kitemviews/kfileitemmodel.cpp | 26 | ||||
| -rw-r--r-- | src/kitemviews/kfileitemmodel.h | 6 |
2 files changed, 26 insertions, 6 deletions
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index d64954698..95c960b3d 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -1301,21 +1301,24 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b) const case SizeRole: { if (itemA.isDir()) { - Q_ASSERT(itemB.isDir()); // see "if (m_sortFoldersFirst || m_sortRole == SizeRole)" above + // See "if (m_sortFoldersFirst || m_sortRole == SizeRole)" in KFileItemModel::lessThan(): + Q_ASSERT(itemB.isDir()); const QVariant valueA = a->values.value("size"); const QVariant valueB = b->values.value("size"); - - if (valueA.isNull()) { + if (valueA.isNull() && valueB.isNull()) { + result = 0; + } else if (valueA.isNull()) { result = -1; } else if (valueB.isNull()) { result = +1; } else { - result = valueA.value<KIO::filesize_t>() - valueB.value<KIO::filesize_t>(); + result = fileSizeCompare(valueA.value<KIO::filesize_t>(), valueB.value<KIO::filesize_t>()); } } else { - Q_ASSERT(!itemB.isDir()); // see "if (m_sortFoldersFirst || m_sortRole == SizeRole)" above - result = itemA.size() - itemB.size(); + // See "if (m_sortFoldersFirst || m_sortRole == SizeRole)" in KFileItemModel::lessThan(): + Q_ASSERT(!itemB.isDir()); + result = fileSizeCompare(itemA.size(), itemB.size()); } break; } @@ -1940,4 +1943,15 @@ KFileItemList KFileItemModel::childItems(const KFileItem& item) const return items; } +int KFileItemModel::fileSizeCompare(KIO::filesize_t a, KIO::filesize_t b) +{ + if (a > b) { + return +1; + } else if (a < b) { + return -1; + } else { + return 0; + } +} + #include "kfileitemmodel.moc" diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index ff816c85c..d819c3734 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -330,6 +330,12 @@ private: */ KFileItemList childItems(const KFileItem& item) const; + /** + * Helper method for sortRoleCompare(). + * @return 0 if both sizes are equal, +1 if a > b and -1 if a < b. + */ + static int fileSizeCompare(KIO::filesize_t a, KIO::filesize_t b); + private: QWeakPointer<KDirLister> m_dirLister; |
