19
19
#include "kis_bookmarked_filter_configurations_model.h"
21
#include <QFutureWatcher>
23
#include <QSignalMapper>
24
#include <QtConcurrentRun>
22
26
#include <filter/kis_filter.h>
23
27
#include <filter/kis_filter_configuration.h>
27
31
KisPaintDeviceSP thumb;
28
32
KisFilterSP filter;
29
33
QHash<int, QImage> previewCache;
34
QSignalMapper* previewCacheWatcher;
35
QHash<int, QFutureWatcher<QImage>*> previewCacheFutureWatcher;
32
38
KisBookmarkedFilterConfigurationsModel::KisBookmarkedFilterConfigurationsModel(KisPaintDeviceSP thumb, KisFilterSP filter)
36
42
d->filter = filter;
43
d->previewCacheWatcher = new QSignalMapper(this);
44
connect(d->previewCacheWatcher, SIGNAL(mapped(int)), SLOT(previewUpdated(int)));
39
47
KisBookmarkedFilterConfigurationsModel::~KisBookmarkedFilterConfigurationsModel()
49
foreach(QFutureWatcher<QImage>* watcher, d->previewCacheFutureWatcher)
57
QImage generatePreview(const KisFilter* filter, KisPaintDeviceSP thumb, KisFilterConfiguration* config)
59
KisPaintDeviceSP target = new KisPaintDevice(*thumb);
60
filter->process(target, QRect(0, 0, 100, 100), config);
61
return target->convertToQImage(0);
44
64
QVariant KisBookmarkedFilterConfigurationsModel::data(const QModelIndex &index, int role) const
46
66
if (!index.isValid()) {
49
69
if (role == Qt::DecorationRole) {
70
if (!flags(index).testFlag(Qt::ItemIsEnabled)) return QVariant();
50
71
if (!d->previewCache.contains(index.row())) {
51
KisPaintDeviceSP target = new KisPaintDevice(*d->thumb);
52
d->filter->process(target, QRect(0, 0, 100, 100), configuration(index));
53
d->previewCache[index.row()] = target->convertToQImage(0);
73
QFutureWatcher<QImage>* watcher = new QFutureWatcher<QImage>();
74
connect(watcher, SIGNAL(finished()), d->previewCacheWatcher, SLOT(map()));
75
watcher->setFuture(QtConcurrent::run(generatePreview, d->filter, d->thumb, configuration(index)));
77
d->previewCacheWatcher->setMapping(watcher, index.row());
79
d->previewCacheFutureWatcher[index.row()] = watcher;
81
d->previewCache[index.row()] = QImage();
55
83
return d->previewCache[index.row()];
64
92
if (config) return config;
65
93
return d->filter->defaultConfiguration(d->thumb);
96
void KisBookmarkedFilterConfigurationsModel::previewUpdated(int i)
98
d->previewCache[i] = d->previewCacheFutureWatcher[i]->result();
99
delete d->previewCacheFutureWatcher[i];
100
d->previewCacheFutureWatcher.remove(i);
101
emit dataChanged(createIndex(i,0), createIndex(i,0));
104
#include "kis_bookmarked_filter_configurations_model.moc"