diff --git a/krita/krita.action b/krita/krita.action --- a/krita/krita.action +++ b/krita/krita.action @@ -2262,6 +2262,54 @@ true + + layer-locked + &Lock/unlock layer + + Lock/unlock layer + Lock/unlock layer + 1000 + 0 + + false + + + + visible + Toggle layer &visibility + + Toggle layer visibility + Toggle layer visibility + 1000 + 0 + + false + + + + transparency-locked + Lock/unlock layer &alpha + + Lock/unlock layer's alpha + Lock/unlock layer's alpha + 1000 + 0 + + false + + + + transparency-enabled + Toggle layer alpha &inheritance + + Toggle layer alpha inheritance + Toggle layer alpha inheritance + 1000 + 0 + + false + + paintLayer &Paint Layer diff --git a/libs/ui/kis_node_manager.h b/libs/ui/kis_node_manager.h --- a/libs/ui/kis_node_manager.h +++ b/libs/ui/kis_node_manager.h @@ -200,6 +200,11 @@ void slotSplitAlphaWrite(); void slotSplitAlphaSaveMerged(); + void toggleLock(); + void toggleVisibility(); + void toggleAlphaLock(); + void toggleInheritAlpha(); + /** * @brief slotSetSelectedNodes set the list of nodes selected in the layerbox. Selected nodes are not necessarily active nodes. * @param nodes the selected nodes diff --git a/libs/ui/kis_node_manager.cpp b/libs/ui/kis_node_manager.cpp --- a/libs/ui/kis_node_manager.cpp +++ b/libs/ui/kis_node_manager.cpp @@ -340,6 +340,18 @@ action = actionManager->createAction("isolate_layer"); connect(action, SIGNAL(triggered(bool)), this, SLOT(toggleIsolateMode(bool))); + action = actionManager->createAction("toggle_layer_lock"); + connect(action, SIGNAL(triggered()), this, SLOT(toggleLock())); + + action = actionManager->createAction("toggle_layer_visibility"); + connect(action, SIGNAL(triggered()), this, SLOT(toggleVisibility())); + + action = actionManager->createAction("toggle_layer_alpha_lock"); + connect(action, SIGNAL(triggered()), this, SLOT(toggleAlphaLock())); + + action = actionManager->createAction("toggle_layer_inherit_alpha"); + connect(action, SIGNAL(triggered()), this, SLOT(toggleInheritAlpha())); + action = actionManager->createAction("split_alpha_into_mask"); connect(action, SIGNAL(triggered()), this, SLOT(slotSplitAlphaIntoMask())); @@ -1131,6 +1143,74 @@ m_d->mergeTransparencyMaskAsAlpha(false); } +void KisNodeManager::toggleLock() +{ + KisNodeList nodes = this->selectedNodes(); + KisNodeSP active = activeNode(); + if (nodes.isEmpty() || !active) return; + + bool isLocked = active->userLocked(); + + for (auto &node : nodes) { + node->setUserLocked(!isLocked); + } +} + +void KisNodeManager::toggleVisibility() +{ + KisNodeList nodes = this->selectedNodes(); + KisNodeSP active = activeNode(); + if (nodes.isEmpty() || !active) return; + + bool isVisible = active->visible(); + + for (auto &node : nodes) { + node->setVisible(!isVisible); + node->setDirty(); + } +} + +void KisNodeManager::toggleAlphaLock() +{ + KisNodeList nodes = this->selectedNodes(); + KisNodeSP active = activeNode(); + if (nodes.isEmpty() || !active) return; + + auto layer = qobject_cast(active.data()); + if (!layer) { + return; + } + + bool isAlphaLocked = layer->alphaLocked(); + for (auto &node : nodes) { + auto layer = qobject_cast(node.data()); + if (layer) { + layer->setAlphaLocked(!isAlphaLocked); + } + } +} + +void KisNodeManager::toggleInheritAlpha() +{ + KisNodeList nodes = this->selectedNodes(); + KisNodeSP active = activeNode(); + if (nodes.isEmpty() || !active) return; + + auto layer = qobject_cast(active.data()); + if (!layer) { + return; + } + + bool isAlphaDisabled = layer->alphaChannelDisabled(); + for (auto &node : nodes) { + auto layer = qobject_cast(node.data()); + if (layer) { + layer->disableAlphaChannel(!isAlphaDisabled); + node->setDirty(); + } + } +} + void KisNodeManager::cutLayersToClipboard() { KisNodeList nodes = this->selectedNodes(); diff --git a/plugins/dockers/defaultdockers/kis_layer_box.cpp b/plugins/dockers/defaultdockers/kis_layer_box.cpp --- a/plugins/dockers/defaultdockers/kis_layer_box.cpp +++ b/plugins/dockers/defaultdockers/kis_layer_box.cpp @@ -564,6 +564,11 @@ addActionToMenu(groupMenu, "create_quick_group"); addActionToMenu(groupMenu, "create_quick_clipping_group"); addActionToMenu(groupMenu, "quick_ungroup"); + QMenu *locksMenu = menu.addMenu(i18n("&Locks && visibility")); + addActionToMenu(locksMenu, "toggle_layer_lock"); + addActionToMenu(locksMenu, "toggle_layer_visibility"); + addActionToMenu(locksMenu, "toggle_layer_alpha_lock"); + addActionToMenu(locksMenu, "toggle_layer_inherit_alpha"); if (singleLayer) { QMenu *addLayerMenu = menu.addMenu(i18n("&Add"));