82
82
const int PrepareChunkSize = 101;
83
83
const int FilterChunkSize = 2001;
85
ImageFilterModel::ImageFilterModel(QObject *parent)
86
: KCategorizedSortFilterProxyModel(parent),
87
d_ptr(new ImageFilterModelPrivate)
92
ImageFilterModel::ImageFilterModel(ImageFilterModelPrivate& dd, QObject *parent)
93
: KCategorizedSortFilterProxyModel(parent),
99
void ImageFilterModelPrivate::init(ImageFilterModel *_q)
85
ImageFilterModel::ImageFilterModel(QObject* parent)
86
: KCategorizedSortFilterProxyModel(parent),
87
d_ptr(new ImageFilterModelPrivate)
92
ImageFilterModel::ImageFilterModel(ImageFilterModelPrivate& dd, QObject* parent)
93
: KCategorizedSortFilterProxyModel(parent),
99
void ImageFilterModelPrivate::init(ImageFilterModel* _q)
120
void ImageFilterModel::setSourceModel(QAbstractItemModel *sourceModel)
120
void ImageFilterModel::setSourceModel(QAbstractItemModel* sourceModel)
122
122
// made it protected, only setSourceImageModel is public
123
123
QSortFilterProxyModel::setSourceModel(sourceModel);
126
ImageModel *ImageFilterModel::sourceModel() const
126
ImageModel* ImageFilterModel::sourceModel() const
128
128
Q_D(const ImageFilterModel);
129
129
return d->imageModel;
132
void ImageFilterModel::setSourceImageModel(ImageModel *sourceModel)
132
void ImageFilterModel::setSourceImageModel(ImageModel* sourceModel)
134
134
Q_D(ImageFilterModel);
159
159
connect(d->imageModel, SIGNAL(modelReset()),
160
160
this, SLOT(slotModelReset()));
162
connect(d->imageModel, SIGNAL(imageChange(const ImageChangeset &, const QItemSelection &)),
163
this, SLOT(slotImageChange(const ImageChangeset &)));
162
connect(d->imageModel, SIGNAL(imageChange(const ImageChangeset&, const QItemSelection&)),
163
this, SLOT(slotImageChange(const ImageChangeset&)));
165
connect(d->imageModel, SIGNAL(imageTagChange(const ImageTagChangeset &, const QItemSelection &)),
166
this, SLOT(slotImageTagChange(const ImageTagChangeset &)));
165
connect(d->imageModel, SIGNAL(imageTagChange(const ImageTagChangeset&, const QItemSelection&)),
166
this, SLOT(slotImageTagChange(const ImageTagChangeset&)));
169
169
setSourceModel(d->imageModel);
183
186
return d->sorter.categorizationMode;
184
187
case SortOrderRole:
185
188
return d->sorter.sortRole;
186
//case CategoryCountRole:
187
// return categoryCount(d->imageModel->imageInfoRef(mapToSource(index)));
189
//case CategoryCountRole:
190
// return categoryCount(d->imageModel->imageInfoRef(mapToSource(index)));
188
191
case CategoryAlbumIdRole:
189
192
return d->imageModel->imageInfoRef(mapToSource(index)).albumId();
190
193
case CategoryFormatRole:
402
411
bool ImageFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
404
413
Q_D(const ImageFilterModel);
405
415
if (source_parent.isValid())
408
420
qlonglong id = d->imageModel->imageId(source_row);
409
421
QHash<qlonglong, bool>::const_iterator it = d->filterResults.constFind(id);
410
423
if (it != d->filterResults.constEnd())
411
425
return it.value();
413
428
// usually done in thread and cache, unless source model changed
414
429
return d->filter.matches(d->imageModel->imageInfo(source_row));
431
446
// If no preparation is needed, the first step is skipped.
432
447
// If filter version changes, both will discard old package and send them to packageDiscarded.
434
connect(this, SIGNAL(packageToPrepare(const ImageFilterModelTodoPackage &)),
449
connect(this, SIGNAL(packageToPrepare(const ImageFilterModelTodoPackage&)),
435
450
preparer, SLOT(process(ImageFilterModelTodoPackage)));
437
connect(this, SIGNAL(packageToFilter(const ImageFilterModelTodoPackage &)),
438
filterer, SLOT(process(ImageFilterModelTodoPackage)));
440
connect(preparer, SIGNAL(processed(const ImageFilterModelTodoPackage &)),
441
filterer, SLOT(process(ImageFilterModelTodoPackage)));
443
connect(filterer, SIGNAL(processed(const ImageFilterModelTodoPackage &)),
444
this, SLOT(packageFinished(const ImageFilterModelTodoPackage &)));
446
connect(preparer, SIGNAL(discarded(const ImageFilterModelTodoPackage &)),
447
this, SLOT(packageDiscarded(const ImageFilterModelTodoPackage &)));
449
connect(filterer, SIGNAL(discarded(const ImageFilterModelTodoPackage &)),
450
this, SLOT(packageDiscarded(const ImageFilterModelTodoPackage &)));
452
connect(this, SIGNAL(packageToFilter(const ImageFilterModelTodoPackage&)),
453
filterer, SLOT(process(ImageFilterModelTodoPackage)));
455
connect(preparer, SIGNAL(processed(const ImageFilterModelTodoPackage&)),
456
filterer, SLOT(process(ImageFilterModelTodoPackage)));
458
connect(filterer, SIGNAL(processed(const ImageFilterModelTodoPackage&)),
459
this, SLOT(packageFinished(const ImageFilterModelTodoPackage&)));
461
connect(preparer, SIGNAL(discarded(const ImageFilterModelTodoPackage&)),
462
this, SLOT(packageDiscarded(const ImageFilterModelTodoPackage&)));
464
connect(filterer, SIGNAL(discarded(const ImageFilterModelTodoPackage&)),
465
this, SLOT(packageDiscarded(const ImageFilterModelTodoPackage&)));
453
468
void ImageFilterModelPrivate::infosToProcess(const QList<ImageInfo>& infos, bool forReAdd)
488
511
// incorporate result
489
512
QHash<qlonglong, bool>::const_iterator it = package.filterResults.constBegin();
490
514
for (; it != package.filterResults.constEnd(); ++it)
491
516
filterResults.insert(it.key(), it.value());
493
519
// re-add if necessary
494
520
if (package.isForReAdd)
496
522
emit reAddImageInfos(package.infos.toList());
497
524
if (sentOutForReAdd == 1) // last package
498
526
emit reAddingFinished();
501
530
// decrement counters
503
533
if (package.isForReAdd)
504
535
--sentOutForReAdd;
506
538
// If all packages have returned, filtered and readded, and no more are expected,
507
539
// and there is need to tell the filter result to the view, do that
694
747
const int size = sizeof(int) * 2;
699
753
for (int i=0; i<size; i++)
701
755
*p = 'a' + (number & 0xF);
705
760
return QString::fromLatin1(c);
708
763
QString ImageFilterModel::categoryIdentifier(const ImageInfo& info) const
710
765
Q_D(const ImageFilterModel);
711
767
switch (d->sorter.categorizationMode)
713
769
case ImageSortSettings::NoCategories:
736
792
Q_D(ImageFilterModel);
738
794
if (!d->imageModel || d->imageModel->isEmpty())
741
799
// already scheduled to re-filter?
742
800
if (d->updateFilterTimer->isActive())
745
805
// do we filter at all?
746
806
if (!d->filter.isFilteringByTags() && !d->filter.isFilteringByText())
749
811
// is one of our images affected?
750
812
foreach (const qlonglong& id, changeset.ids())