00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "kis_filters_listview.h"
00023
00024 #include <qapplication.h>
00025 #include "qtimer.h"
00026 #include "qpainter.h"
00027 #include "qpixmap.h"
00028
00029 #include <kglobalsettings.h>
00030
00031 #include "kis_types.h"
00032 #include "kis_paint_device.h"
00033 #include "kis_cursor.h"
00034 #include "kis_image.h"
00035 #include "kis_paint_layer.h"
00036 #include "kis_group_layer.h"
00037 #include "kis_filter.h"
00038 #include "kis_filter_strategy.h"
00039 #include "kis_thread_pool.h"
00040
00041
00042
00043 KisFiltersThumbnailThread::KisFiltersThumbnailThread(QIconView * parent, KisFiltersIconViewItem * iconItem, KisFilterConfiguration * config, KisFilter * filter, KisPaintDeviceSP dev, const QRect & bounds, KisProfile * profile)
00044 : m_parent(parent)
00045 , m_iconItem(iconItem)
00046 , m_config(config)
00047 , m_filter(filter)
00048 , m_dev(dev)
00049 , m_bounds(bounds)
00050 , m_profile(profile)
00051 {
00052 }
00053
00054 KisFiltersThumbnailThread::~KisFiltersThumbnailThread()
00055 {
00056 m_iconItem->resetThread();
00057 }
00058
00059 void KisFiltersThumbnailThread::run()
00060 {
00061 if (m_canceled) return;
00062
00063 KisPaintDeviceSP thumbPreview = new KisPaintDevice(*m_dev);
00064 m_filter->disableProgress();
00065 m_filter->process(thumbPreview, thumbPreview, m_config, m_bounds);
00066
00067 if (!m_canceled) {
00068 m_pixmap = thumbPreview->convertToQImage(m_profile);
00069
00070 qApp->postEvent(m_parent, new KisThumbnailDoneEvent (m_iconItem, m_pixmap));
00071
00072 }
00073 }
00074
00075 QPixmap KisFiltersThumbnailThread::pixmap()
00076 {
00077 return m_pixmap;
00078 }
00079
00080 void KisFiltersThumbnailThread::cancel()
00081 {
00082 m_canceled = true;
00083 m_filter->cancel();
00084
00085 }
00086
00087
00088
00089
00090 KisFiltersIconViewItem::KisFiltersIconViewItem(QIconView * parent, const QString & text, const QPixmap & icon,
00091 KisID id, KisFilter* filter, KisFilterConfiguration* filterConfig,
00092 KisPaintDeviceSP thumb, const QRect & bounds, KisProfile * profile)
00093 : QIconViewItem(parent, text, icon)
00094 , m_id(id)
00095 , m_filter(filter)
00096 , m_filterconfig(filterConfig)
00097 {
00098 m_thread = new KisFiltersThumbnailThread(parent, this, filterConfig, filter, thumb, bounds, profile);
00099 }
00100
00101 KisFiltersIconViewItem::~KisFiltersIconViewItem()
00102 {
00103 if (m_thread) m_thread->cancel();
00104 }
00105
00106
00107
00108
00109 KisFiltersListView::KisFiltersListView(QWidget* parent, const char* name)
00110 : KIconView(parent, name)
00111 , m_original(0)
00112 , m_profile(0)
00113 {
00114 init();
00115 }
00116
00117 KisFiltersListView::KisFiltersListView(KisLayerSP layer, QWidget* parent, const char * name)
00118 : KIconView(parent, name)
00119 , m_original(0)
00120 , m_profile(0)
00121 {
00122 KisPaintLayer* pl = dynamic_cast<KisPaintLayer*>(layer.data());
00123 if(pl != 0)
00124 {
00125 m_original = pl->paintDevice();
00126 buildPreview();
00127 }
00128 init();
00129 }
00130
00131 KisFiltersListView::KisFiltersListView(KisPaintDeviceSP device, QWidget* parent, const char * name)
00132 : KIconView(parent, name)
00133 , m_original(device)
00134 , m_profile(0)
00135 {
00136 buildPreview();
00137 init();
00138 }
00139
00140 void KisFiltersListView::init()
00141 {
00142 setCaption(i18n("Filters List"));
00143 setItemsMovable(false);
00144 setSelectionMode(QIconView::Single);
00145 setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding ));
00146 setMinimumWidth(160);
00147
00148 }
00149
00150 void KisFiltersListView::setLayer(KisLayerSP layer) {
00151 KisPaintLayer* pl = dynamic_cast<KisPaintLayer*>(layer.data());
00152 if(pl == 0)
00153 return;
00154 KisPaintDeviceSP npd = pl->paintDevice();
00155 if(npd!= m_original)
00156 {
00157 m_original = npd;
00158 buildPreview();
00159 }
00160 }
00161
00162 void KisFiltersListView::setCurrentFilter(KisID filter)
00163 {
00164 setCurrentItem(findItem(filter.name()));
00165 }
00166
00167 void KisFiltersListView::buildPreview()
00168 {
00169 QTime t;
00170 if(m_original== 0)
00171 return;
00172
00173 QApplication::setOverrideCursor(KisCursor::waitCursor());
00174 t.start();
00175 m_thumb = m_original->createThumbnailDevice(150, 150);
00176
00177 t.start();
00178 QRect bounds = m_thumb->exactBounds();
00179 QPixmap pm(bounds.width(), bounds.height());
00180 QPainter gc(&pm);
00181 gc.fillRect(0, 0, bounds.width(), bounds.height(), backgroundColor());
00182 gc.end();
00183
00184 t.start();
00185 KisIDList l = KisFilterRegistry::instance()->listKeys();
00186 KisIDList::iterator it;
00187 it = l.begin();
00188
00189 for (it = l.begin(); it != l.end(); ++it) {
00190 KisFilterSP f = KisFilterRegistry::instance()->get(*it);
00191
00192 if (f->supportsPreview() && f->workWith( m_original->colorSpace() ) ) {
00193 std::list<KisFilterConfiguration*> configlist = f->listOfExamplesConfiguration(m_thumb);
00194
00195 for(std::list<KisFilterConfiguration*>::iterator itc = configlist.begin();
00196 itc != configlist.end();
00197 itc++)
00198 {
00199 KisFiltersIconViewItem * icon = new KisFiltersIconViewItem( this, (*it).name(), pm, *it, f, *itc, m_thumb, bounds, m_profile );
00200
00201 icon->thread()->runDirectly();
00202 }
00203 }
00204 }
00205 QApplication::restoreOverrideCursor();
00206 }
00207
00208
00209 void KisFiltersListView::customEvent(QCustomEvent * e)
00210 {
00211 KisThumbnailDoneEvent * ev = dynamic_cast<KisThumbnailDoneEvent *>(e);
00212 if (ev) {
00213 QPixmap * p = ev->m_iconItem->pixmap();
00214 QImage img = ev->m_image;
00215 int x, y;
00216
00217 if (p->width() > img.width())
00218 x = (p->width() - img.width()) / 2;
00219 else
00220 x = 0;
00221 if (p->height() > img.height())
00222 y = (p->height() - img.height()) / 2;
00223 else
00224 y = 0;
00225
00226 QPainter gc(p);
00227 gc.drawImage(QPoint(x,y), img);
00228 gc.end();
00229
00230
00231 arrangeItemsInGrid();
00232 }
00233 }