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, 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     // Iterate over the list of filters
00189     for (it = l.begin(); it !=  l.end(); ++it) {
00190         KisFilterSP f = KisFilterRegistry::instance()->get(*it);
00191         // Check if filter support the preview and work with the current colorspace
00192         if (f->supportsPreview() && f->workWith( m_original->colorSpace() ) ) {
00193             std::list<KisFilterConfiguration*> configlist = f->listOfExamplesConfiguration(m_thumb);
00194             // apply the filter for each of example of configuration
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                 //KisThreadPool::instance()->enqueue(icon->thread());
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         //ev->m_iconItem->setPixmap(QPixmap(*p));
00231         arrangeItemsInGrid();
00232     }
00233 }
KDE Home | KDE Accessibility Home | Description of Access Keys