KFile
kdirsortfilterproxymodel.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "kdirsortfilterproxymodel.h"
00024
00025 #include <kdirmodel.h>
00026 #include <kfileitem.h>
00027 #include <kdatetime.h>
00028 #include <klocale.h>
00029 #include <kstringhandler.h>
00030 #include <kdebug.h>
00031
00032
00033
00034
00035 KDirSortFilterProxyModel::KDirSortFilterProxyModel(QObject* parent)
00036 : KCategorizedSortFilterProxyModel(parent), d(0)
00037 {
00038 setDynamicSortFilter(true);
00039
00040
00041 setSortCaseSensitivity(Qt::CaseInsensitive);
00042 sort(KDirModel::Name, Qt::AscendingOrder);
00043
00044 setSupportedDragActions(Qt::CopyAction | Qt::MoveAction | Qt::LinkAction | Qt::IgnoreAction);
00045 }
00046
00047 KDirSortFilterProxyModel::~KDirSortFilterProxyModel()
00048 {
00049 }
00050
00051 bool KDirSortFilterProxyModel::hasChildren(const QModelIndex& parent) const
00052 {
00053 const QModelIndex sourceParent = mapToSource(parent);
00054 return sourceModel()->hasChildren(sourceParent);
00055 }
00056
00057 bool KDirSortFilterProxyModel::canFetchMore(const QModelIndex& parent) const
00058 {
00059 const QModelIndex sourceParent = mapToSource(parent);
00060 return sourceModel()->canFetchMore(sourceParent);
00061 }
00062
00063 int KDirSortFilterProxyModel::pointsForPermissions(const QFileInfo &info)
00064 {
00065 int points = 0;
00066
00067 QFile::Permission permissionsCheck[] = { QFile::ReadUser,
00068 QFile::WriteUser,
00069 QFile::ExeUser,
00070 QFile::ReadGroup,
00071 QFile::WriteGroup,
00072 QFile::ExeGroup,
00073 QFile::ReadOther,
00074 QFile::WriteOther,
00075 QFile::ExeOther };
00076
00077 for (int i = 0; i < 9; i++) {
00078 points += info.permission(permissionsCheck[i]) ? 1 : 0;
00079 }
00080
00081 return points;
00082 }
00083
00084 bool KDirSortFilterProxyModel::subSortLessThan(const QModelIndex& left,
00085 const QModelIndex& right) const
00086 {
00087 KDirModel* dirModel = static_cast<KDirModel*>(sourceModel());
00088
00089 const KFileItem leftFileItem = dirModel->itemForIndex(left);
00090 const KFileItem rightFileItem = dirModel->itemForIndex(right);
00091
00092
00093
00094 const bool isLessThan = (sortOrder() == Qt::AscendingOrder);
00095
00096
00097 if (leftFileItem.isDir() && !rightFileItem.isDir()) {
00098 return isLessThan;
00099 } else if (!leftFileItem.isDir() && rightFileItem.isDir()) {
00100 return !isLessThan;
00101 }
00102
00103
00104
00105 if (leftFileItem.isHidden() && !rightFileItem.isHidden()) {
00106 return isLessThan;
00107 } else if (!leftFileItem.isHidden() && rightFileItem.isHidden()) {
00108 return !isLessThan;
00109 }
00110
00111 switch (left.column()) {
00112 case KDirModel::Name: {
00113 return KStringHandler::naturalCompare(leftFileItem.name(), rightFileItem.name(), sortCaseSensitivity()) < 0;
00114 }
00115
00116 case KDirModel::Size: {
00117
00118
00119 if (leftFileItem.isDir() && rightFileItem.isDir()) {
00120 QVariant leftValue = dirModel->data(left, KDirModel::ChildCountRole);
00121 int leftCount = (leftValue.type() == QVariant::Int) ? leftValue.toInt() : KDirModel::ChildCountUnknown;
00122
00123 QVariant rightValue = dirModel->data(right, KDirModel::ChildCountRole);
00124 int rightCount = (rightValue.type() == QVariant::Int) ? rightValue.toInt() : KDirModel::ChildCountUnknown;
00125
00126
00127
00128
00129 if (leftCount == rightCount) {
00130 return KStringHandler::naturalCompare(leftFileItem.name(), rightFileItem.name(), sortCaseSensitivity()) < 0;
00131 }
00132
00133
00134
00135
00136
00137 if (leftCount == KDirModel::ChildCountUnknown) {
00138 return false;
00139 }
00140
00141 if (rightCount == KDirModel::ChildCountUnknown) {
00142 return true;
00143 }
00144
00145
00146
00147 return leftCount < rightCount;
00148 }
00149
00150
00151
00152 if (leftFileItem.size() == rightFileItem.size()) {
00153 return KStringHandler::naturalCompare(leftFileItem.name(), rightFileItem.name(), sortCaseSensitivity()) < 0;
00154 }
00155
00156
00157 return leftFileItem.size() < rightFileItem.size();
00158 }
00159
00160 case KDirModel::ModifiedTime: {
00161 KDateTime leftModifiedTime = leftFileItem.time(KFileItem::ModificationTime).toLocalZone();
00162 KDateTime rightModifiedTime = rightFileItem.time(KFileItem::ModificationTime).toLocalZone();
00163
00164 if (leftModifiedTime == rightModifiedTime) {
00165 return KStringHandler::naturalCompare(leftFileItem.name(), rightFileItem.name(), sortCaseSensitivity()) < 0;
00166 }
00167
00168 return leftModifiedTime < rightModifiedTime;
00169 }
00170
00171 case KDirModel::Permissions: {
00172
00173 QFileInfo leftFileInfo(leftFileItem.url().pathOrUrl());
00174 QFileInfo rightFileInfo(rightFileItem.url().pathOrUrl());
00175
00176 int leftPermissionsPoints = pointsForPermissions(leftFileInfo);
00177 int rightPermissionsPoints = pointsForPermissions(rightFileInfo);
00178
00179 if (leftPermissionsPoints == rightPermissionsPoints) {
00180 return KStringHandler::naturalCompare(leftFileItem.name(), rightFileItem.name(), sortCaseSensitivity()) < 0;
00181 }
00182
00183 return leftPermissionsPoints > rightPermissionsPoints;
00184 }
00185
00186 case KDirModel::Owner: {
00187 if (leftFileItem.user() == rightFileItem.user()) {
00188 return KStringHandler::naturalCompare(leftFileItem.name(), rightFileItem.name(), sortCaseSensitivity()) < 0;
00189 }
00190
00191 return KStringHandler::naturalCompare(leftFileItem.user(), rightFileItem.user()) < 0;
00192 }
00193
00194 case KDirModel::Group: {
00195 if (leftFileItem.group() == rightFileItem.group()) {
00196 return KStringHandler::naturalCompare(leftFileItem.name(), rightFileItem.name(), sortCaseSensitivity()) < 0;
00197 }
00198
00199 return KStringHandler::naturalCompare(leftFileItem.group(), rightFileItem.group()) < 0;
00200 }
00201
00202 case KDirModel::Type: {
00203 if (leftFileItem.mimetype() == rightFileItem.mimetype()) {
00204 return KStringHandler::naturalCompare(leftFileItem.name(), rightFileItem.name(), sortCaseSensitivity()) < 0;
00205 }
00206
00207 return KStringHandler::naturalCompare(leftFileItem.mimeComment(), rightFileItem.mimeComment()) < 0;
00208 }
00209
00210 }
00211
00212
00213
00214 return KCategorizedSortFilterProxyModel::subSortLessThan(left, right);
00215 }