20#include "tqsignalmapper.h"
24#include <tqapplication.h>
25#include <tdemessagebox.h>
28#include <kis_cursor.h>
31#include "kis_part_layer.h"
35#include "kis_filter.h"
37#include "kis_paint_device.h"
38#include "kis_paint_layer.h"
39#include "kis_filter_manager.h"
40#include "kis_filter_config_widget.h"
41#include "kis_previewwidget.h"
42#include "kis_previewdialog.h"
43#include "kis_filter_registry.h"
44#include "kis_transaction.h"
45#include "kis_undo_adapter.h"
46#include "kis_previewdialog.h"
47#include "kis_previewwidget.h"
48#include "kis_painter.h"
49#include "kis_selection.h"
51#include "kis_canvas_subject.h"
53#include "kis_transaction.h"
54#include <kis_progress_display_interface.h>
56KisFilterManager::KisFilterManager(KisView * view, KisDoc * doc)
62 m_lastFilterConfig = 0;
67 m_filterMapper =
new TQSignalMapper(
this);
69 connect(m_filterMapper, TQ_SIGNAL(mapped(
int)),
this, TQ_SLOT(slotApplyFilter(
int)));
73KisFilterManager::~KisFilterManager()
80void KisFilterManager::setup(TDEActionCollection * ac)
88 TDEActionMenu * other = 0;
89 TDEActionMenu * am = 0;
91 m_filterList = KisFilterRegistry::instance()->listKeys();
93 for ( KisIDList::Iterator it = m_filterList.begin(); it != m_filterList.end(); ++it ) {
94 f = KisFilterRegistry::instance()->get(*it);
97 TQString s = f->menuCategory();
98 if (s ==
"adjust" && !m_filterActionMenus.find(
"adjust")) {
99 am =
new TDEActionMenu(i18n(
"Adjust"), ac,
"adjust_filters");
100 m_filterActionMenus.insert(
"adjust", am);
103 else if (s ==
"artistic" && !m_filterActionMenus.find(
"artistic")) {
104 am =
new TDEActionMenu(i18n(
"Artistic"), ac,
"artistic_filters");
105 m_filterActionMenus.insert(
"artistic", am);
108 else if (s ==
"blur" && !m_filterActionMenus.find(
"blur")) {
109 am =
new TDEActionMenu(i18n(
"Blur"), ac,
"blur_filters");
110 m_filterActionMenus.insert(
"blur", am);
113 else if (s ==
"colors" && !m_filterActionMenus.find(
"colors")) {
114 am =
new TDEActionMenu(i18n(
"Colors"), ac,
"color_filters");
115 m_filterActionMenus.insert(
"colors", am);
118 else if (s ==
"decor" && !m_filterActionMenus.find(
"decor")) {
119 am =
new TDEActionMenu(i18n(
"Decor"), ac,
"decor_filters");
120 m_filterActionMenus.insert(
"decor", am);
123 else if (s ==
"edge" && !m_filterActionMenus.find(
"edge")) {
124 am =
new TDEActionMenu(i18n(
"Edge Detection"), ac,
"edge_filters");
125 m_filterActionMenus.insert(
"edge", am);
128 else if (s ==
"emboss" && !m_filterActionMenus.find(
"emboss")) {
129 am =
new TDEActionMenu(i18n(
"Emboss"), ac,
"emboss_filters");
130 m_filterActionMenus.insert(
"emboss", am);
133 else if (s ==
"enhance" && !m_filterActionMenus.find(
"enhance")) {
134 am =
new TDEActionMenu(i18n(
"Enhance"), ac,
"enhance_filters");
135 m_filterActionMenus.insert(
"enhance", am);
138 else if (s ==
"map" && !m_filterActionMenus.find(
"map")) {
139 am =
new TDEActionMenu(i18n(
"Map"), ac,
"map_filters");
140 m_filterActionMenus.insert(
"map", am);
143 else if (s ==
"nonphotorealistic" && !m_filterActionMenus.find(
"nonphotorealistic")) {
144 am =
new TDEActionMenu(i18n(
"Non-photorealistic"), ac,
"nonphotorealistic_filters");
145 m_filterActionMenus.insert(
"nonphotorealistic", am);
148 else if (s ==
"other" && !m_filterActionMenus.find(
"other")) {
149 other =
new TDEActionMenu(i18n(
"Other"), ac,
"misc_filters");
150 m_filterActionMenus.insert(
"other", other);
155 m_reapplyAction =
new TDEAction(i18n(
"Apply Filter Again"),
157 this, TQ_SLOT(slotApply()),
158 ac,
"filter_apply_again");
160 m_reapplyAction->setEnabled(
false);
164 for ( KisIDList::Iterator it = m_filterList.begin(); it != m_filterList.end(); ++it ) {
165 f = KisFilterRegistry::instance()->get(*it);
170 TDEAction * a =
new TDEAction(f->menuEntry(), 0, m_filterMapper, TQ_SLOT(map()), ac,
171 TQString(
"chalk_filter_%1").arg((*it) .
id()).ascii());
174 TDEActionMenu * m = m_filterActionMenus.find( f->menuCategory() );
180 other =
new TDEActionMenu(i18n(
"Other"), ac,
"misc_filters");
181 m_filterActionMenus.insert(
"other", am);
187 m_filterMapper->setMapping( a, i );
189 m_filterActions.append( a );
194void KisFilterManager::updateGUI()
196 KisImageSP img = m_view->currentImg();
199 KisLayerSP layer = img->activeLayer();
204 bool enable = !(layer->locked() || !layer->visible() || partLayer);
205 KisPaintLayerSP player =
dynamic_cast<KisPaintLayer*
>( layer.data());
210 m_reapplyAction->setEnabled(m_lastFilterConfig);
211 if (m_lastFilterConfig)
212 m_reapplyAction->setText(i18n(
"Apply Filter Again") +
": "
213 + KisFilterRegistry::instance()->get(m_lastFilterConfig->
name())->id().name());
215 m_reapplyAction->setText(i18n(
"Apply Filter Again"));
219 for (a = m_filterActions.first(); a; a = m_filterActions.next() , i++) {
220 KisFilter* filter = KisFilterRegistry::instance()->get(m_filterList[i]);
221 if(player && filter->
workWith( player->paintDevice()->colorSpace()))
223 a->setEnabled(enable);
225 a->setEnabled(
false);
231void KisFilterManager::slotApply()
236bool KisFilterManager::apply()
238 if (!m_lastFilter)
return false;
240 KisImageSP img = m_view->currentImg();
241 if (!img)
return false;
243 KisPaintDeviceSP dev = img->activeDevice();
244 if (!dev)
return false;
246 TQApplication::setOverrideCursor( KisCursor::waitCursor() );
249 m_lastFilterConfig = m_lastFilter->
configuration(m_lastWidget);
251 TQRect r1 = dev->extent();
252 TQRect r2 = img->bounds();
255 TQRect rect = r1.intersect(r2);
257 if (dev->hasSelection()) {
258 TQRect r3 = dev->selection()->selectedExactRect();
259 rect = rect.intersect(r3);
262 m_lastFilter->enableProgress();
264 m_view->progressDisplay()->setSubject(m_lastFilter,
true,
true);
265 m_lastFilter->setProgressDisplay( m_view->progressDisplay());
267 KisTransaction * cmd = 0;
268 if (img->undo()) cmd =
new KisTransaction(m_lastFilter->id().name(), dev);
270 m_lastFilter->process(dev, dev, m_lastFilterConfig, rect);
271 m_reapplyAction->setEnabled(m_lastFilterConfig);
272 if (m_lastFilterConfig)
273 m_reapplyAction->setText(i18n(
"Apply Filter Again") +
": "
274 + KisFilterRegistry::instance()->get(m_lastFilterConfig->
name())->id().name());
277 m_reapplyAction->setText(i18n(
"Apply Filter Again"));
279 m_lastFilter->disableProgress();
280 TQApplication::restoreOverrideCursor();
283 if (m_lastFilter->cancelRequested()) {
284 delete m_lastFilterConfig;
292 if (dev->parentLayer()) dev->parentLayer()->setDirty(rect);
293 m_doc->setModified(
true);
294 if (img->undo() && cmd) img->undoAdapter()->addCommand(cmd);
299void KisFilterManager::slotApplyFilter(
int i)
301 KisPreviewDialog * oldDialog = m_lastDialog;
305 m_lastFilter = KisFilterRegistry::instance()->get(m_filterList[i]);
308 m_lastFilter = oldFilter;
312 KisImageSP img = m_view->currentImg();
315 KisPaintDeviceSP dev = img->activeDevice();
321 if (KMessageBox::warningContinueCancel(m_view,
322 i18n(
"The %1 filter will convert your %2 data to 16-bit L*a*b* and vice versa. ")
323 .arg(m_lastFilter->id().name())
324 .arg(dev->colorSpace()->id().name()),
325 i18n(
"Filter Will Convert Your Layer Data"),
326 KGuiItem(i18n(
"Continue")),
327 "lab16degradation") != KMessageBox::Continue)
return;
331 if (KMessageBox::warningContinueCancel(m_view,
332 i18n(
"The %1 filter will convert your %2 data to 8-bit RGBA and vice versa. ")
333 .arg(m_lastFilter->id().name())
334 .arg(dev->colorSpace()->id().name()),
335 i18n(
"Filter Will Convert Your Layer Data"),
336 KGuiItem(i18n(
"Continue")),
337 "rgba8degradation") != KMessageBox::Continue)
return;
341 m_lastFilter->disableProgress();
344 m_lastDialog =
new KisPreviewDialog(m_view, m_lastFilter->id().name().ascii(),
true, m_lastFilter->id().name());
345 TQ_CHECK_PTR(m_lastDialog);
348 bool accepted =
true;
350 if( m_lastWidget != 0)
352 connect(m_lastWidget, TQ_SIGNAL(sigPleaseUpdatePreview()),
this, TQ_SLOT(slotConfigChanged()));
354 m_lastDialog->previewWidget()->slotSetDevice( dev );
356 connect(m_lastDialog->previewWidget(), TQ_SIGNAL(updated()),
this, TQ_SLOT(refreshPreview()));
358 TQGridLayout *widgetLayout =
new TQGridLayout((TQWidget *)m_lastDialog->container(), 1, 1);
360 widgetLayout->addWidget(m_lastWidget, 0 , 0);
362 m_lastDialog->container()->setMinimumSize(m_lastWidget->minimumSize());
366 if(m_lastDialog->exec() == TQDialog::Rejected )
372 if (!accepted || !apply()) {
374 m_lastFilterConfig = oldConfig;
375 m_lastDialog = oldDialog;
376 m_lastFilter = oldFilter;
384void KisFilterManager::slotConfigChanged()
386 if( m_lastDialog == 0 )
388 if(m_lastDialog->previewWidget()->getAutoUpdate())
392 m_lastDialog->previewWidget()->needUpdate();
397void KisFilterManager::refreshPreview( )
399 if( m_lastDialog == 0 )
return;
404 m_lastDialog->previewWidget()->runFilter(m_lastFilter, config);
408#include "kis_filter_manager.moc"
A KisFilterConfiguration is the serializable representation of the filter parameters.
const TQString & name() const
Get the unique, language independent name of the filter.
Basic interface of a Chalk filter.
virtual bool workWith(KisColorSpace *)
Determine if this filter can work with this colorSpace.
virtual KisFilterConfigWidget * createConfigurationWidget(TQWidget *parent, KisPaintDeviceSP dev)
virtual KisFilterConfiguration * configuration(TQWidget *)
virtual ColorSpaceIndependence colorSpaceIndependence()
Determine the colorspace independence of this filter.
This layer is of a type that can be painted on.
An interface for the Part Layer so that we can use it in core/, but can implement it in ui/.