Git commit 40a489ee0b099124059e23b4f0462eb6b9135f8b by Dmitry Kazakov. Committed on 22/08/2018 at 15:08. Pushed by dkazakov into branch 'master'. FEATURE: Allow to deselect/reselect local selection if it is present Previously Deselect and Reselect actions could be used only for global selection. Now, if there is a local selection active, they will activate/deactivate the selection mask. CCBUG:341973 CC:kimageshop@kde.org M +2 -0 libs/image/CMakeLists.txt A +65 -0 libs/image/commands/KisDeselectActiveSelectionCommand.cpp = [License: GPL (v2+)] C +17 -6 libs/image/commands/KisDeselectActiveSelectionCommand.h [fro= m: libs/image/commands/kis_selection_commands.h - 056% similarity] A +83 -0 libs/image/commands/KisReselectActiveSelectionCommand.cpp = [License: GPL (v2+)] C +17 -6 libs/image/commands/KisReselectActiveSelectionCommand.h [fro= m: libs/image/commands/kis_selection_commands.h - 059% similarity] M +1 -1 libs/image/commands/kis_deselect_global_selection_command.h M +1 -1 libs/image/commands/kis_reselect_global_selection_command.h M +2 -0 libs/image/commands/kis_selection_commands.h M +1 -0 libs/image/kis_selection.h M +2 -2 libs/ui/actions/kis_selection_action_factories.cpp https://commits.kde.org/krita/40a489ee0b099124059e23b4f0462eb6b9135f8b diff --git a/libs/image/CMakeLists.txt b/libs/image/CMakeLists.txt index 1fa68ecb61c..06d757f161a 100644 --- a/libs/image/CMakeLists.txt +++ b/libs/image/CMakeLists.txt @@ -82,6 +82,7 @@ set(kritaimage_LIB_SRCS brushengine/KisStrokeSpeedMeasurer.cpp brushengine/KisPaintopSettingsIds.cpp commands/kis_deselect_global_selection_command.cpp + commands/KisDeselectActiveSelectionCommand.cpp commands/kis_image_change_layers_command.cpp commands/kis_image_change_visibility_command.cpp commands/kis_image_command.cpp @@ -96,6 +97,7 @@ set(kritaimage_LIB_SRCS commands/kis_node_opacity_command.cpp commands/kis_node_property_list_command.cpp commands/kis_reselect_global_selection_command.cpp + commands/KisReselectActiveSelectionCommand.cpp commands/kis_set_global_selection_command.cpp commands_new/kis_saved_commands.cpp commands_new/kis_processing_command.cpp diff --git a/libs/image/commands/KisDeselectActiveSelectionCommand.cpp b/li= bs/image/commands/KisDeselectActiveSelectionCommand.cpp new file mode 100644 index 00000000000..195a6edd7e0 --- /dev/null +++ b/libs/image/commands/KisDeselectActiveSelectionCommand.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018 Dmitry Kazakov + * + * 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-13= 01, USA. + */ + +#include "KisDeselectActiveSelectionCommand.h" +#include "kis_image.h" +#include "kis_selection.h" +#include "kis_selection_mask.h" + +KisDeselectActiveSelectionCommand::KisDeselectActiveSelectionCommand(KisSe= lectionSP activeSelection, KisImageWSP image, KUndo2Command *parent) + : KisDeselectGlobalSelectionCommand(image, parent), + m_activeSelection(activeSelection) +{ +} + +KisDeselectActiveSelectionCommand::~KisDeselectActiveSelectionCommand() +{ +} + +void KisDeselectActiveSelectionCommand::redo() +{ + KisImageSP image =3D m_image.toStrongRef(); + KIS_SAFE_ASSERT_RECOVER_RETURN(image); + + if (m_activeSelection && m_activeSelection =3D=3D image->globalSelecti= on()) { + KisDeselectGlobalSelectionCommand::redo(); + } else if (m_activeSelection) { + KisNodeSP parentNode =3D m_activeSelection->parentNode(); + if (!parentNode) return; + + m_deselectedMask =3D dynamic_cast(parentNode.da= ta()); + if (m_deselectedMask) { + KIS_SAFE_ASSERT_RECOVER(m_deselectedMask->active()) { + m_deselectedMask.clear(); + return; + } + + m_deselectedMask->setActive(false); + } + } +} + +void KisDeselectActiveSelectionCommand::undo() +{ + if (m_deselectedMask) { + m_deselectedMask->setActive(true); + m_deselectedMask.clear(); + } else { + KisDeselectGlobalSelectionCommand::undo(); + } +} diff --git a/libs/image/commands/kis_selection_commands.h b/libs/image/comm= ands/KisDeselectActiveSelectionCommand.h similarity index 56% copy from libs/image/commands/kis_selection_commands.h copy to libs/image/commands/KisDeselectActiveSelectionCommand.h index 2cdc0fb0956..c9742ccb72f 100644 --- a/libs/image/commands/kis_selection_commands.h +++ b/libs/image/commands/KisDeselectActiveSelectionCommand.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008 Boudewijn Rempt + * Copyright (c) 2018 Dmitry Kazakov * * 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 @@ -16,12 +16,23 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-13= 01, USA. */ = -#ifndef KIS_SELECTION_COMMANDS_H -#define KIS_SELECTION_COMMANDS_H +#ifndef KISDESELECTACTIVESELECTIONCOMMAND_H +#define KISDESELECTACTIVESELECTIONCOMMAND_H = #include "kis_deselect_global_selection_command.h" -#include "kis_reselect_global_selection_command.h" -#include "kis_set_global_selection_command.h" = -#endif +class KRITAIMAGE_EXPORT KisDeselectActiveSelectionCommand : public KisDese= lectGlobalSelectionCommand +{ +public: + KisDeselectActiveSelectionCommand(KisSelectionSP activeSelection, KisI= mageWSP image, KUndo2Command * parent =3D 0); + ~KisDeselectActiveSelectionCommand() override; = + void redo() override; + void undo() override; + +private: + KisSelectionSP m_activeSelection; + KisSelectionMaskSP m_deselectedMask; +}; + +#endif // KISDESELECTACTIVESELECTIONCOMMAND_H diff --git a/libs/image/commands/KisReselectActiveSelectionCommand.cpp b/li= bs/image/commands/KisReselectActiveSelectionCommand.cpp new file mode 100644 index 00000000000..4af691f9c56 --- /dev/null +++ b/libs/image/commands/KisReselectActiveSelectionCommand.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018 Dmitry Kazakov + * + * 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-13= 01, USA. + */ + +#include "KisReselectActiveSelectionCommand.h" + +#include "kis_image.h" +#include "kis_node.h" +#include "kis_layer.h" +#include "kis_selection_mask.h" +#include + + +KisReselectActiveSelectionCommand::KisReselectActiveSelectionCommand(KisNo= deSP activeNode, KisImageWSP image, KUndo2Command *parent) + : KisReselectGlobalSelectionCommand(image, parent), + m_activeNode(activeNode) +{ +} + +void KisReselectActiveSelectionCommand::redo() +{ + bool shouldReselectFGlobalSelection =3D true; + + if (m_activeNode) { + KisSelectionMaskSP mask =3D dynamic_cast(m_acti= veNode.data()); + + if (!mask) { + + KisLayerSP layer; + KisNodeSP node =3D m_activeNode; + while (node && !(layer =3D dynamic_cast(node.data()= ))) { + node =3D node->parent(); + } + + if (layer && !layer->selectionMask()) { + KoProperties properties; + properties.setProperty("active", false); + properties.setProperty("visible", true); + QList masks =3D layer->childNodes(QStringList("= KisSelectionMask"), properties); + + if (!masks.isEmpty()) { + mask =3D dynamic_cast(masks.first()= .data()); + } + } else if (layer && layer->selectionMask()) { + shouldReselectFGlobalSelection =3D false; + } + } + + if (mask) { + mask->setActive(true); + shouldReselectFGlobalSelection =3D false; + m_reselectedMask =3D mask; + } + } + + if (shouldReselectFGlobalSelection) { + KisReselectGlobalSelectionCommand::redo(); + } +} + +void KisReselectActiveSelectionCommand::undo() +{ + if (m_reselectedMask) { + m_reselectedMask->setActive(false); + m_reselectedMask.clear(); + } else { + KisReselectGlobalSelectionCommand::undo(); + } +} diff --git a/libs/image/commands/kis_selection_commands.h b/libs/image/comm= ands/KisReselectActiveSelectionCommand.h similarity index 59% copy from libs/image/commands/kis_selection_commands.h copy to libs/image/commands/KisReselectActiveSelectionCommand.h index 2cdc0fb0956..2ffb565a416 100644 --- a/libs/image/commands/kis_selection_commands.h +++ b/libs/image/commands/KisReselectActiveSelectionCommand.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008 Boudewijn Rempt + * Copyright (c) 2018 Dmitry Kazakov * * 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 @@ -16,12 +16,23 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-13= 01, USA. */ = -#ifndef KIS_SELECTION_COMMANDS_H -#define KIS_SELECTION_COMMANDS_H +#ifndef KISRESELECTACTIVESELECTIONCOMMAND_H +#define KISRESELECTACTIVESELECTIONCOMMAND_H = -#include "kis_deselect_global_selection_command.h" #include "kis_reselect_global_selection_command.h" -#include "kis_set_global_selection_command.h" = -#endif = +class KRITAIMAGE_EXPORT KisReselectActiveSelectionCommand : public KisRese= lectGlobalSelectionCommand +{ +public: + KisReselectActiveSelectionCommand(KisNodeSP activeNode, KisImageWSP im= age, KUndo2Command * parent =3D 0); + + void redo() override; + void undo() override; + +private: + KisNodeSP m_activeNode; + KisSelectionMaskSP m_reselectedMask; +}; + +#endif // KISRESELECTACTIVESELECTIONCOMMAND_H diff --git a/libs/image/commands/kis_deselect_global_selection_command.h b/= libs/image/commands/kis_deselect_global_selection_command.h index 39030beb8fb..64982eaace0 100644 --- a/libs/image/commands/kis_deselect_global_selection_command.h +++ b/libs/image/commands/kis_deselect_global_selection_command.h @@ -39,7 +39,7 @@ public: void redo() override; void undo() override; = -private: +protected: KisImageWSP m_image; KisSelectionSP m_oldSelection; }; diff --git a/libs/image/commands/kis_reselect_global_selection_command.h b/= libs/image/commands/kis_reselect_global_selection_command.h index c27a7b848c9..0e5c9dad026 100644 --- a/libs/image/commands/kis_reselect_global_selection_command.h +++ b/libs/image/commands/kis_reselect_global_selection_command.h @@ -38,7 +38,7 @@ public: void redo() override; void undo() override; = -private: +protected: KisImageWSP m_image; bool m_canReselect; }; diff --git a/libs/image/commands/kis_selection_commands.h b/libs/image/comm= ands/kis_selection_commands.h index 2cdc0fb0956..78f31252846 100644 --- a/libs/image/commands/kis_selection_commands.h +++ b/libs/image/commands/kis_selection_commands.h @@ -20,7 +20,9 @@ #define KIS_SELECTION_COMMANDS_H = #include "kis_deselect_global_selection_command.h" +#include "KisDeselectActiveSelectionCommand.h" #include "kis_reselect_global_selection_command.h" +#include "KisReselectActiveSelectionCommand.h" #include "kis_set_global_selection_command.h" = #endif diff --git a/libs/image/kis_selection.h b/libs/image/kis_selection.h index 48930d815e3..97ce6f2c25b 100644 --- a/libs/image/kis_selection.h +++ b/libs/image/kis_selection.h @@ -204,6 +204,7 @@ private: friend class KisAdjustmentLayerTest; friend class KisUpdateSelectionJob; friend class KisSelectionUpdateCompressor; + friend class KisDeselectActiveSelectionCommand; KisNodeWSP parentNode() const; = void copyFrom(const KisSelection &rhs); diff --git a/libs/ui/actions/kis_selection_action_factories.cpp b/libs/ui/a= ctions/kis_selection_action_factories.cpp index 193ae2cf84b..93091ce5863 100644 --- a/libs/ui/actions/kis_selection_action_factories.cpp +++ b/libs/ui/actions/kis_selection_action_factories.cpp @@ -172,7 +172,7 @@ void KisDeselectActionFactory::run(KisViewManager *view) KisImageWSP image =3D view->image(); if (!image) return; = - KUndo2Command *cmd =3D new KisDeselectGlobalSelectionCommand(image); + KUndo2Command *cmd =3D new KisDeselectActiveSelectionCommand(view->sel= ection(), image); = KisProcessingApplicator *ap =3D beginAction(view, cmd->text()); ap->applyCommand(cmd, KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::= EXCLUSIVE); @@ -184,7 +184,7 @@ void KisReselectActionFactory::run(KisViewManager *view) KisImageWSP image =3D view->image(); if (!image) return; = - KUndo2Command *cmd =3D new KisReselectGlobalSelectionCommand(image); + KUndo2Command *cmd =3D new KisReselectActiveSelectionCommand(view->act= iveNode(), image); = KisProcessingApplicator *ap =3D beginAction(view, cmd->text()); ap->applyCommand(cmd, KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::= EXCLUSIVE);