[krita] /: Make ShowGlobalSelectionMask option auto-create the mask

Dmitry Kazakov null at kde.org
Fri Aug 17 17:11:13 BST 2018


Git commit 23be34a6bd97a01cc6615e06209018e3868ea3b6 by Dmitry Kazakov.
Committed on 17/08/2018 at 16:10.
Pushed by dkazakov into branch 'master'.

Make ShowGlobalSelectionMask option auto-create the mask

1) When the option is activated and there is no global mask yet,
   a new mask is created.

2) When the option is deactivated and the global selection mask
   is empty (nothing selected!), then the mask is automatically
   deleted

TODO: perhaps we don't want to save this option into KisConfig
      anymore, but somehow activate that depending on the presence
      on a global selection in the image?

BUG:343218
CC:kimageshop at kde.org

M  +13   -0    libs/image/kis_layer_utils.cpp
M  +8    -0    libs/image/kis_layer_utils.h
M  +45   -10   plugins/dockers/defaultdockers/kis_layer_box.cpp

https://commits.kde.org/krita/23be34a6bd97a01cc6615e06209018e3868ea3b6

diff --git a/libs/image/kis_layer_utils.cpp b/libs/image/kis_layer_utils.cpp
index cbc9867d35c..2a2f0e24981 100644
--- a/libs/image/kis_layer_utils.cpp
+++ b/libs/image/kis_layer_utils.cpp
@@ -574,6 +574,19 @@ namespace KisLayerUtils {
         m_image->signalRouter()->emitNotification(type);
     }
 
+    SelectGlobalSelectionMask::SelectGlobalSelectionMask(KisImageSP image)
+        : m_image(image)
+    {
+    }
+
+    void SelectGlobalSelectionMask::redo() {
+
+        KisImageSignalType type =
+                ComplexNodeReselectionSignal(m_image->rootLayer()->selectionMask(), KisNodeList());
+        m_image->signalRouter()->emitNotification(type);
+
+    }
+
     KisLayerSP constructDefaultLayer(KisImageSP image) {
         return new KisPaintLayer(image.data(), image->nextLayerName(), OPACITY_OPAQUE_U8, image->colorSpace());
     }
diff --git a/libs/image/kis_layer_utils.h b/libs/image/kis_layer_utils.h
index 87962f4e8fe..1ce9ede5064 100644
--- a/libs/image/kis_layer_utils.h
+++ b/libs/image/kis_layer_utils.h
@@ -125,6 +125,14 @@ namespace KisLayerUtils
         KisImageWSP m_image;
     };
 
+    struct KRITAIMAGE_EXPORT SelectGlobalSelectionMask : public KUndo2Command
+    {
+        SelectGlobalSelectionMask(KisImageSP image);
+        void redo() override;
+
+        KisImageSP m_image;
+    };
+
     KRITAIMAGE_EXPORT KisLayerSP constructDefaultLayer(KisImageSP image);
 
     class KRITAIMAGE_EXPORT RemoveNodeHelper {
diff --git a/plugins/dockers/defaultdockers/kis_layer_box.cpp b/plugins/dockers/defaultdockers/kis_layer_box.cpp
index d60f469e323..562ceb9ff59 100644
--- a/plugins/dockers/defaultdockers/kis_layer_box.cpp
+++ b/plugins/dockers/defaultdockers/kis_layer_box.cpp
@@ -86,6 +86,10 @@
 #include "kis_color_filter_combo.h"
 #include "kis_node_filter_proxy_model.h"
 
+#include "kis_selection.h"
+#include "kis_processing_applicator.h"
+#include "commands/kis_set_global_selection_command.h"
+
 #include "kis_layer_utils.h"
 
 #include "ui_wdglayerbox.h"
@@ -778,6 +782,7 @@ void KisLayerBox::slotEditGlobalSelection(bool showSelections)
 {
     KisNodeSP lastActiveNode = m_nodeManager->activeNode();
     KisNodeSP activateNode = lastActiveNode;
+    KisSelectionMaskSP globalSelectionMask;
 
     if (!showSelections) {
         activateNode = findNonHidableNode(activateNode);
@@ -785,20 +790,50 @@ void KisLayerBox::slotEditGlobalSelection(bool showSelections)
 
     m_nodeModel->setShowGlobalSelection(showSelections);
 
-    if (showSelections) {
-        KisNodeSP newMask = m_image->rootLayer()->selectionMask();
-        if (newMask) {
-            activateNode = newMask;
+    globalSelectionMask = m_image->rootLayer()->selectionMask();
+    if (globalSelectionMask) {
+        if (showSelections) {
+            activateNode = globalSelectionMask;
         }
     }
 
-    if (activateNode) {
-        if (lastActiveNode != activateNode) {
-            m_nodeManager->slotNonUiActivatedNode(activateNode);
-        } else {
-            setCurrentNode(lastActiveNode);
-        }
+    if (activateNode != lastActiveNode) {
+        m_nodeManager->slotNonUiActivatedNode(activateNode);
+    } else if (lastActiveNode) {
+        setCurrentNode(lastActiveNode);
     }
+
+    if (showSelections && !globalSelectionMask) {
+        KisProcessingApplicator applicator(m_image, 0,
+                                           KisProcessingApplicator::NONE,
+                                           KisImageSignalVector() << ModifiedSignal,
+                                           kundo2_i18n("Quick Selection Mask"));
+
+        applicator.applyCommand(
+            new KisLayerUtils::KeepNodesSelectedCommand(
+                m_nodeManager->selectedNodes(), KisNodeList(),
+                lastActiveNode, 0, m_image, false),
+            KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::EXCLUSIVE);
+        applicator.applyCommand(new KisSetEmptyGlobalSelectionCommand(m_image),
+                                KisStrokeJobData::SEQUENTIAL,
+                                KisStrokeJobData::EXCLUSIVE);
+        applicator.applyCommand(new KisLayerUtils::SelectGlobalSelectionMask(m_image),
+                                KisStrokeJobData::SEQUENTIAL,
+                                KisStrokeJobData::EXCLUSIVE);
+
+        applicator.end();
+    } else if (!showSelections &&
+               globalSelectionMask &&
+               globalSelectionMask->selection()->selectedRect().isEmpty()) {
+
+        KisProcessingApplicator applicator(m_image, 0,
+                                           KisProcessingApplicator::NONE,
+                                           KisImageSignalVector() << ModifiedSignal,
+                                           kundo2_i18n("Cancel Quick Selection Mask"));
+        applicator.applyCommand(new KisSetGlobalSelectionCommand(m_image, 0), KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::EXCLUSIVE);
+        applicator.end();
+    }
+
 }
 
 void KisLayerBox::selectionChanged(const QModelIndexList selection)


More information about the kimageshop mailing list