~ubuntu-branches/ubuntu/raring/koffice/raring

« back to all changes in this revision

Viewing changes to krita/ui/kis_bookmarked_filter_configurations_model.cc

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Riddell
  • Date: 2010-12-06 15:30:09 UTC
  • mfrom: (0.13.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20101206153009-yf0dqbp9l7fzwxi8
Tags: 1:2.2.91-0ubuntu1
New upstream RC release

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 */
18
18
 
19
19
#include "kis_bookmarked_filter_configurations_model.h"
 
20
 
 
21
#include <QFutureWatcher>
20
22
#include <QPixmap>
 
23
#include <QSignalMapper>
 
24
#include <QtConcurrentRun>
21
25
 
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;
30
36
};
31
37
 
32
38
KisBookmarkedFilterConfigurationsModel::KisBookmarkedFilterConfigurationsModel(KisPaintDeviceSP thumb, KisFilterSP filter)
34
40
{
35
41
    d->thumb = thumb;
36
42
    d->filter = filter;
 
43
    d->previewCacheWatcher = new QSignalMapper(this);
 
44
    connect(d->previewCacheWatcher, SIGNAL(mapped(int)), SLOT(previewUpdated(int)));
37
45
}
38
46
 
39
47
KisBookmarkedFilterConfigurationsModel::~KisBookmarkedFilterConfigurationsModel()
40
48
{
 
49
    foreach(QFutureWatcher<QImage>* watcher, d->previewCacheFutureWatcher)
 
50
    {
 
51
      watcher->cancel();
 
52
      delete watcher;
 
53
    }
41
54
    delete d;
42
55
}
43
56
 
 
57
QImage generatePreview(const KisFilter* filter, KisPaintDeviceSP thumb, KisFilterConfiguration* config)
 
58
{
 
59
    KisPaintDeviceSP target = new KisPaintDevice(*thumb);
 
60
    filter->process(target, QRect(0, 0, 100, 100), config);
 
61
    return target->convertToQImage(0);
 
62
}
 
63
 
44
64
QVariant KisBookmarkedFilterConfigurationsModel::data(const QModelIndex &index, int role) const
45
65
{
46
66
    if (!index.isValid()) {
47
67
        return QVariant();
48
68
    }
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);
 
72
            
 
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)));
 
76
            
 
77
            d->previewCacheWatcher->setMapping(watcher, index.row());
 
78
            
 
79
            d->previewCacheFutureWatcher[index.row()] = watcher;
 
80
            
 
81
            d->previewCache[index.row()] = QImage();
54
82
        }
55
83
        return d->previewCache[index.row()];
56
84
    } else {
64
92
    if (config) return config;
65
93
    return d->filter->defaultConfiguration(d->thumb);
66
94
}
 
95
 
 
96
void KisBookmarkedFilterConfigurationsModel::previewUpdated(int i)
 
97
{
 
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));
 
102
}
 
103
 
 
104
#include "kis_bookmarked_filter_configurations_model.moc"