KDEUI
kcategorizedsortfilterproxymodel.cpp
Go to the documentation of this file.
00001 00022 #include "kcategorizedsortfilterproxymodel.h" 00023 #include "kcategorizedsortfilterproxymodel_p.h" 00024 00025 #include <limits.h> 00026 00027 #include <QItemSelection> 00028 #include <QStringList> 00029 #include <QSize> 00030 00031 #include <kstringhandler.h> 00032 00033 KCategorizedSortFilterProxyModel::KCategorizedSortFilterProxyModel(QObject *parent) 00034 : QSortFilterProxyModel(parent) 00035 , d(new Private()) 00036 00037 { 00038 } 00039 00040 KCategorizedSortFilterProxyModel::~KCategorizedSortFilterProxyModel() 00041 { 00042 delete d; 00043 } 00044 00045 void KCategorizedSortFilterProxyModel::sort(int column, Qt::SortOrder order) 00046 { 00047 d->sortColumn = column; 00048 d->sortOrder = order; 00049 00050 QSortFilterProxyModel::sort(column, order); 00051 } 00052 00053 bool KCategorizedSortFilterProxyModel::isCategorizedModel() const 00054 { 00055 return d->categorizedModel; 00056 } 00057 00058 void KCategorizedSortFilterProxyModel::setCategorizedModel(bool categorizedModel) 00059 { 00060 if (categorizedModel == d->categorizedModel) 00061 { 00062 return; 00063 } 00064 00065 d->categorizedModel = categorizedModel; 00066 00067 invalidate(); 00068 } 00069 00070 int KCategorizedSortFilterProxyModel::sortColumn() const 00071 { 00072 return d->sortColumn; 00073 } 00074 00075 Qt::SortOrder KCategorizedSortFilterProxyModel::sortOrder() const 00076 { 00077 return d->sortOrder; 00078 } 00079 00080 void KCategorizedSortFilterProxyModel::setSortCategoriesByNaturalComparison(bool sortCategoriesByNaturalComparison) 00081 { 00082 if (sortCategoriesByNaturalComparison == d->sortCategoriesByNaturalComparison) 00083 { 00084 return; 00085 } 00086 00087 d->sortCategoriesByNaturalComparison = sortCategoriesByNaturalComparison; 00088 00089 invalidate(); 00090 } 00091 00092 bool KCategorizedSortFilterProxyModel::sortCategoriesByNaturalComparison() const 00093 { 00094 return d->sortCategoriesByNaturalComparison; 00095 } 00096 00097 #ifndef KDE_NO_DEPRECATED 00098 int KCategorizedSortFilterProxyModel::naturalCompare(const QString &a, 00099 const QString &b) 00100 { 00101 return KStringHandler::naturalCompare(a, b); 00102 } 00103 #endif 00104 00105 bool KCategorizedSortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const 00106 { 00107 if (d->categorizedModel) 00108 { 00109 int compare = compareCategories(left, right); 00110 00111 if (compare > 0) // left is greater than right 00112 { 00113 return false; 00114 } 00115 else if (compare < 0) // left is less than right 00116 { 00117 return true; 00118 } 00119 } 00120 00121 return subSortLessThan(left, right); 00122 } 00123 00124 bool KCategorizedSortFilterProxyModel::subSortLessThan(const QModelIndex &left, const QModelIndex &right) const 00125 { 00126 return QSortFilterProxyModel::lessThan(left, right); 00127 } 00128 00129 int KCategorizedSortFilterProxyModel::compareCategories(const QModelIndex &left, const QModelIndex &right) const 00130 { 00131 QVariant l = (left.model() ? left.model()->data(left, CategorySortRole) : QVariant()); 00132 QVariant r = (right.model() ? right.model()->data(right, CategorySortRole) : QVariant()); 00133 00134 Q_ASSERT(l.isValid()); 00135 Q_ASSERT(r.isValid()); 00136 Q_ASSERT(l.type() == r.type()); 00137 00138 if (l.type() == QVariant::String) 00139 { 00140 QString lstr = l.toString(); 00141 QString rstr = r.toString(); 00142 00143 if (d->sortCategoriesByNaturalComparison) 00144 { 00145 return KStringHandler::naturalCompare(lstr, rstr); 00146 } 00147 else 00148 { 00149 if (lstr < rstr) 00150 { 00151 return -1; 00152 } 00153 00154 if (lstr > rstr) 00155 { 00156 return 1; 00157 } 00158 00159 return 0; 00160 } 00161 } 00162 00163 qlonglong lint = l.toLongLong(); 00164 qlonglong rint = r.toLongLong(); 00165 00166 if (lint < rint) 00167 { 00168 return -1; 00169 } 00170 00171 if (lint > rint) 00172 { 00173 return 1; 00174 } 00175 00176 return 0; 00177 }
KDE 4.6 API Reference