diff --git a/libs/image/CMakeLists.txt b/libs/image/CMakeLists.txt --- a/libs/image/CMakeLists.txt +++ b/libs/image/CMakeLists.txt @@ -78,6 +78,7 @@ brushengine/kis_standard_uniform_properties_factory.cpp commands/kis_deselect_global_selection_command.cpp commands/kis_image_change_layers_command.cpp + commands/kis_image_change_visibility_command.cpp commands/kis_image_command.cpp commands/kis_image_set_projection_color_space_command.cpp commands/kis_image_layer_add_command.cpp diff --git a/libs/image/commands/kis_image_change_visibility_command.h b/libs/image/commands/kis_image_change_visibility_command.h new file mode 100644 --- /dev/null +++ b/libs/image/commands/kis_image_change_visibility_command.h @@ -0,0 +1,24 @@ +#ifndef KIS_IMAGE_CHANGE_VISIBILITY_COMMAND_H_ +#define KIS_IMAGE_CHANGE_VISIBILITY_COMMAND_H_ + +#include + +#include "kis_types.h" +#include + +class KisImageChangeVisibilityCommand : public KUndo2Command +{ + +public: + KisImageChangeVisibilityCommand(bool visibility, KisNodeSP node); + + void redo() override; + void undo() override; + +private: + bool m_visible; + KisNodeSP m_node; + +}; + +#endif diff --git a/libs/image/commands/kis_image_change_visibility_command.cpp b/libs/image/commands/kis_image_change_visibility_command.cpp new file mode 100644 --- /dev/null +++ b/libs/image/commands/kis_image_change_visibility_command.cpp @@ -0,0 +1,23 @@ +#include "kis_image_commands.h" +#include "kis_image.h" +#include "kis_node.h" + +#include + + +KisImageChangeVisibilityCommand::KisImageChangeVisibilityCommand(bool visibility, KisNodeSP node) + : KUndo2Command(kundo2_noi18n("change-visibility-command"), 0) +{ + m_node = node; + m_visible = visibility; +} + +void KisImageChangeVisibilityCommand::redo() +{ + m_node->setVisible(m_visible); +} + +void KisImageChangeVisibilityCommand::undo() +{ + m_node->setVisible(!m_visible); +} diff --git a/libs/image/commands/kis_image_commands.h b/libs/image/commands/kis_image_commands.h --- a/libs/image/commands/kis_image_commands.h +++ b/libs/image/commands/kis_image_commands.h @@ -26,5 +26,6 @@ #include "kis_image_layer_move_command.h" #include "kis_image_layer_remove_command.h" #include "kis_image_lock_command.h" +#include "kis_image_change_visibility_command.h" #endif diff --git a/libs/image/kis_layer_utils.cpp b/libs/image/kis_layer_utils.cpp --- a/libs/image/kis_layer_utils.cpp +++ b/libs/image/kis_layer_utils.cpp @@ -39,6 +39,7 @@ #include "commands/kis_image_layer_move_command.h" #include "commands/kis_image_change_layers_command.h" #include "commands_new/kis_activate_selection_mask_command.h" +#include "commands/kis_image_change_visibility_command.h" #include "kis_abstract_projection_plane.h" #include "kis_processing_applicator.h" #include "kis_image_animation_interface.h" @@ -50,6 +51,7 @@ #include "lazybrush/kis_colorize_mask.h" #include "commands/kis_node_property_list_command.h" #include +#include "krita_utils.h" namespace KisLayerUtils { @@ -682,7 +684,18 @@ m_info->selectionMasks); } - safeRemoveMultipleNodes(m_info->allSrcNodes(), m_info->image); + KisNodeList safeNodesToDelete = m_info->allSrcNodes(); + for (KisNodeList::iterator it = safeNodesToDelete.begin(); it != safeNodesToDelete.end(); ++it) { + KisNodeSP node = *it; + if (node->userLocked() && node->visible()) { + addCommand(new KisImageChangeVisibilityCommand(false, node)); + } + } + + KritaUtils::filterContainer(safeNodesToDelete, [this](KisNodeSP node) { + return !node->userLocked(); + }); + safeRemoveMultipleNodes(safeNodesToDelete, m_info->image); } @@ -1048,7 +1061,7 @@ int putAfterIndex = -1; Q_FOREACH(KisNodeSP node, nodes) { - if (node->visible()) { + if (node->visible() || node->userLocked()) { visibleNodes << node; } else { *invisibleNodes << node; diff --git a/libs/ui/kis_layer_manager.cc b/libs/ui/kis_layer_manager.cc --- a/libs/ui/kis_layer_manager.cc +++ b/libs/ui/kis_layer_manager.cc @@ -636,20 +636,27 @@ if (!m_view->blockUntilOperationsFinished(image)) return; QList selectedNodes = m_view->nodeManager()->selectedNodes(); - if (selectedNodes.size() > 1) { + if (selectedNodes.size() > 1) { image->mergeMultipleLayers(selectedNodes, m_view->activeNode()); + } - } else if (tryMergeSelectionMasks(m_view->activeNode(), image)) { + else if (tryMergeSelectionMasks(m_view->activeNode(), image)) { // already done! } else if (tryFlattenGroupLayer(m_view->activeNode(), image)) { // already done! } else { if (!layer->prevSibling()) return; KisLayer *prevLayer = qobject_cast(layer->prevSibling().data()); if (!prevLayer) return; + if (prevLayer->userLocked()) { + m_view->showFloatingMessage( + i18nc("floating message in layer manager", + "Layer is locked "), + QIcon(), 2000, KisFloatingMessage::Low); + } - if (layer->metaData()->isEmpty() && prevLayer->metaData()->isEmpty()) { + else if (layer->metaData()->isEmpty() && prevLayer->metaData()->isEmpty()) { image->mergeDown(layer, KisMetaData::MergeStrategyRegistry::instance()->get("Drop")); } else {