* 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:
Peter Penz 2007-06-19 19:28:08 +00:00
parent 7cd33328af
commit 318bdfa27f

View file

@ -65,7 +65,8 @@ DolphinSortFilterProxyModel::DolphinSortFilterProxyModel(QObject* parent) :
} }
DolphinSortFilterProxyModel::~DolphinSortFilterProxyModel() DolphinSortFilterProxyModel::~DolphinSortFilterProxyModel()
{} {
}
void DolphinSortFilterProxyModel::setSorting(DolphinView::Sorting sorting) void DolphinSortFilterProxyModel::setSorting(DolphinView::Sorting sorting)
{ {
@ -118,63 +119,66 @@ bool DolphinSortFilterProxyModel::lessThanGeneralPurpose(const QModelIndex &left
{ {
KDirModel* dirModel = static_cast<KDirModel*>(sourceModel()); KDirModel* dirModel = static_cast<KDirModel*>(sourceModel());
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,
@ -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);
} }