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"));