[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [calligra/krita-opengl2-rempt] krita: Revert "Revert "Major fixes for the Krita filtering system""
From:       Boudewijn Rempt <boud () valdyas ! org>
Date:       2013-06-10 9:59:33
Message-ID: 20130610095933.B4598A6063 () git ! kde ! org
[Download RAW message or body]

Git commit 97960a85f560c0b86054f93dd1031e7dc268c5bb by Boudewijn Rempt.
Committed on 10/06/2013 at 11:50.
Pushed by rempt into branch 'krita-opengl2-rempt'.

Revert "Revert "Major fixes for the Krita filtering system""

This reverts commit 19c8dbaf210a18170fb0446f4bde33731a258fbd.

M  +0    -26   krita/image/kis_layer.cc
M  +0    -10   krita/image/kis_layer.h
M  +2    -12   krita/image/tests/kis_layer_test.cpp
M  +0    -1    krita/image/tests/kis_layer_test.h
M  +0    -1    krita/ui/CMakeLists.txt
M  +44   -52   krita/ui/dialogs/kis_dlg_filter.cpp
M  +4    -4    krita/ui/dialogs/kis_dlg_filter.h
D  +0    -181  krita/ui/kis_filter_handler.cc
D  +0    -57   krita/ui/kis_filter_handler.h
M  +174  -29   krita/ui/kis_filter_manager.cc
M  +9    -5    krita/ui/kis_filter_manager.h

http://commits.kde.org/calligra/97960a85f560c0b86054f93dd1031e7dc268c5bb

diff --git a/krita/image/kis_layer.cc b/krita/image/kis_layer.cc
index 00ee756..96b7216 100644
--- a/krita/image/kis_layer.cc
+++ b/krita/image/kis_layer.cc
@@ -38,7 +38,6 @@
 #include "kis_painter.h"
 #include "kis_mask.h"
 #include "kis_effect_mask.h"
-#include "kis_transparency_mask.h"
 #include "kis_selection_mask.h"
 #include "kis_meta_data_store.h"
 #include "kis_selection.h"
@@ -112,7 +111,6 @@ public:
 
     KisImageWSP image;
     QBitArray channelFlags;
-    KisEffectMaskSP previewMask;
     KisMetaData::Store* metaDataStore;
     KisSafeProjection safeProjection;
     KisCloneLayersList clonesList;
@@ -299,10 +297,6 @@ QList<KisEffectMaskSP> KisLayer::effectMasks() const
 {
     QList<KisEffectMaskSP> masks;
 
-    if (m_d->previewMask && m_d->previewMask->visible()) {
-        masks.append(m_d->previewMask);
-    }
-
     if (childCount() > 0) {
         KoProperties properties;
         properties.setProperty("visible", true);
@@ -319,7 +313,6 @@ QList<KisEffectMaskSP> KisLayer::effectMasks() const
 
 bool KisLayer::hasEffectMasks() const
 {
-    if (m_d->previewMask && m_d->previewMask->visible()) return true;
     if (childCount() == 0) return false;
 
     KoProperties properties;
@@ -559,25 +552,6 @@ QRect KisLayer::exactBounds() const
     return originalDevice ? originalDevice->exactBounds() : QRect();
 }
 
-
-void KisLayer::setPreviewMask(KisEffectMaskSP mask)
-{
-    if (m_d->previewMask) {
-        m_d->previewMask->setParent(0);
-        m_d->previewMask = 0;
-    }
-
-    if (mask) {
-        m_d->previewMask = mask;
-        m_d->previewMask->setParent(this);
-    }
-}
-
-KisEffectMaskSP KisLayer::previewMask() const
-{
-    return m_d->previewMask;
-}
-
 KisLayerSP KisLayer::parentLayer() const
 {
     return dynamic_cast<KisLayer*>(parent().data());
diff --git a/krita/image/kis_layer.h b/krita/image/kis_layer.h
index 3a24c55..eb36e26 100644
--- a/krita/image/kis_layer.h
+++ b/krita/image/kis_layer.h
@@ -235,16 +235,6 @@ public:
     QRect changeRect(const QRect &rect, PositionToFilthy pos = N_FILTHY) const;
 
     /**
-     * Set a temporary effect mask on this layer for filter previews.
-     */
-    void setPreviewMask(KisEffectMaskSP mask);
-
-    /**
-     * Retrieve the current preview effect mask
-     */
-    KisEffectMaskSP previewMask() const;
-
-    /**
      * Get the group layer that contains this layer.
      */
     KisLayerSP parentLayer() const;
diff --git a/krita/image/tests/kis_layer_test.cpp \
b/krita/image/tests/kis_layer_test.cpp index 61e59b2..500f8b8 100644
--- a/krita/image/tests/kis_layer_test.cpp
+++ b/krita/image/tests/kis_layer_test.cpp
@@ -225,18 +225,6 @@ void KisLayerTest::testMoveLayer()
 
 }
 
-void KisLayerTest::testHasEffectMasks()
-{
-    KisLayerSP layer = new TestLayer(0, "layer1", OPACITY_OPAQUE_U8);
-    QVERIFY(layer->hasEffectMasks() == false);
-    KisFilterMaskSP mask = new KisFilterMask();
-    layer->setPreviewMask(mask);
-    QVERIFY(layer->hasEffectMasks());
-    layer->setPreviewMask(0);
-    QVERIFY(layer->hasEffectMasks() == false);
-}
-
-
     /*
       +----------+
       |root      |
@@ -269,6 +257,8 @@ void KisLayerTest::testMasksChangeRect()
     image->addNode(filterMask1, paintLayer1);
     image->addNode(filterMask2, paintLayer1);
 
+    QVERIFY(paintLayer1->hasEffectMasks());
+
     QRect testRect(10, 10, 100, 100);
     QRect resultRect;
 
diff --git a/krita/image/tests/kis_layer_test.h b/krita/image/tests/kis_layer_test.h
index 6a95443..f190a26 100644
--- a/krita/image/tests/kis_layer_test.h
+++ b/krita/image/tests/kis_layer_test.h
@@ -105,7 +105,6 @@ private slots:
     void testOrdering();
     void testMoveNode();
     void testMoveLayer();
-    void testHasEffectMasks();
     void testMasksChangeRect();
     void testMoveLayerWithMaskThreaded();
 };
diff --git a/krita/ui/CMakeLists.txt b/krita/ui/CMakeLists.txt
index fb49390..5bf246b 100644
--- a/krita/ui/CMakeLists.txt
+++ b/krita/ui/CMakeLists.txt
@@ -76,7 +76,6 @@ set(kritaui_LIB_SRCS
     kis_part2.cpp
     kis_factory2.cc
     kis_file_layer.cpp
-    kis_filter_handler.cc
     kis_filter_manager.cc
     kis_filters_model.cc
     kis_flipbook.cpp
diff --git a/krita/ui/dialogs/kis_dlg_filter.cpp \
b/krita/ui/dialogs/kis_dlg_filter.cpp index 0fd80d0..373647b 100644
--- a/krita/ui/dialogs/kis_dlg_filter.cpp
+++ b/krita/ui/dialogs/kis_dlg_filter.cpp
@@ -25,32 +25,32 @@
 #include <kis_filter_mask.h>
 #include <kis_node.h>
 #include <kis_layer.h>
-#include <kis_selection.h>
 #include <kis_view2.h>
 #include <kis_config.h>
 
+#include "kis_selection.h"
 #include "kis_node_commands_adapter.h"
+#include "kis_filter_manager.h"
 #include "ui_wdgfilterdialog.h"
 
 
 struct KisFilterDialog::Private {
     Private()
             : currentFilter(0)
-            , mask(0)
             , resizeCount(0)
-            , view(0) {
+            , view(0)
+    {
     }
 
     KisFilterSP currentFilter;
     Ui_FilterDialog uiFilterDialog;
-    KisFilterMaskSP mask;
     KisNodeSP node;
-    KisImageWSP image;
     int resizeCount;
     KisView2 *view;
+    KisFilterManager *filterManager;
 };
 
-KisFilterDialog::KisFilterDialog(KisView2 *view, KisNodeSP node, KisImageWSP image, \
KisSelectionSP selection) : +KisFilterDialog::KisFilterDialog(KisView2 *view, \
KisNodeSP node, KisFilterManager *filterManager) :  QDialog(view),
         d(new Private)
 {
@@ -58,26 +58,14 @@ KisFilterDialog::KisFilterDialog(KisView2 *view, KisNodeSP node, \
KisImageWSP ima  
     d->uiFilterDialog.setupUi(this);
     d->node = node;
-    d->image = image;
     d->view = view;
+    d->filterManager = filterManager;
 
     d->uiFilterDialog.filterSelection->setView(view);
     d->uiFilterDialog.filterSelection->showFilterGallery(KisConfig().showFilterGallery());
  
-    if (d->node->inherits("KisLayer")) {
-        KisLayer *layer = dynamic_cast<KisLayer*>(node.data());
-        d->mask = new KisFilterMask();
-        d->mask->initSelection(selection, layer);
-        layer->setPreviewMask(d->mask);
-
-        d->uiFilterDialog.checkBoxPreview->show();
-        d->uiFilterDialog.pushButtonCreateMaskEffect->show();
-        d->uiFilterDialog.pushButtonCreateMaskEffect->setEnabled(true);
-        connect(d->uiFilterDialog.pushButtonCreateMaskEffect, SIGNAL(pressed()), \
                SLOT(createMask()));
-    } else {
-        d->uiFilterDialog.checkBoxPreview->hide();
-        d->uiFilterDialog.pushButtonCreateMaskEffect->hide();
-    }
+    d->uiFilterDialog.pushButtonCreateMaskEffect->show();
+    connect(d->uiFilterDialog.pushButtonCreateMaskEffect, SIGNAL(pressed()), \
SLOT(createMask()));  
     d->uiFilterDialog.filterSelection->setPaintDevice(d->node->original());
     d->uiFilterDialog.pushButtonOk->setGuiItem(KStandardGuiItem::ok());
@@ -104,41 +92,48 @@ void KisFilterDialog::setFilter(KisFilterSP f)
 {
     Q_ASSERT(f);
     setWindowTitle(f->name());
-    d->currentFilter = f;
     d->uiFilterDialog.filterSelection->setFilter(f);
     updatePreview();
 }
 
-void KisFilterDialog::updatePreview()
+void KisFilterDialog::startApplyingFilter(KisSafeFilterConfigurationSP config)
 {
-    if (!d->currentFilter) return;
+    if (!d->uiFilterDialog.filterSelection->configuration()) return;
 
-    if(d->mask && d->uiFilterDialog.checkBoxPreview->isChecked()) {
-        d->mask->setFilter(d->uiFilterDialog.filterSelection->configuration());
+    if (d->node->inherits("KisLayer")) {
+        config->setChannelFlags(qobject_cast<KisLayer*>(d->node.data())->channelFlags());
  }
 
-    d->node->setDirty();
+    d->filterManager->apply(config);
+}
+
+void KisFilterDialog::updatePreview()
+{
+    if (!d->uiFilterDialog.filterSelection->configuration()) return;
+
+    if (d->uiFilterDialog.checkBoxPreview->isChecked()) {
+        KisSafeFilterConfigurationSP \
config(d->uiFilterDialog.filterSelection->configuration()); +        \
startApplyingFilter(config); +    }
 
     d->uiFilterDialog.pushButtonOk->setEnabled(true);
 }
 
 void KisFilterDialog::apply()
 {
-    if (!d->currentFilter) return;
-
-    KisSafeFilterConfigurationSP \
                config(d->uiFilterDialog.filterSelection->configuration());
-    if (d->node->inherits("KisLayer")) {
-        config->setChannelFlags(qobject_cast<KisLayer*>(d->node.data())->channelFlags());
 +    if (!d->filterManager->isStrokeRunning()) {
+        KisSafeFilterConfigurationSP \
config(d->uiFilterDialog.filterSelection->configuration()); +        \
startApplyingFilter(config);  }
-    emit(sigPleaseApplyFilter(config));
+    d->filterManager->finish();
+
     d->uiFilterDialog.pushButtonOk->setEnabled(false);
 }
 
 void KisFilterDialog::close()
 {
-    if (d->mask) {
-        qobject_cast<KisLayer*>(d->node.data())->setPreviewMask(0);;
-        d->node->setDirty();
+    if (d->filterManager->isStrokeRunning()) {
+        d->filterManager->cancel();
     }
 
     KisConfig().setShowFilterGallery(d->uiFilterDialog.filterSelection->isFilterGalleryVisible());
 @@ -146,28 +141,29 @@ void KisFilterDialog::close()
 
 void KisFilterDialog::createMask()
 {
-    if (!d->mask) return;
+    if (d->filterManager->isStrokeRunning()) {
+        d->filterManager->cancel();
+    }
 
     KisLayer *layer = dynamic_cast<KisLayer*>(d->node.data());
-    layer->setPreviewMask(0);
+    KisFilterMaskSP mask = new KisFilterMask();
+    mask->initSelection(d->view->selection(), layer);
+    mask->setFilter(d->uiFilterDialog.filterSelection->configuration());
 
-    Q_ASSERT(layer->allowAsChild(d->mask));
-    Q_ASSERT(d->mask->parent() == 0);
+    Q_ASSERT(layer->allowAsChild(mask));
 
     KisNodeCommandsAdapter adapter(d->view);
-    adapter.addNode(d->mask, layer, layer->lastChild());
-
-
-    d->mask = 0;
+    adapter.addNode(mask, layer, layer->lastChild());
     accept();
 }
 
 void KisFilterDialog::previewCheckBoxChange(int state)
 {
-    if (!d->mask) return;
-
-    d->mask->setVisible(state == Qt::Checked);
-    updatePreview();
+    if (state) {
+        updatePreview();
+    } else if (d->filterManager->isStrokeRunning()) {
+        d->filterManager->cancel();
+    }
 
     KConfigGroup group(KGlobal::config(), "filterdialog");
     group.writeEntry("showPreview", d->uiFilterDialog.checkBoxPreview->isChecked());
@@ -190,7 +186,3 @@ void KisFilterDialog::resizeEvent(QResizeEvent* event)
         d->resizeCount++;
     }
 }
-
-
-
-#include "kis_dlg_filter.moc"
diff --git a/krita/ui/dialogs/kis_dlg_filter.h b/krita/ui/dialogs/kis_dlg_filter.h
index 86c1e8c..6f2170e 100644
--- a/krita/ui/dialogs/kis_dlg_filter.h
+++ b/krita/ui/dialogs/kis_dlg_filter.h
@@ -27,6 +27,7 @@
 class KisFilter;
 class KisFilterConfiguration;
 class KisView2;
+class KisFilterManager;
 
 class KisFilterDialog : public QDialog
 {
@@ -35,7 +36,7 @@ class KisFilterDialog : public QDialog
 
 public:
 
-    KisFilterDialog(KisView2 *view, KisNodeSP node, KisImageWSP image, \
KisSelectionSP selection = 0); +    KisFilterDialog(KisView2 *view, KisNodeSP node, \
KisFilterManager *filterManager);  
     ~KisFilterDialog();
 
@@ -57,9 +58,8 @@ protected slots:
 
     virtual void resizeEvent(QResizeEvent* );
 
-signals:
-
-    void sigPleaseApplyFilter(KisSafeFilterConfigurationSP);
+private:
+    void startApplyingFilter(KisSafeFilterConfigurationSP config);
 
 private:
     struct Private;
diff --git a/krita/ui/kis_filter_handler.cc b/krita/ui/kis_filter_handler.cc
deleted file mode 100644
index 3806a36..0000000
--- a/krita/ui/kis_filter_handler.cc
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- *  Copyright (c) 2007 Cyrille Berger <cberger@cberger.net>
- *  Copyright (c) 2007 Boudewijn Rempt <boud@valdyas.org>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include "kis_filter_handler.h"
-#include <kmessagebox.h>
-
-#include "kis_view2.h"
-#include "kis_canvas2.h"
-#include "kis_filter_manager.h"
-#include "dialogs/kis_dlg_filter.h"
-
-#include "strokes/kis_filter_stroke_strategy.h"
-#include "krita_utils.h"
-
-#include <kis_bookmarked_configuration_manager.h>
-#include <filter/kis_filter.h>
-#include <filter/kis_filter_configuration.h>
-
-
-struct KisFilterHandler::Private {
-
-    Private(KisFilterHandler *_q)
-            : view(0)
-            , manager(0)
-            , q(_q)
-    {
-    }
-
-    ~Private() {
-    }
-
-    KisFilterSP filter;
-
-    KisView2* view;
-    KisFilterManager* manager;
-
-    KisSafeFilterConfigurationSP lastConfiguration;
-    KisFilterHandler *q;
-
-    void saveConfiguration(KisFilterSP filter, KisSafeFilterConfigurationSP \
                filterConfig);
-};
-
-void KisFilterHandler::Private::saveConfiguration(KisFilterSP filter, \
                KisSafeFilterConfigurationSP filterConfig)
-{
-    if (filter->bookmarkManager()) {
-        filter->bookmarkManager()->save(KisBookmarkedConfigurationManager::ConfigLastUsed.id(),
                
-                                        filterConfig.data());
-    }
-
-    lastConfiguration = filterConfig;
-    manager->setLastFilterHandler(q);
-}
-
-
-KisFilterHandler::KisFilterHandler(KisFilterManager* parent, KisFilterSP f, \
                KisView2* view)
-        : QObject(parent)
-        , m_d(new Private(this))
-{
-    m_d->filter = f;
-    m_d->view = view;
-    m_d->manager = parent;
-}
-
-KisFilterHandler::~KisFilterHandler()
-{
-    delete m_d;
-}
-
-void KisFilterHandler::showDialog()
-{
-    /**
-     * HACK ALERT:
-     * Until filters are ported to strokes, there should be a barrier
-     * to finish all the running strokes in the system
-     */
-    m_d->view->image()->barrierLock();
-    m_d->view->image()->unlock();
-
-    KisPaintDeviceSP dev = m_d->view->activeNode()->paintDevice();
-    if (!dev) {
-        qWarning() << "KisFilterHandler::showDialog(): Filtering was requested for \
                illegal active layer!" << m_d->view->activeNode();
-        return;
-    }
-
-    if (dev->colorSpace()->willDegrade(m_d->filter->colorSpaceIndependence())) {
-        // Warning bells!
-        if (m_d->filter->colorSpaceIndependence() == TO_LAB16) {
-            if (KMessageBox::warningContinueCancel(m_d->view,
-                                                   i18n("The %1 filter will convert \
                your %2 data to 16-bit L*a*b* and vice versa. ",
-                                                        m_d->filter->name(),
-                                                        dev->colorSpace()->name()),
-                                                   i18n("Filter Will Convert Your \
                Layer Data"),
-                                                   KStandardGuiItem::cont(), \
                KStandardGuiItem::cancel(),
-                                                   "lab16degradation") != \
                KMessageBox::Continue) return;
-
-        } else if (m_d->filter->colorSpaceIndependence() == TO_RGBA16) {
-            if (KMessageBox::warningContinueCancel(m_d->view,
-                                                   i18n("The %1 filter will convert \
                your %2 data to 16-bit RGBA and vice versa. ",
-                                                        m_d->filter->name() , \
                dev->colorSpace()->name()),
-                                                   i18n("Filter Will Convert Your \
                Layer Data"),
-                                                   KStandardGuiItem::cont(), \
                KStandardGuiItem::cancel(),
-                                                   "rgba16degradation") != \
                KMessageBox::Continue) return;
-        }
-    }
-
-    if (m_d->filter->showConfigurationWidget()) {
-        KisFilterDialog* dialog = new KisFilterDialog(m_d->view , \
                m_d->view->activeNode(), m_d->view->image(), m_d->view->selection());
-        dialog->setFilter(m_d->filter);
-        connect(dialog, SIGNAL(sigPleaseApplyFilter(KisSafeFilterConfigurationSP)),
-                SLOT(apply(KisSafeFilterConfigurationSP)));
-        dialog->setVisible(true);
-        dialog->setAttribute(Qt::WA_DeleteOnClose);
-    } else {
-        apply(KisSafeFilterConfigurationSP(m_d->filter->defaultConfiguration(m_d->view->activeNode()->original())));
                
-    }
-}
-
-void KisFilterHandler::reapply()
-{
-    apply(m_d->lastConfiguration);
-}
-
-void KisFilterHandler::apply(KisSafeFilterConfigurationSP config)
-{
-    KisSafeFilterConfigurationSP filterConfig(config);
-
-    KisImageWSP image = m_d->view->image();
-    KisPostExecutionUndoAdapter *undoAdapter =
-        image->postExecutionUndoAdapter();
-    KoCanvasResourceManager *resourceManager =
-        m_d->view->canvasBase()->resourceManager();
-
-    KisResourcesSnapshotSP resources =
-        new KisResourcesSnapshot(image,
-                                 undoAdapter,
-                                 resourceManager);
-
-    KisStrokeId strokeId =
-        image->startStroke(new KisFilterStrokeStrategy(m_d->filter,
-                                                       \
                KisSafeFilterConfigurationSP(filterConfig),
-                                                       resources));
-
-    if (m_d->filter->supportsThreading()) {
-        QSize size = KritaUtils::optimalPatchSize();
-        QVector<QRect> rects = KritaUtils::splitRectIntoPatches(image->bounds(), \
                size);
-
-        foreach(const QRect &rc, rects) {
-            image->addJob(strokeId,
-                          new KisFilterStrokeStrategy::Data(rc, true));
-        }
-    } else {
-        image->addJob(strokeId,
-                      new KisFilterStrokeStrategy::Data(image->bounds(), false));
-    }
-
-    image->endStroke(strokeId);
-
-    m_d->saveConfiguration(m_d->filter, filterConfig);
-}
-
-const QString KisFilterHandler::filterName() const
-{
-    return m_d->filter->name();
-}
-
diff --git a/krita/ui/kis_filter_handler.h b/krita/ui/kis_filter_handler.h
deleted file mode 100644
index 9743121..0000000
--- a/krita/ui/kis_filter_handler.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2007 Cyrille Berger <cberger@cberger.net>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#ifndef _KIS_FILTER_HANDLER_H_
-#define _KIS_FILTER_HANDLER_H_
-
-#include <QObject>
-
-#include <kis_types.h>
-
-class KisFilterConfiguration;
-class KisFilterManager;
-class KisLayer;
-class KisView2;
-class QRect;
-
-/**
- * XXX: this class is way too confusing.
- */
-class KisFilterHandler : public QObject
-{
-
-    Q_OBJECT
-
-public:
-
-    KisFilterHandler(KisFilterManager* parent, KisFilterSP f, KisView2* view);
-    ~KisFilterHandler();
-
-    const QString filterName() const;
-
-public slots:
-    void showDialog();
-    void reapply();
-    void apply(KisSafeFilterConfigurationSP filterConfig);
-
-private:
-    struct Private;
-    Private* const m_d;
-};
-
-#endif
diff --git a/krita/ui/kis_filter_manager.cc b/krita/ui/kis_filter_manager.cc
index 6fdca92..48a2f1f 100644
--- a/krita/ui/kis_filter_manager.cc
+++ b/krita/ui/kis_filter_manager.cc
@@ -22,7 +22,9 @@
 #include "kis_filter_manager.moc"
 
 #include <QHash>
+#include <QSignalMapper>
 
+#include <kmessagebox.h>
 #include <kactionmenu.h>
 #include <kactioncollection.h>
 
@@ -31,15 +33,19 @@
 // krita/image
 #include <filter/kis_filter.h>
 #include <filter/kis_filter_registry.h>
-#include <kis_layer.h>
-#include <kis_paint_layer.h>
+#include <filter/kis_filter_configuration.h>
 #include <kis_paint_device.h>
 
 // krita/ui
-#include "kis_filter_handler.h"
 #include "kis_view2.h"
+#include "kis_canvas2.h"
+#include <kis_bookmarked_configuration_manager.h>
 #include <KoColorSpaceRegistry.h>
-#include <KoColorSpaceRegistry.h>
+
+#include "dialogs/kis_dlg_filter.h"
+#include "strokes/kis_filter_stroke_strategy.h"
+#include "krita_utils.h"
+
 
 struct KisFilterManager::Private {
     Private() : reapplyAction(0), actionCollection(0) {
@@ -47,16 +53,24 @@ struct KisFilterManager::Private {
     }
     KAction* reapplyAction;
     QHash<QString, KActionMenu*> filterActionMenus;
-    QHash<QString, KisFilterHandler*> filterHandlers;
     QHash<KisFilter*, KAction*> filters2Action;
-    KActionCollection * actionCollection;
-    KisView2* view;
+    KActionCollection *actionCollection;
+    KisView2 *view;
+
+
+
+
+    KisSafeFilterConfigurationSP lastConfiguration;
+    KisSafeFilterConfigurationSP currentlyAppliedCofiguration;
+    KisStrokeId currentStrokeId;
+
+    QSignalMapper actionsMapper;
 };
 
-KisFilterManager::KisFilterManager(KisView2 * parent, KisDoc2 * doc) : d(new \
Private) +KisFilterManager::KisFilterManager(KisView2 * view, KisDoc2 * doc) : d(new \
Private)  {
     Q_UNUSED(doc);
-    d->view = parent;
+    d->view = view;
 }
 
 KisFilterManager::~KisFilterManager()
@@ -71,26 +85,33 @@ void KisFilterManager::setup(KActionCollection * ac)
     // Setup reapply action
     d->reapplyAction = new KAction(i18n("Apply Filter Again"), this);
     d->actionCollection->addAction("filter_apply_again", d->reapplyAction);
+
     d->reapplyAction->setEnabled(false);
+    connect(d->reapplyAction, SIGNAL(triggered()), SLOT(reapplyLastFilter()));
+
+    connect(&d->actionsMapper, SIGNAL(mapped(const QString&)), \
SLOT(showFilterDialog(const QString&)));  
     // Setup list of filters
-    QList<QString> filterList = KisFilterRegistry::instance()->keys();
-    for (QList<QString>::Iterator it = filterList.begin(); it != filterList.end(); \
                ++it) {
-        insertFilter(*it);
+    foreach (const QString &filterName, KisFilterRegistry::instance()->keys()) {
+        insertFilter(filterName);
     }
+
     connect(KisFilterRegistry::instance(), SIGNAL(filterAdded(QString)), \
SLOT(insertFilter(const QString &)));  }
 
-void KisFilterManager::insertFilter(const QString & name)
+void KisFilterManager::insertFilter(const QString & filterName)
 {
     Q_ASSERT(d->actionCollection);
-    KisFilterSP f = KisFilterRegistry::instance()->value(name);
-    Q_ASSERT(f);
-    if (d->filters2Action.keys().contains(f.data())) {
-        warnKrita << "Filter" << name << " has already been inserted";
+
+    KisFilterSP filter = KisFilterRegistry::instance()->value(filterName);
+    Q_ASSERT(filter);
+
+    if (d->filters2Action.keys().contains(filter.data())) {
+        warnKrita << "Filter" << filterName << " has already been inserted";
         return;
     }
-    KoID category = f->menuCategory();
+
+    KoID category = filter->menuCategory();
     KActionMenu* actionMenu = d->filterActionMenus[ category.id()];
     if (!actionMenu) {
         actionMenu = new KActionMenu(category.name(), this);
@@ -98,14 +119,15 @@ void KisFilterManager::insertFilter(const QString & name)
         d->filterActionMenus[category.id()] = actionMenu;
     }
 
-    KisFilterHandler* handler = new KisFilterHandler(this, f, d->view);
+    KAction *action = new KAction(filter->menuEntry(), this);
+    action->setShortcut(filter->shortcut(), KAction::DefaultShortcut);
+    d->actionCollection->addAction(QString("krita_filter_%1").arg(filterName), \
action); +    d->filters2Action[filter.data()] = action;
 
-    KAction * a = new KAction(f->menuEntry(), this);
-    a->setShortcut(f->shortcut(), KAction::DefaultShortcut);
-    d->actionCollection->addAction(QString("krita_filter_%1").arg(name), a);
-    d->filters2Action[f.data()] = a;
-    connect(a, SIGNAL(triggered()), handler, SLOT(showDialog()));
-    actionMenu->addAction(a); 
+    actionMenu->addAction(action);
+
+    d->actionsMapper.setMapping(action, filterName);
+    connect(action, SIGNAL(triggered()), &d->actionsMapper, SLOT(map()));
 }
 
 void KisFilterManager::updateGUI()
@@ -129,11 +151,134 @@ void KisFilterManager::updateGUI()
     }
 }
 
-void KisFilterManager::setLastFilterHandler(KisFilterHandler* handler)
+void KisFilterManager::reapplyLastFilter()
 {
-    disconnect(d->reapplyAction, SIGNAL(triggered()), 0 , 0);
-    connect(d->reapplyAction, SIGNAL(triggered()), handler, SLOT(reapply()));
+    if (!d->lastConfiguration) return;
+
+    apply(d->lastConfiguration);
+    finish();
+}
+
+void KisFilterManager::showFilterDialog(const QString &filterId)
+{
+    /**
+     * The UI should show only after every running stroke is finished,
+     * so the barrier is added here.
+     */
+    d->view->image()->barrierLock();
+    d->view->image()->unlock();
+
+    KisPaintDeviceSP dev = d->view->activeNode()->paintDevice();
+    if (!dev) {
+        qWarning() << "KisFilterManager::showFilterDialog(): Filtering was requested \
for illegal active layer!" << d->view->activeNode(); +        return;
+    }
+
+    KisFilterSP filter = KisFilterRegistry::instance()->value(filterId);
+
+    if (dev->colorSpace()->willDegrade(filter->colorSpaceIndependence())) {
+        // Warning bells!
+        if (filter->colorSpaceIndependence() == TO_LAB16) {
+            if (KMessageBox::warningContinueCancel(d->view,
+                                                   i18n("The %1 filter will convert \
your %2 data to 16-bit L*a*b* and vice versa. ", +                                    \
filter->name(), +                                                        \
dev->colorSpace()->name()), +                                                   \
i18n("Filter Will Convert Your Layer Data"), +                                        \
KStandardGuiItem::cont(), KStandardGuiItem::cancel(), +                               \
"lab16degradation") != KMessageBox::Continue) return; +
+        } else if (filter->colorSpaceIndependence() == TO_RGBA16) {
+            if (KMessageBox::warningContinueCancel(d->view,
+                                                   i18n("The %1 filter will convert \
your %2 data to 16-bit RGBA and vice versa. ", +                                      \
filter->name() , dev->colorSpace()->name()), +                                        \
i18n("Filter Will Convert Your Layer Data"), +                                        \
KStandardGuiItem::cont(), KStandardGuiItem::cancel(), +                               \
"rgba16degradation") != KMessageBox::Continue) return; +        }
+    }
+
+    if (filter->showConfigurationWidget()) {
+        KisFilterDialog* dialog = new KisFilterDialog(d->view , \
d->view->activeNode(), this); +        dialog->setFilter(filter);
+        dialog->setVisible(true);
+        dialog->setAttribute(Qt::WA_DeleteOnClose);
+    } else {
+        apply(KisSafeFilterConfigurationSP(filter->defaultConfiguration(d->view->activeNode()->original())));
 +        finish();
+    }
+}
+
+void KisFilterManager::apply(KisSafeFilterConfigurationSP filterConfig)
+{
+    KisFilterSP filter = KisFilterRegistry::instance()->value(filterConfig->name());
+    KisImageWSP image = d->view->image();
+
+    if (d->currentStrokeId) {
+        image->cancelStroke(d->currentStrokeId);
+    }
+
+    KisPostExecutionUndoAdapter *undoAdapter =
+        image->postExecutionUndoAdapter();
+    KoCanvasResourceManager *resourceManager =
+        d->view->canvasBase()->resourceManager();
+
+    KisResourcesSnapshotSP resources =
+        new KisResourcesSnapshot(image,
+                                 undoAdapter,
+                                 resourceManager);
+
+    d->currentStrokeId =
+        image->startStroke(new KisFilterStrokeStrategy(filter,
+                                                       \
KisSafeFilterConfigurationSP(filterConfig), +                                         \
resources)); +
+    if (filter->supportsThreading()) {
+        QSize size = KritaUtils::optimalPatchSize();
+        QVector<QRect> rects = KritaUtils::splitRectIntoPatches(image->bounds(), \
size); +
+        foreach(const QRect &rc, rects) {
+            image->addJob(d->currentStrokeId,
+                          new KisFilterStrokeStrategy::Data(rc, true));
+        }
+    } else {
+        image->addJob(d->currentStrokeId,
+                      new KisFilterStrokeStrategy::Data(image->bounds(), false));
+    }
+
+    d->currentlyAppliedCofiguration = filterConfig;
+}
+
+void KisFilterManager::finish()
+{
+    Q_ASSERT(d->currentStrokeId);
+
+    d->view->image()->endStroke(d->currentStrokeId);
+
+    KisFilterSP filter = \
KisFilterRegistry::instance()->value(d->currentlyAppliedCofiguration->name()); +    \
if (filter->bookmarkManager()) { +        \
filter->bookmarkManager()->save(KisBookmarkedConfigurationManager::ConfigLastUsed.id(),
 +                                       d->currentlyAppliedCofiguration.data());
+    }
+
+    d->lastConfiguration = d->currentlyAppliedCofiguration;
     d->reapplyAction->setEnabled(true);
-    d->reapplyAction->setText(i18n("Apply Filter Again: %1", \
handler->filterName())); +    d->reapplyAction->setText(i18n("Apply Filter Again: \
%1", filter->name())); +
+    d->currentStrokeId.clear();
+    d->currentlyAppliedCofiguration.clear();
 }
 
+void KisFilterManager::cancel()
+{
+    Q_ASSERT(d->currentStrokeId);
+
+    d->view->image()->cancelStroke(d->currentStrokeId);
+
+    d->currentStrokeId.clear();
+    d->currentlyAppliedCofiguration.clear();
+}
+
+bool KisFilterManager::isStrokeRunning() const
+{
+    return d->currentStrokeId;
+}
diff --git a/krita/ui/kis_filter_manager.h b/krita/ui/kis_filter_manager.h
index 64f0659..6783d11 100644
--- a/krita/ui/kis_filter_manager.h
+++ b/krita/ui/kis_filter_manager.h
@@ -22,13 +22,11 @@
 
 #include <QObject>
 #include <krita_export.h>
+#include <kis_types.h>
 
-class KAction;
 class KisView2;
 class KisDoc2;
-class KisFilter;
 class KActionCollection;
-class KisFilterHandler;
 
 /**
  * Create all the filter actions for the specified view and implement re-apply \
filter @@ -45,11 +43,17 @@ public:
 
     void setup(KActionCollection * ac);
     void updateGUI();
-    void setLastFilterHandler(KisFilterHandler* handler);
+
+    void apply(KisSafeFilterConfigurationSP filterConfig);
+    void finish();
+    void cancel();
+    bool isStrokeRunning() const;
 
 private slots:
 
-    void insertFilter(const QString & name);
+    void insertFilter(const QString &name);
+    void showFilterDialog(const QString &filterId);
+    void reapplyLastFilter();
 
 private:
     struct Private;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic