37
37
#include "semanticinfodirmodel.h"
42
43
AbstractSortedDirModelFilter::AbstractSortedDirModelFilter(SortedDirModel* model)
47
mModel->addFilter(this);
48
mModel->addFilter(this);
51
52
AbstractSortedDirModelFilter::~AbstractSortedDirModelFilter()
54
mModel->removeFilter(this);
55
mModel->removeFilter(this);
59
59
struct SortedDirModelPrivate {
60
60
#ifdef GWENVIEW_SEMANTICINFO_BACKEND_NONE
61
KDirModel* mSourceModel;
61
KDirModel* mSourceModel;
63
SemanticInfoDirModel* mSourceModel;
63
SemanticInfoDirModel* mSourceModel;
65
QStringList mBlackListedExtensions;
66
QList<AbstractSortedDirModelFilter*> mFilters;
67
QTimer mDelayedApplyFiltersTimer;
68
MimeTypeUtils::Kinds mKindFilter;
65
QStringList mBlackListedExtensions;
66
QList<AbstractSortedDirModelFilter*> mFilters;
67
QTimer mDelayedApplyFiltersTimer;
68
MimeTypeUtils::Kinds mKindFilter;
72
71
SortedDirModel::SortedDirModel(QObject* parent)
73
72
: KDirSortFilterProxyModel(parent)
74
73
, d(new SortedDirModelPrivate)
76
75
#ifdef GWENVIEW_SEMANTICINFO_BACKEND_NONE
77
d->mSourceModel = new KDirModel(this);
76
d->mSourceModel = new KDirModel(this);
79
d->mSourceModel = new SemanticInfoDirModel(this);
81
setSourceModel(d->mSourceModel);
82
d->mDelayedApplyFiltersTimer.setInterval(0);
83
d->mDelayedApplyFiltersTimer.setSingleShot(true);
84
connect(&d->mDelayedApplyFiltersTimer, SIGNAL(timeout()), SLOT(doApplyFilters()));
88
SortedDirModel::~SortedDirModel() {
93
MimeTypeUtils::Kinds SortedDirModel::kindFilter() const {
94
return d->mKindFilter;
98
void SortedDirModel::setKindFilter(MimeTypeUtils::Kinds kindFilter) {
99
if (d->mKindFilter == kindFilter) {
102
d->mKindFilter = kindFilter;
107
void SortedDirModel::adjustKindFilter(MimeTypeUtils::Kinds kinds, bool set) {
108
MimeTypeUtils::Kinds kindFilter = d->mKindFilter;
112
kindFilter &= ~kinds;
114
setKindFilter(kindFilter);
118
void SortedDirModel::addFilter(AbstractSortedDirModelFilter* filter) {
119
d->mFilters << filter;
124
void SortedDirModel::removeFilter(AbstractSortedDirModelFilter* filter) {
125
d->mFilters.removeAll(filter);
130
KDirLister* SortedDirModel::dirLister() const {
131
return d->mSourceModel->dirLister();
135
void SortedDirModel::reload() {
136
#ifndef GWENVIEW_SEMANTICINFO_BACKEND_NONE
137
d->mSourceModel->clearSemanticInfoCache();
139
dirLister()->updateDirectory(dirLister()->url());
143
void SortedDirModel::setBlackListedExtensions(const QStringList& list) {
144
d->mBlackListedExtensions = list;
148
KFileItem SortedDirModel::itemForIndex(const QModelIndex& index) const {
149
if (!index.isValid()) {
153
QModelIndex sourceIndex = mapToSource(index);
154
return d->mSourceModel->itemForIndex(sourceIndex);
158
KUrl SortedDirModel::urlForIndex(const QModelIndex& index) const {
78
d->mSourceModel = new SemanticInfoDirModel(this);
80
setSourceModel(d->mSourceModel);
81
d->mDelayedApplyFiltersTimer.setInterval(0);
82
d->mDelayedApplyFiltersTimer.setSingleShot(true);
83
connect(&d->mDelayedApplyFiltersTimer, SIGNAL(timeout()), SLOT(doApplyFilters()));
86
SortedDirModel::~SortedDirModel()
91
MimeTypeUtils::Kinds SortedDirModel::kindFilter() const
93
return d->mKindFilter;
96
void SortedDirModel::setKindFilter(MimeTypeUtils::Kinds kindFilter)
98
if (d->mKindFilter == kindFilter) {
101
d->mKindFilter = kindFilter;
105
void SortedDirModel::adjustKindFilter(MimeTypeUtils::Kinds kinds, bool set)
107
MimeTypeUtils::Kinds kindFilter = d->mKindFilter;
111
kindFilter &= ~kinds;
113
setKindFilter(kindFilter);
116
void SortedDirModel::addFilter(AbstractSortedDirModelFilter* filter)
118
d->mFilters << filter;
122
void SortedDirModel::removeFilter(AbstractSortedDirModelFilter* filter)
124
d->mFilters.removeAll(filter);
128
KDirLister* SortedDirModel::dirLister() const
130
return d->mSourceModel->dirLister();
133
void SortedDirModel::reload()
135
#ifndef GWENVIEW_SEMANTICINFO_BACKEND_NONE
136
d->mSourceModel->clearSemanticInfoCache();
138
dirLister()->updateDirectory(dirLister()->url());
141
void SortedDirModel::setBlackListedExtensions(const QStringList& list)
143
d->mBlackListedExtensions = list;
146
KFileItem SortedDirModel::itemForIndex(const QModelIndex& index) const
148
if (!index.isValid()) {
152
QModelIndex sourceIndex = mapToSource(index);
153
return d->mSourceModel->itemForIndex(sourceIndex);
156
KUrl SortedDirModel::urlForIndex(const QModelIndex& index) const
159
158
KFileItem item = itemForIndex(index);
160
159
return item.isNull() ? KUrl() : item.url();
164
KFileItem SortedDirModel::itemForSourceIndex(const QModelIndex& sourceIndex) const {
165
if (!sourceIndex.isValid()) {
168
return d->mSourceModel->itemForIndex(sourceIndex);
172
QModelIndex SortedDirModel::indexForItem(const KFileItem& item) const {
174
return QModelIndex();
177
QModelIndex sourceIndex = d->mSourceModel->indexForItem(item);
178
return mapFromSource(sourceIndex);
182
QModelIndex SortedDirModel::indexForUrl(const KUrl& url) const {
183
if (!url.isValid()) {
184
return QModelIndex();
186
QModelIndex sourceIndex = d->mSourceModel->indexForUrl(url);
187
return mapFromSource(sourceIndex);
191
bool SortedDirModel::filterAcceptsRow(int row, const QModelIndex& parent) const {
192
QModelIndex index = d->mSourceModel->index(row, 0, parent);
193
KFileItem fileItem = d->mSourceModel->itemForIndex(index);
195
MimeTypeUtils::Kinds kind = MimeTypeUtils::fileItemKind(fileItem);
196
if (d->mKindFilter != MimeTypeUtils::Kinds() && !(d->mKindFilter & kind)) {
200
if (kind != MimeTypeUtils::KIND_DIR && kind != MimeTypeUtils::KIND_ARCHIVE) {
201
int dotPos = fileItem.name().lastIndexOf('.');
203
QString extension = fileItem.name().mid(dotPos + 1).toLower();
204
if (d->mBlackListedExtensions.contains(extension)) {
162
KFileItem SortedDirModel::itemForSourceIndex(const QModelIndex& sourceIndex) const
164
if (!sourceIndex.isValid()) {
167
return d->mSourceModel->itemForIndex(sourceIndex);
170
QModelIndex SortedDirModel::indexForItem(const KFileItem& item) const
173
return QModelIndex();
176
QModelIndex sourceIndex = d->mSourceModel->indexForItem(item);
177
return mapFromSource(sourceIndex);
180
QModelIndex SortedDirModel::indexForUrl(const KUrl& url) const
182
if (!url.isValid()) {
183
return QModelIndex();
185
QModelIndex sourceIndex = d->mSourceModel->indexForUrl(url);
186
return mapFromSource(sourceIndex);
189
bool SortedDirModel::filterAcceptsRow(int row, const QModelIndex& parent) const
191
QModelIndex index = d->mSourceModel->index(row, 0, parent);
192
KFileItem fileItem = d->mSourceModel->itemForIndex(index);
194
MimeTypeUtils::Kinds kind = MimeTypeUtils::fileItemKind(fileItem);
195
if (d->mKindFilter != MimeTypeUtils::Kinds() && !(d->mKindFilter & kind)) {
199
if (kind != MimeTypeUtils::KIND_DIR && kind != MimeTypeUtils::KIND_ARCHIVE) {
200
int dotPos = fileItem.name().lastIndexOf('.');
202
QString extension = fileItem.name().mid(dotPos + 1).toLower();
203
if (d->mBlackListedExtensions.contains(extension)) {
208
207
#ifndef GWENVIEW_SEMANTICINFO_BACKEND_NONE
209
if (!d->mSourceModel->semanticInfoAvailableForIndex(index)) {
210
Q_FOREACH(const AbstractSortedDirModelFilter* filter, d->mFilters) {
211
// Make sure we have semanticinfo, otherwise retrieve it and
212
// return false, we will be called again later when it is
214
if (filter->needsSemanticInfo()) {
215
d->mSourceModel->retrieveSemanticInfoForIndex(index);
208
if (!d->mSourceModel->semanticInfoAvailableForIndex(index)) {
209
Q_FOREACH(const AbstractSortedDirModelFilter * filter, d->mFilters) {
210
// Make sure we have semanticinfo, otherwise retrieve it and
211
// return false, we will be called again later when it is
213
if (filter->needsSemanticInfo()) {
214
d->mSourceModel->retrieveSemanticInfoForIndex(index);
222
Q_FOREACH(const AbstractSortedDirModelFilter* filter, d->mFilters) {
223
if (!filter->acceptsIndex(index)) {
228
return KDirSortFilterProxyModel::filterAcceptsRow(row, parent);
221
Q_FOREACH(const AbstractSortedDirModelFilter * filter, d->mFilters) {
222
if (!filter->acceptsIndex(index)) {
227
return KDirSortFilterProxyModel::filterAcceptsRow(row, parent);
232
AbstractSemanticInfoBackEnd* SortedDirModel::semanticInfoBackEnd() const {
230
AbstractSemanticInfoBackEnd* SortedDirModel::semanticInfoBackEnd() const
233
232
#ifdef GWENVIEW_SEMANTICINFO_BACKEND_NONE
236
return d->mSourceModel->semanticInfoBackEnd();
235
return d->mSourceModel->semanticInfoBackEnd();
241
239
#ifndef GWENVIEW_SEMANTICINFO_BACKEND_NONE
242
SemanticInfo SortedDirModel::semanticInfoForSourceIndex(const QModelIndex& sourceIndex) const {
243
return d->mSourceModel->semanticInfoForIndex(sourceIndex);
240
SemanticInfo SortedDirModel::semanticInfoForSourceIndex(const QModelIndex& sourceIndex) const
242
return d->mSourceModel->semanticInfoForIndex(sourceIndex);
248
void SortedDirModel::applyFilters() {
249
d->mDelayedApplyFiltersTimer.start();
253
void SortedDirModel::doApplyFilters() {
254
QSortFilterProxyModel::invalidateFilter();
258
bool SortedDirModel::lessThan(const QModelIndex& left, const QModelIndex& right) const {
259
const KFileItem leftItem = itemForSourceIndex(left);
260
const KFileItem rightItem = itemForSourceIndex(right);
262
const bool leftIsDirOrArchive = ArchiveUtils::fileItemIsDirOrArchive(leftItem);
263
const bool rightIsDirOrArchive = ArchiveUtils::fileItemIsDirOrArchive(rightItem);
265
if (leftIsDirOrArchive != rightIsDirOrArchive) {
266
return leftIsDirOrArchive;
269
if (sortRole() != KDirModel::ModifiedTime) {
270
return KDirSortFilterProxyModel::lessThan(left, right);
273
const KDateTime leftDate = TimeUtils::dateTimeForFileItem(leftItem);
274
const KDateTime rightDate = TimeUtils::dateTimeForFileItem(rightItem);
276
return leftDate < rightDate;
246
void SortedDirModel::applyFilters()
248
d->mDelayedApplyFiltersTimer.start();
251
void SortedDirModel::doApplyFilters()
253
QSortFilterProxyModel::invalidateFilter();
256
bool SortedDirModel::lessThan(const QModelIndex& left, const QModelIndex& right) const
258
const KFileItem leftItem = itemForSourceIndex(left);
259
const KFileItem rightItem = itemForSourceIndex(right);
261
const bool leftIsDirOrArchive = ArchiveUtils::fileItemIsDirOrArchive(leftItem);
262
const bool rightIsDirOrArchive = ArchiveUtils::fileItemIsDirOrArchive(rightItem);
264
if (leftIsDirOrArchive != rightIsDirOrArchive) {
265
return leftIsDirOrArchive;
268
if (sortRole() != KDirModel::ModifiedTime) {
269
return KDirSortFilterProxyModel::lessThan(left, right);
272
const KDateTime leftDate = TimeUtils::dateTimeForFileItem(leftItem);
273
const KDateTime rightDate = TimeUtils::dateTimeForFileItem(rightItem);
275
return leftDate < rightDate;
280
278
bool SortedDirModel::hasDocuments() const
282
const int count = rowCount();
286
for (int row = 0; row < count; ++row) {
287
const QModelIndex idx = index(row, 0);
288
const KFileItem item = itemForIndex(idx);
289
if (!ArchiveUtils::fileItemIsDirOrArchive(item)) {
280
const int count = rowCount();
284
for (int row = 0; row < count; ++row) {
285
const QModelIndex idx = index(row, 0);
286
const KFileItem item = itemForIndex(idx);
287
if (!ArchiveUtils::fileItemIsDirOrArchive(item)) {