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, bool filterForAdjustmentLayers, const char* name)
00110 : KIconView(parent, name)
00111 , m_original(0)
00112 , m_profile(0)
00113 , m_filterForAdjustmentLayers(filterForAdjustmentLayers)
00114 {
00115 init();
00116 }
00117
00118 KisFiltersListView::KisFiltersListView(QWidget * parent, const char * name, WFlags f, bool filterForAdjustmentLayers)
00119 : KIconView(parent, name, f)
00120 , m_original(0)
00121 , m_profile(0)
00122 , m_filterForAdjustmentLayers(filterForAdjustmentLayers)
00123 {
00124 init();
00125 }
00126
00127 KisFiltersListView::KisFiltersListView(KisLayerSP layer, QWidget* parent, bool filterForAdjustmentLayers, const char * name)
00128 : KIconView(parent, name)
00129 , m_original(0)
00130 , m_profile(0)
00131 , m_filterForAdjustmentLayers(filterForAdjustmentLayers)
00132 {
00133 KisPaintLayer* pl = dynamic_cast<KisPaintLayer*>(layer.data());
00134 if(pl != 0)
00135 {
00136 m_original = pl->paintDevice();
00137 buildPreview();
00138 }
00139 init();
00140 }
00141
00142 KisFiltersListView::KisFiltersListView(KisPaintDeviceSP device, QWidget* parent, bool filterForAdjustmentLayers, const char * name)
00143 : KIconView(parent, name)
00144 , m_original(device)
00145 , m_profile(0)
00146 , m_filterForAdjustmentLayers(filterForAdjustmentLayers)
00147 {
00148 buildPreview();
00149 init();
00150 }
00151
00152 void KisFiltersListView::init()
00153 {
00154 setCaption(i18n("Filters List"));
00155 setItemsMovable(false);
00156 setSelectionMode(QIconView::Single);
00157 setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding ));
00158 setMinimumWidth(160);
00159
00160 }
00161
00162 void KisFiltersListView::setLayer(KisLayerSP layer) {
00163 KisPaintLayer* pl = dynamic_cast<KisPaintLayer*>(layer.data());
00164 if(pl == 0)
00165 return;
00166 KisPaintDeviceSP npd = pl->paintDevice();
00167 if(npd!= m_original)
00168 {
00169 m_original = npd;
00170 buildPreview();
00171 }
00172 }
00173
00174 void KisFiltersListView::setCurrentFilter(KisID filter)
00175 {
00176 setCurrentItem(findItem(filter.name()));
00177 }
00178
00179 void KisFiltersListView::buildPreview()
00180 {
00181 QTime t;
00182 if(m_original== 0)
00183 return;
00184
00185 QApplication::setOverrideCursor(KisCursor::waitCursor());
00186 t.start();
00187 m_thumb = m_original->createThumbnailDevice(150, 150);
00188
00189 t.start();
00190 QRect bounds = m_thumb->exactBounds();
00191 QPixmap pm(bounds.width(), bounds.height());
00192 QPainter gc(&pm);
00193 gc.fillRect(0, 0, bounds.width(), bounds.height(), backgroundColor());
00194 gc.end();
00195
00196 t.start();
00197 KisIDList l = KisFilterRegistry::instance()->listKeys();
00198 KisIDList::iterator it;
00199 it = l.begin();
00200
00201 for (it = l.begin(); it != l.end(); ++it) {
00202 KisFilterSP f = KisFilterRegistry::instance()->get(*it);
00203
00204 if (f->supportsPreview() && f->workWith( m_original->colorSpace() ) ) {
00205
00206 if (m_filterForAdjustmentLayers) {
00207 kdDebug() << "We're filtering for adj layers, and this filter (" << f->id().name() << ") supports them: " << f->supportsAdjustmentLayers() << endl;
00208 if(!f->supportsAdjustmentLayers()) continue;
00209 }
00210 std::list<KisFilterConfiguration*> configlist = f->listOfExamplesConfiguration(m_thumb);
00211
00212 for(std::list<KisFilterConfiguration*>::iterator itc = configlist.begin();
00213 itc != configlist.end();
00214 itc++)
00215 {
00216 KisFiltersIconViewItem * icon = new KisFiltersIconViewItem( this, (*it).name(), pm, *it, f, *itc, m_thumb, bounds, m_profile );
00217
00218 icon->thread()->runDirectly();
00219 }
00220 }
00221 }
00222 QApplication::restoreOverrideCursor();
00223 }
00224
00225
00226 void KisFiltersListView::customEvent(QCustomEvent * e)
00227 {
00228 KisThumbnailDoneEvent * ev = dynamic_cast<KisThumbnailDoneEvent *>(e);
00229 if (ev) {
00230 QPixmap * p = ev->m_iconItem->pixmap();
00231 QImage img = ev->m_image;
00232 int x, y;
00233
00234 if (p->width() > img.width())
00235 x = (p->width() - img.width()) / 2;
00236 else
00237 x = 0;
00238 if (p->height() > img.height())
00239 y = (p->height() - img.height()) / 2;
00240 else
00241 y = 0;
00242
00243 QPainter gc(p);
00244 gc.drawImage(QPoint(x,y), img);
00245 gc.end();
00246
00247
00248 arrangeItemsInGrid();
00249 }
00250 }