[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-kimageshop
Subject: [krita] libs: FEATURE: Allow to deselect/reselect local selection if it is present
From: Dmitry Kazakov <null () kde ! org>
Date: 2018-08-22 15:08:41
Message-ID: E1fsUkT-00007K-7v () code ! kde ! org
[Download RAW message or body]
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 [from: \
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 [from: \
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/libs/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 <dimula73@gmail.com>
+ *
+ * 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 "KisDeselectActiveSelectionCommand.h"
+#include "kis_image.h"
+#include "kis_selection.h"
+#include "kis_selection_mask.h"
+
+KisDeselectActiveSelectionCommand::KisDeselectActiveSelectionCommand(KisSelectionSP \
activeSelection, KisImageWSP image, KUndo2Command *parent) + : \
KisDeselectGlobalSelectionCommand(image, parent), + \
m_activeSelection(activeSelection) +{
+}
+
+KisDeselectActiveSelectionCommand::~KisDeselectActiveSelectionCommand()
+{
+}
+
+void KisDeselectActiveSelectionCommand::redo()
+{
+ KisImageSP image = m_image.toStrongRef();
+ KIS_SAFE_ASSERT_RECOVER_RETURN(image);
+
+ if (m_activeSelection && m_activeSelection == image->globalSelection()) {
+ KisDeselectGlobalSelectionCommand::redo();
+ } else if (m_activeSelection) {
+ KisNodeSP parentNode = m_activeSelection->parentNode();
+ if (!parentNode) return;
+
+ m_deselectedMask = dynamic_cast<KisSelectionMask*>(parentNode.data());
+ 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/commands/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 <boud@kde.org>
+ * Copyright (c) 2018 Dmitry Kazakov <dimula73@gmail.com>
*
* 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-1301, 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 \
KisDeselectGlobalSelectionCommand +{
+public:
+ KisDeselectActiveSelectionCommand(KisSelectionSP activeSelection, KisImageWSP \
image, KUndo2Command * parent = 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/libs/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 <dimula73@gmail.com>
+ *
+ * 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 "KisReselectActiveSelectionCommand.h"
+
+#include "kis_image.h"
+#include "kis_node.h"
+#include "kis_layer.h"
+#include "kis_selection_mask.h"
+#include <KoProperties.h>
+
+
+KisReselectActiveSelectionCommand::KisReselectActiveSelectionCommand(KisNodeSP \
activeNode, KisImageWSP image, KUndo2Command *parent) + : \
KisReselectGlobalSelectionCommand(image, parent), + m_activeNode(activeNode)
+{
+}
+
+void KisReselectActiveSelectionCommand::redo()
+{
+ bool shouldReselectFGlobalSelection = true;
+
+ if (m_activeNode) {
+ KisSelectionMaskSP mask = \
dynamic_cast<KisSelectionMask*>(m_activeNode.data()); +
+ if (!mask) {
+
+ KisLayerSP layer;
+ KisNodeSP node = m_activeNode;
+ while (node && !(layer = dynamic_cast<KisLayer*>(node.data()))) {
+ node = node->parent();
+ }
+
+ if (layer && !layer->selectionMask()) {
+ KoProperties properties;
+ properties.setProperty("active", false);
+ properties.setProperty("visible", true);
+ QList<KisNodeSP> masks = \
layer->childNodes(QStringList("KisSelectionMask"), properties); +
+ if (!masks.isEmpty()) {
+ mask = dynamic_cast<KisSelectionMask*>(masks.first().data());
+ }
+ } else if (layer && layer->selectionMask()) {
+ shouldReselectFGlobalSelection = false;
+ }
+ }
+
+ if (mask) {
+ mask->setActive(true);
+ shouldReselectFGlobalSelection = false;
+ m_reselectedMask = 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/commands/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 <boud@kde.org>
+ * Copyright (c) 2018 Dmitry Kazakov <dimula73@gmail.com>
*
* 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-1301, 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 \
KisReselectGlobalSelectionCommand +{
+public:
+ KisReselectActiveSelectionCommand(KisNodeSP activeNode, KisImageWSP image, \
KUndo2Command * parent = 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/commands/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/actions/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 = view->image();
if (!image) return;
- KUndo2Command *cmd = new KisDeselectGlobalSelectionCommand(image);
+ KUndo2Command *cmd = new KisDeselectActiveSelectionCommand(view->selection(), \
image);
KisProcessingApplicator *ap = beginAction(view, cmd->text());
ap->applyCommand(cmd, KisStrokeJobData::SEQUENTIAL, \
KisStrokeJobData::EXCLUSIVE); @@ -184,7 +184,7 @@ void \
KisReselectActionFactory::run(KisViewManager *view) KisImageWSP image = \
view->image(); if (!image) return;
- KUndo2Command *cmd = new KisReselectGlobalSelectionCommand(image);
+ KUndo2Command *cmd = new KisReselectActiveSelectionCommand(view->activeNode(), \
image);
KisProcessingApplicator *ap = beginAction(view, cmd->text());
ap->applyCommand(cmd, KisStrokeJobData::SEQUENTIAL, \
KisStrokeJobData::EXCLUSIVE);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic