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

List:       kde-kimageshop
Subject:    Re: [krita] /: Make ShowGlobalSelectionMask option auto-create the mask
From:       Dmitry Kazakov <dimula73 () gmail ! com>
Date:       2018-08-17 16:16:57
Message-ID: 24a2d3fe-cc11-a5fe-8ece-f3bd3dd86728 () gmail ! com
[Download RAW message or body]

Here is a short demo video of this new feature:
http://nonaynever.ru/pub/krita-quick-mask-feature-2018-08-17_19.13.19.mkv

On 17.08.2018 19:11, Dmitry Kazakov wrote:
> 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@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)

-- 
Dmitry Kazakov


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

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