Index: libs/image/kis_layer_utils.cpp =================================================================== --- libs/image/kis_layer_utils.cpp +++ libs/image/kis_layer_utils.cpp @@ -50,6 +50,7 @@ #include "lazybrush/kis_colorize_mask.h" #include "commands/kis_node_property_list_command.h" #include +#include "krita_utils.h" namespace KisLayerUtils { @@ -681,8 +682,11 @@ m_info->dstLayer(), m_info->selectionMasks); } - - safeRemoveMultipleNodes(m_info->allSrcNodes(), m_info->image); + KisNodeList safeNodesToDelete = m_info->allSrcNodes(); + KritaUtils::filterContainer(safeNodesToDelete, [this](KisNodeSP node){ + return !node->userLocked(); + }); + safeRemoveMultipleNodes(safeNodesToDelete, m_info->image); } Index: libs/ui/kis_layer_manager.cc =================================================================== --- libs/ui/kis_layer_manager.cc +++ libs/ui/kis_layer_manager.cc @@ -636,10 +636,11 @@ 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! @@ -648,8 +649,14 @@ 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 {