krita

kis_filters_listview.cc

00001 /*
00002  * This file is part of Krita
00003  *
00004  * Copyright (c) 2005 Cyrille Berger <cberger@cberger.net>
00005  *
00006  *  This program is free software; you can redistribute it and/or modify
00007  *  it under the terms of the GNU General Public License as published by
00008  *  the Free Software Foundation; either version 2 of the License, or
00009  *  (at your option) any later version.
00010  *
00011  *  This program is distributed in the hope that it will be useful,
00012  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *  GNU General Public License for more details.
00015  *
00016  *  You should have received a copy of the GNU General Public License
00017  *  along with this program; if not, write to the Free Software
00018  *  Foundation, Inc., 51 Franklin Street, Fifth Floor,
00019  * Boston, MA 02110-1301, USA.
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     // Iterate over the list of filters
00201     for (it = l.begin(); it !=  l.end(); ++it) {
00202         KisFilterSP f = KisFilterRegistry::instance()->get(*it);
00203         // Check if filter support the preview and work with the current colorspace
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             // apply the filter for each of example of configuration
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                 //KisThreadPool::instance()->enqueue(icon->thread());
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         //ev->m_iconItem->setPixmap(QPixmap(*p));
00248         arrangeItemsInGrid();
00249     }
00250 }
KDE Home | KDE Accessibility Home | Description of Access Keys