mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-19 16:31:21 +00:00
* coding style update to match with http://techbase.kde.org/Policies/Kdelibs_Coding_Style
* minor speed improvements by moving QString, QVariant, KDateTime, ... declarations inside inner scopes; further speed improvements should be possible, but lets do it step by step... svn path=/trunk/KDE/kdebase/apps/; revision=677719
This commit is contained in:
parent
7cd33328af
commit
318bdfa27f
|
@ -65,7 +65,8 @@ DolphinSortFilterProxyModel::DolphinSortFilterProxyModel(QObject* parent) :
|
||||||
}
|
}
|
||||||
|
|
||||||
DolphinSortFilterProxyModel::~DolphinSortFilterProxyModel()
|
DolphinSortFilterProxyModel::~DolphinSortFilterProxyModel()
|
||||||
{}
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void DolphinSortFilterProxyModel::setSorting(DolphinView::Sorting sorting)
|
void DolphinSortFilterProxyModel::setSorting(DolphinView::Sorting sorting)
|
||||||
{
|
{
|
||||||
|
@ -121,61 +122,64 @@ bool DolphinSortFilterProxyModel::lessThanGeneralPurpose(const QModelIndex &left
|
||||||
const KFileItem* leftFileItem = dirModel->itemForIndex(left);
|
const KFileItem* leftFileItem = dirModel->itemForIndex(left);
|
||||||
const KFileItem* rightFileItem = dirModel->itemForIndex(right);
|
const KFileItem* rightFileItem = dirModel->itemForIndex(right);
|
||||||
|
|
||||||
QString leftFileName, rightFileName;
|
|
||||||
KDateTime leftTime, rightTime;
|
|
||||||
switch (sortRole()) {
|
switch (sortRole()) {
|
||||||
case DolphinView::SortByName:
|
case DolphinView::SortByName: {
|
||||||
leftFileName = leftFileItem->name();
|
QString leftFileName(leftFileItem->name());
|
||||||
rightFileName = rightFileItem->name();
|
if (leftFileName.at(0) == '.') {
|
||||||
|
leftFileName = leftFileName.mid(1);
|
||||||
|
}
|
||||||
|
|
||||||
leftFileName = leftFileName.at(0) == '.' ? leftFileName.mid(1) :
|
QString rightFileName(rightFileItem->name());
|
||||||
leftFileName;
|
if (rightFileName.at(0) == '.') {
|
||||||
|
rightFileName = rightFileName.mid(1);
|
||||||
rightFileName = rightFileName.at(0) == '.' ? rightFileName.mid(1) :
|
}
|
||||||
rightFileName;
|
|
||||||
|
|
||||||
// We don't care about case for building categories. We also don't
|
// We don't care about case for building categories. We also don't
|
||||||
// want here to compare by a natural comparation
|
// want here to compare by a natural comparison.
|
||||||
return naturalCompare(leftFileName, rightFileName) < 0;
|
return naturalCompare(leftFileName, rightFileName) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
case DolphinView::SortBySize:
|
case DolphinView::SortBySize:
|
||||||
// If we are sorting by size, show folders first. We will sort them
|
// If we are sorting by size, show folders first. We will sort them
|
||||||
// correctly later
|
// correctly later.
|
||||||
if (leftFileItem->isDir() && !rightFileItem->isDir())
|
return leftFileItem->isDir() && !rightFileItem->isDir();
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
case DolphinView::SortByDate: {
|
||||||
|
KDateTime leftTime, rightTime;
|
||||||
case DolphinView::SortByDate:
|
|
||||||
leftTime.setTime_t(leftFileItem->time(KIO::UDS_MODIFICATION_TIME));
|
leftTime.setTime_t(leftFileItem->time(KIO::UDS_MODIFICATION_TIME));
|
||||||
rightTime.setTime_t(rightFileItem->time(KIO::UDS_MODIFICATION_TIME));
|
rightTime.setTime_t(rightFileItem->time(KIO::UDS_MODIFICATION_TIME));
|
||||||
|
|
||||||
return leftTime > rightTime;
|
return leftTime > rightTime;
|
||||||
|
}
|
||||||
|
|
||||||
case DolphinView::SortByPermissions:
|
case DolphinView::SortByPermissions: {
|
||||||
return naturalCompare(leftFileItem->permissionsString(),
|
return naturalCompare(leftFileItem->permissionsString(),
|
||||||
rightFileItem->permissionsString()) < 0;
|
rightFileItem->permissionsString()) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
case DolphinView::SortByOwner:
|
case DolphinView::SortByOwner: {
|
||||||
return naturalCompare(leftFileItem->user().toLower(),
|
return naturalCompare(leftFileItem->user().toLower(),
|
||||||
rightFileItem->user().toLower()) < 0;
|
rightFileItem->user().toLower()) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
case DolphinView::SortByGroup:
|
case DolphinView::SortByGroup: {
|
||||||
return naturalCompare(leftFileItem->group().toLower(),
|
return naturalCompare(leftFileItem->group().toLower(),
|
||||||
rightFileItem->group().toLower()) < 0;
|
rightFileItem->group().toLower()) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
case DolphinView::SortByType:
|
case DolphinView::SortByType: {
|
||||||
// If we are sorting by size, show folders first. We will sort them
|
// If we are sorting by size, show folders first. We will sort them
|
||||||
// correctly later
|
// correctly later
|
||||||
if (leftFileItem->isDir() && !rightFileItem->isDir())
|
if (leftFileItem->isDir() && !rightFileItem->isDir()) {
|
||||||
return true;
|
return true;
|
||||||
else if (!leftFileItem->isDir() && rightFileItem->isDir())
|
} else if (!leftFileItem->isDir() && rightFileItem->isDir()) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return naturalCompare(leftFileItem->mimeComment().toLower(),
|
return naturalCompare(leftFileItem->mimeComment().toLower(),
|
||||||
rightFileItem->mimeComment().toLower()) < 0;
|
rightFileItem->mimeComment().toLower()) < 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool DolphinSortFilterProxyModel::lessThan(const QModelIndex& left,
|
bool DolphinSortFilterProxyModel::lessThan(const QModelIndex& left,
|
||||||
const QModelIndex& right) const
|
const QModelIndex& right) const
|
||||||
|
@ -191,8 +195,7 @@ bool DolphinSortFilterProxyModel::lessThan(const QModelIndex& left,
|
||||||
// On our priority, folders go above regular files
|
// On our priority, folders go above regular files
|
||||||
if (leftFileItem->isDir() && !rightFileItem->isDir()) {
|
if (leftFileItem->isDir() && !rightFileItem->isDir()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
} else if (!leftFileItem->isDir() && rightFileItem->isDir()) {
|
||||||
else if (!leftFileItem->isDir() && rightFileItem->isDir()) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,33 +203,29 @@ bool DolphinSortFilterProxyModel::lessThan(const QModelIndex& left,
|
||||||
// folders or files
|
// folders or files
|
||||||
if (leftFileItem->isHidden() && !rightFileItem->isHidden()) {
|
if (leftFileItem->isHidden() && !rightFileItem->isHidden()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
} else if (!leftFileItem->isHidden() && rightFileItem->isHidden()) {
|
||||||
else if (!leftFileItem->isHidden() && rightFileItem->isHidden()) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant leftValue, rightValue;
|
|
||||||
QString leftValueString, rightValueString;
|
|
||||||
KDateTime leftTime, rightTime;
|
|
||||||
int leftCount, rightCount;
|
|
||||||
switch (sortRole()) {
|
switch (sortRole()) {
|
||||||
case DolphinView::SortByName:
|
case DolphinView::SortByName: {
|
||||||
// So we are in the same priority, what counts now is their names
|
// So we are in the same priority, what counts now is their names
|
||||||
leftValueString = leftData.toString();
|
QString leftValueString = leftData.toString();
|
||||||
rightValueString = rightData.toString();
|
QString rightValueString = rightData.toString();
|
||||||
|
|
||||||
return sortCaseSensitivity() ? (naturalCompare(leftValueString, rightValueString) < 0) :
|
return sortCaseSensitivity() ? (naturalCompare(leftValueString, rightValueString) < 0) :
|
||||||
(naturalCompare(leftValueString.toLower(), rightValueString.toLower()) < 0);
|
(naturalCompare(leftValueString.toLower(), rightValueString.toLower()) < 0);
|
||||||
|
}
|
||||||
|
|
||||||
case DolphinView::SortBySize:
|
case DolphinView::SortBySize: {
|
||||||
// If we have two folders, what we have to measure is the number of
|
// If we have two folders, what we have to measure is the number of
|
||||||
// items that contains each other
|
// items that contains each other
|
||||||
if (leftFileItem->isDir() && rightFileItem->isDir()) {
|
if (leftFileItem->isDir() && rightFileItem->isDir()) {
|
||||||
leftValue = dirModel->data(left, KDirModel::ChildCountRole);
|
QVariant leftValue = dirModel->data(left, KDirModel::ChildCountRole);
|
||||||
leftCount = leftValue.type() == QVariant::Int ? leftValue.toInt() : KDirModel::ChildCountUnknown;
|
int leftCount = leftValue.type() == QVariant::Int ? leftValue.toInt() : KDirModel::ChildCountUnknown;
|
||||||
|
|
||||||
rightValue = dirModel->data(right, KDirModel::ChildCountRole);
|
QVariant rightValue = dirModel->data(right, KDirModel::ChildCountRole);
|
||||||
rightCount = rightValue.type() == QVariant::Int ? rightValue.toInt() : KDirModel::ChildCountUnknown;
|
int rightCount = rightValue.type() == QVariant::Int ? rightValue.toInt() : KDirModel::ChildCountUnknown;
|
||||||
|
|
||||||
// In the case they two have the same child items, we sort them by
|
// In the case they two have the same child items, we sort them by
|
||||||
// their names. So we have always everything ordered. We also check
|
// their names. So we have always everything ordered. We also check
|
||||||
|
@ -250,63 +249,67 @@ bool DolphinSortFilterProxyModel::lessThan(const QModelIndex& left,
|
||||||
|
|
||||||
// If their sizes are different, sort them by their sizes, as expected
|
// If their sizes are different, sort them by their sizes, as expected
|
||||||
return leftFileItem->size() < rightFileItem->size();
|
return leftFileItem->size() < rightFileItem->size();
|
||||||
|
}
|
||||||
|
|
||||||
case DolphinView::SortByDate:
|
case DolphinView::SortByDate: {
|
||||||
|
KDateTime leftTime, rightTime;
|
||||||
leftTime.setTime_t(leftFileItem->time(KIO::UDS_MODIFICATION_TIME));
|
leftTime.setTime_t(leftFileItem->time(KIO::UDS_MODIFICATION_TIME));
|
||||||
rightTime.setTime_t(rightFileItem->time(KIO::UDS_MODIFICATION_TIME));
|
rightTime.setTime_t(rightFileItem->time(KIO::UDS_MODIFICATION_TIME));
|
||||||
|
|
||||||
if (leftTime == rightTime)
|
if (leftTime == rightTime) {
|
||||||
{
|
return sortCaseSensitivity() ?
|
||||||
return sortCaseSensitivity() ? (naturalCompare(leftFileItem->name(), rightFileItem->name()) < 0) :
|
(naturalCompare(leftFileItem->name(), rightFileItem->name()) < 0) :
|
||||||
(naturalCompare(leftFileItem->name().toLower(), rightFileItem->name().toLower()) < 0);
|
(naturalCompare(leftFileItem->name().toLower(), rightFileItem->name().toLower()) < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return leftTime > rightTime;
|
return leftTime > rightTime;
|
||||||
|
}
|
||||||
|
|
||||||
case DolphinView::SortByPermissions:
|
case DolphinView::SortByPermissions: {
|
||||||
if (leftFileItem->permissionsString() == rightFileItem->permissionsString())
|
if (leftFileItem->permissionsString() == rightFileItem->permissionsString()) {
|
||||||
{
|
return sortCaseSensitivity() ?
|
||||||
return sortCaseSensitivity() ? (naturalCompare(leftFileItem->name(), rightFileItem->name()) < 0) :
|
(naturalCompare(leftFileItem->name(), rightFileItem->name()) < 0) :
|
||||||
(naturalCompare(leftFileItem->name().toLower(), rightFileItem->name().toLower()) < 0);
|
(naturalCompare(leftFileItem->name().toLower(), rightFileItem->name().toLower()) < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return naturalCompare(leftFileItem->permissionsString(),
|
return naturalCompare(leftFileItem->permissionsString(),
|
||||||
rightFileItem->permissionsString()) < 0;
|
rightFileItem->permissionsString()) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
case DolphinView::SortByOwner:
|
case DolphinView::SortByOwner: {
|
||||||
if (leftFileItem->user() == rightFileItem->user())
|
if (leftFileItem->user() == rightFileItem->user()) {
|
||||||
{
|
return sortCaseSensitivity() ?
|
||||||
return sortCaseSensitivity() ? (naturalCompare(leftFileItem->name(), rightFileItem->name()) < 0) :
|
(naturalCompare(leftFileItem->name(), rightFileItem->name()) < 0) :
|
||||||
(naturalCompare(leftFileItem->name().toLower(), rightFileItem->name().toLower()) < 0);
|
(naturalCompare(leftFileItem->name().toLower(), rightFileItem->name().toLower()) < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return naturalCompare(leftFileItem->user(),
|
return naturalCompare(leftFileItem->user(), rightFileItem->user()) < 0;
|
||||||
rightFileItem->user()) < 0;
|
}
|
||||||
|
|
||||||
case DolphinView::SortByGroup:
|
case DolphinView::SortByGroup: {
|
||||||
if (leftFileItem->group() == rightFileItem->group())
|
if (leftFileItem->group() == rightFileItem->group()) {
|
||||||
{
|
|
||||||
return sortCaseSensitivity() ? (naturalCompare(leftFileItem->name(), rightFileItem->name()) < 0) :
|
return sortCaseSensitivity() ? (naturalCompare(leftFileItem->name(), rightFileItem->name()) < 0) :
|
||||||
(naturalCompare(leftFileItem->name().toLower(), rightFileItem->name().toLower()) < 0);
|
(naturalCompare(leftFileItem->name().toLower(), rightFileItem->name().toLower()) < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return naturalCompare(leftFileItem->group(),
|
return naturalCompare(leftFileItem->group(),
|
||||||
rightFileItem->group()) < 0;
|
rightFileItem->group()) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
case DolphinView::SortByType:
|
case DolphinView::SortByType: {
|
||||||
if (leftFileItem->mimetype() == rightFileItem->mimetype())
|
if (leftFileItem->mimetype() == rightFileItem->mimetype()) {
|
||||||
{
|
return sortCaseSensitivity() ?
|
||||||
return sortCaseSensitivity() ? (naturalCompare(leftFileItem->name(), rightFileItem->name()) < 0) :
|
(naturalCompare(leftFileItem->name(), rightFileItem->name()) < 0) :
|
||||||
(naturalCompare(leftFileItem->name().toLower(), rightFileItem->name().toLower()) < 0);
|
(naturalCompare(leftFileItem->name().toLower(), rightFileItem->name().toLower()) < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return naturalCompare(leftFileItem->mimeComment(),
|
return naturalCompare(leftFileItem->mimeComment(),
|
||||||
rightFileItem->mimeComment()) < 0;
|
rightFileItem->mimeComment()) < 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// We have set a SortRole and trust the ProxyModel to do
|
// We have set a SortRole and trust the ProxyModel to do
|
||||||
// the right thing for now.
|
// the right thing for now.
|
||||||
|
|
||||||
return QSortFilterProxyModel::lessThan(left, right);
|
return QSortFilterProxyModel::lessThan(left, right);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue