[calligra] krita: Added UI for converting a Pixel Selection into a Vector Selection

Dmitry Kazakov dimula73 at gmail.com
Tue Jun 4 11:55:32 UTC 2013


Git commit d605242fb18d0deee45829c03ad9ad46400d37b7 by Dmitry Kazakov.
Committed on 04/06/2013 at 13:50.
Pushed by dkazakov into branch 'master'.

Added UI for converting a Pixel Selection into a Vector Selection

Now you can click the menu and your selection will be converted into
a vector one. After this action you can edit it with a shape editing
tooleasily: rotate, scale, edid vertices.

DRAWBACK: you lose information about semi-transparent pixels during
          this conversion!

The backward conversion (vector->pixel) happens automatically when you
start painting on a vector selection.

CCMAIL:kimageshop at kde.org

M  +1    -1    krita/krita.rc
M  +35   -0    krita/ui/actions/kis_selection_action_factories.cpp
M  +5    -0    krita/ui/actions/kis_selection_action_factories.h
M  +2    -0    krita/ui/flake/kis_shape_selection.cpp
M  +3    -3    krita/ui/flake/kis_shape_selection_model.cpp
M  +1    -1    krita/ui/flake/kis_shape_selection_model.h
M  +10   -0    krita/ui/kis_selection_manager.cc
M  +1    -0    krita/ui/kis_selection_manager.h

http://commits.kde.org/calligra/d605242fb18d0deee45829c03ad9ad46400d37b7

diff --git a/krita/krita.rc b/krita/krita.rc
index 6f45ac3..387c9ef 100644
--- a/krita/krita.rc
+++ b/krita/krita.rc
@@ -123,7 +123,7 @@
     <Action name="deselect"/>
     <Action name="reselect"/>
     <Action name="invert"/>
-
+    <Action name="convert_to_vector_selection"/>
     <Separator/>
     <Action name="feather"/>
     <Action name = "similar"/>
diff --git a/krita/ui/actions/kis_selection_action_factories.cpp b/krita/ui/actions/kis_selection_action_factories.cpp
index eb3dfa6..bf49d0a 100644
--- a/krita/ui/actions/kis_selection_action_factories.cpp
+++ b/krita/ui/actions/kis_selection_action_factories.cpp
@@ -25,6 +25,8 @@
 #include <KoDocumentEntry.h>
 #include <KoServiceProvider.h>
 #include <KoPart.h>
+#include <KoPathShape.h>
+#include <KoShapeController.h>
 
 #include "kis_view2.h"
 #include "kis_canvas_resource_provider.h"
@@ -44,6 +46,7 @@
 #include "kis_selection_manager.h"
 #include "kis_transaction_based_command.h"
 #include "kis_selection_filters.h"
+#include "kis_shape_selection.h"
 
 namespace ActionHelper {
 
@@ -361,3 +364,35 @@ void KisInvertSelectionOperaton::runFromXML(KisView2* view, const KisOperationCo
     KisSelectionFilter* filter = new KisInvertSelectionFilter();
     runFilter(filter, view, config);
 }
+
+void KisSelectionToVectorActionFactory::run(KisView2 *view)
+{
+    KisSelectionSP selection = view->selection();
+
+    if (selection->hasShapeSelection() ||
+        !selection->outlineCacheValid()) {
+
+        return;
+    }
+
+    QPainterPath selectionOutline = selection->outlineCache();
+    QTransform transform = view->canvasBase()->coordinatesConverter()->imageToDocumentTransform();
+
+    KoShape *shape = KoPathShape::createShapeFromPainterPath(transform.map(selectionOutline));
+    shape->setShapeId(KoPathShapeId);
+
+    /**
+     * Mark a shape that it belongs to a shape selection
+     */
+    if(!shape->userData()) {
+        shape->setUserData(new KisShapeSelectionMarker);
+    }
+
+    KisProcessingApplicator *ap = beginAction(view, i18n("Convert to Vector Selection"));
+
+    ap->applyCommand(view->canvasBase()->shapeController()->addShape(shape),
+                     KisStrokeJobData::SEQUENTIAL,
+                     KisStrokeJobData::EXCLUSIVE);
+
+    endAction(ap, KisOperationConfiguration(id()).toXML());
+}
diff --git a/krita/ui/actions/kis_selection_action_factories.h b/krita/ui/actions/kis_selection_action_factories.h
index afd5a1b..2ca04f8 100644
--- a/krita/ui/actions/kis_selection_action_factories.h
+++ b/krita/ui/actions/kis_selection_action_factories.h
@@ -103,4 +103,9 @@ struct KisInvertSelectionOperaton : public KisFilterSelectionOperation {
     void runFromXML(KisView2 *view, const KisOperationConfiguration &config);
 };
 
+struct KRITAUI_EXPORT KisSelectionToVectorActionFactory : public KisNoParameterActionFactory {
+    KisSelectionToVectorActionFactory() : KisNoParameterActionFactory("paste-new-ui-action") {}
+    void run(KisView2 *view);
+};
+
 #endif /* __KIS_SELECTION_ACTION_FACTORIES_H */
diff --git a/krita/ui/flake/kis_shape_selection.cpp b/krita/ui/flake/kis_shape_selection.cpp
index 24618f4..d825fef 100644
--- a/krita/ui/flake/kis_shape_selection.cpp
+++ b/krita/ui/flake/kis_shape_selection.cpp
@@ -77,6 +77,8 @@ KisShapeSelection::KisShapeSelection(KisImageWSP image, KisSelectionWSP selectio
     m_canvas = new KisShapeSelectionCanvas();
     m_canvas->shapeManager()->addShape(this);
 
+    m_model->moveToThread(image->thread());
+    m_canvas->moveToThread(image->thread());
 }
 
 KisShapeSelection::~KisShapeSelection()
diff --git a/krita/ui/flake/kis_shape_selection_model.cpp b/krita/ui/flake/kis_shape_selection_model.cpp
index d0e7a3d..4c59ad0 100644
--- a/krita/ui/flake/kis_shape_selection_model.cpp
+++ b/krita/ui/flake/kis_shape_selection_model.cpp
@@ -32,10 +32,10 @@ KisShapeSelectionModel::KisShapeSelectionModel(KisImageWSP image, KisSelectionWS
     : m_image(image)
     , m_parentSelection(selection)
     , m_shapeSelection(shapeSelection)
-    , m_updateSignalCompressor(300, false)
+    , m_updateSignalCompressor(new KisSignalCompressor(300, false, this))
     , m_updatesEnabled(true)
 {
-    connect(&m_updateSignalCompressor, SIGNAL(timeout()), SLOT(startUpdateJob()));
+    connect(m_updateSignalCompressor, SIGNAL(timeout()), SLOT(startUpdateJob()));
 }
 
 KisShapeSelectionModel::~KisShapeSelectionModel()
@@ -50,7 +50,7 @@ void KisShapeSelectionModel::requestUpdate(const QRect &updateRect)
 
     if (m_updatesEnabled) {
         m_updateRect = !updateRect.isEmpty() ? m_updateRect | updateRect : QRect();
-        m_updateSignalCompressor.start();
+        m_updateSignalCompressor->start();
     }
 }
 
diff --git a/krita/ui/flake/kis_shape_selection_model.h b/krita/ui/flake/kis_shape_selection_model.h
index 85b6503..05b8646 100644
--- a/krita/ui/flake/kis_shape_selection_model.h
+++ b/krita/ui/flake/kis_shape_selection_model.h
@@ -65,7 +65,7 @@ private:
     KisSelectionWSP m_parentSelection;
     KisShapeSelection* m_shapeSelection;
 
-    KisSignalCompressor m_updateSignalCompressor;
+    KisSignalCompressor *m_updateSignalCompressor;
     QRect m_updateRect;
     bool m_updatesEnabled;
 };
diff --git a/krita/ui/kis_selection_manager.cc b/krita/ui/kis_selection_manager.cc
index e0b653e..4d0f955 100644
--- a/krita/ui/kis_selection_manager.cc
+++ b/krita/ui/kis_selection_manager.cc
@@ -220,6 +220,11 @@ void KisSelectionManager::setup(KActionCollection * collection, KisActionManager
     actionManager->addAction("resizeimagetoselection", m_imageResizeToSelection, collection);
     connect(m_imageResizeToSelection, SIGNAL(triggered()), this, SLOT(imageResizeToSelection()));
 
+    KisAction *action = new KisAction(i18n("Convert to Vector Selection"), this);
+    action->setActivationFlags(KisAction::PIXEL_SELECTION_WITH_PIXELS);
+    actionManager->addAction("convert_to_vector_selection", action, collection);
+    connect(action, SIGNAL(triggered()), SLOT(convertToVectorSelection()));
+
 //     m_load
 //         = new KAction(i18n("Load..."),
 //                   0, 0,
@@ -390,6 +395,11 @@ void KisSelectionManager::reselect()
     factory.run(m_view);
 }
 
+void KisSelectionManager::convertToVectorSelection()
+{
+    KisSelectionToVectorActionFactory factory;
+    factory.run(m_view);
+}
 
 void KisSelectionManager::clear()
 {
diff --git a/krita/ui/kis_selection_manager.h b/krita/ui/kis_selection_manager.h
index e990e9a..6dd4ec7 100644
--- a/krita/ui/kis_selection_manager.h
+++ b/krita/ui/kis_selection_manager.h
@@ -83,6 +83,7 @@ public slots:
     void fillBackgroundColor();
     void fillPattern();
     void reselect();
+    void convertToVectorSelection();
 
     void copySelectionToNewLayer();
     void toggleDisplaySelection();


More information about the kimageshop mailing list