diff --git a/krita/krita.action b/krita/krita.action
--- a/krita/krita.action
+++ b/krita/krita.action
@@ -3567,6 +3567,16 @@
false
+
+ arrowupblr
+ Move Layer or Mask Up to Top
+
+ Move Layer or Mask Up to Top
+
+ Ctrl+Shift+PgUp
+ false
+
+
arrowupblr
Move Layer or Mask Up
@@ -3577,6 +3587,16 @@
false
+
+ arrowdown
+ Move Layer or Mask Down to Bottom
+
+ Move Layer or Mask Down to Bottom
+
+ Ctrl+Shift+PgDown
+ false
+
+
arrowdown
Move Layer or Mask Down
diff --git a/krita/pics/layerbox/layerbox-icons.qrc b/krita/pics/layerbox/layerbox-icons.qrc
--- a/krita/pics/layerbox/layerbox-icons.qrc
+++ b/krita/pics/layerbox/layerbox-icons.qrc
@@ -4,7 +4,9 @@
dark_addlayer.png
dark_addtofolder.png
dark_arrowdown.png
+ dark_arrowdownbottom.png
dark_arrowupblr.png
+ dark_arrowuptop.png
dark_deletelayer.png
dark_duplicatelayer.png
dark_properties.png
@@ -12,7 +14,9 @@
light_addlayer.png
light_addtofolder.png
light_arrowdown.png
+ light_arrowdownbottom.png
light_arrowupblr.png
+ light_arrowuptop.png
light_deletelayer.png
light_duplicatelayer.png
light_properties.png
diff --git a/krita/pics/layerbox/svg/dark_arrowdownbottom.svg b/krita/pics/layerbox/svg/dark_arrowdownbottom.svg
--- a/krita/pics/layerbox/svg/dark_arrowdownbottom.svg
+++ b/krita/pics/layerbox/svg/dark_arrowdownbottom.svg
@@ -0,0 +1,235 @@
+
+
+
+
diff --git a/krita/pics/layerbox/svg/dark_arrowdowntop.svg b/krita/pics/layerbox/svg/dark_arrowdowntop.svg
--- a/krita/pics/layerbox/svg/dark_arrowdowntop.svg
+++ b/krita/pics/layerbox/svg/dark_arrowdowntop.svg
@@ -0,0 +1,236 @@
+
+
+
+
diff --git a/krita/pics/layerbox/svg/dark_arrowuptop.svg b/krita/pics/layerbox/svg/dark_arrowuptop.svg
--- a/krita/pics/layerbox/svg/dark_arrowuptop.svg
+++ b/krita/pics/layerbox/svg/dark_arrowuptop.svg
@@ -0,0 +1,235 @@
+
+
+
+
diff --git a/krita/pics/layerbox/svg/layerbox-svg-icons.qrc b/krita/pics/layerbox/svg/layerbox-svg-icons.qrc
--- a/krita/pics/layerbox/svg/layerbox-svg-icons.qrc
+++ b/krita/pics/layerbox/svg/layerbox-svg-icons.qrc
@@ -4,7 +4,9 @@
dark_addlayer.svg
dark_addtofolder.svg
dark_arrowdown.svg
+ dark_arrowdownbottom.svg
dark_arrowupblr.svg
+ dark_arrowuptop.svg
dark_deletelayer.svg
dark_duplicatelayer.svg
dark_properties.svg
@@ -12,7 +14,9 @@
light_addlayer.svg
light_addtofolder.svg
light_arrowdown.svg
+ light_arrowdownbottom.svg
light_arrowupblr.svg
+ light_arrowuptop.svg
light_deletelayer.svg
light_duplicatelayer.svg
light_properties.svg
diff --git a/krita/pics/layerbox/svg/light_arrowdownbottom.svg b/krita/pics/layerbox/svg/light_arrowdownbottom.svg
--- a/krita/pics/layerbox/svg/light_arrowdownbottom.svg
+++ b/krita/pics/layerbox/svg/light_arrowdownbottom.svg
@@ -0,0 +1,236 @@
+
+
+
+
diff --git a/krita/pics/layerbox/svg/light_arrowuptop.svg b/krita/pics/layerbox/svg/light_arrowuptop.svg
--- a/krita/pics/layerbox/svg/light_arrowuptop.svg
+++ b/krita/pics/layerbox/svg/light_arrowuptop.svg
@@ -0,0 +1,237 @@
+
+
+
+
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
@@ -196,11 +196,21 @@
*/
void raiseNode();
+ /**
+ * move the active node to top of parent in the nodestack.
+ */
+ void raiseTopNode();
+
/**
* move the active node down the nodestack
*/
void lowerNode();
+ /**
+ * move the active node down to bottom of the parent in the nodestack
+ */
+ void lowerBottomNode();
+
void saveNodeAsImage();
void saveVectorLayerAsImage();
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
@@ -872,6 +872,17 @@
juggler->raiseNode(selectedNodes());
}
+void KisNodeManager::raiseTopNode()
+{
+ KisNodeList nodes = selectedNodes();
+ KisNodeSP parent = activeNode()->parent();
+ KisNodeSP above = parent->lastChild();
+
+ KUndo2MagicString actionName = kundo2_i18n("Raise Top Nodes");
+ KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
+ juggler->moveNode(nodes, parent, above);
+}
+
void KisNodeManager::lowerNode()
{
KUndo2MagicString actionName = kundo2_i18n("Lower Nodes");
@@ -879,6 +890,17 @@
juggler->lowerNode(selectedNodes());
}
+void KisNodeManager::lowerBottomNode()
+{
+ KisNodeList nodes = selectedNodes();
+ KisNodeSP parent = activeNode()->parent();
+ KisNodeSP above = 0;
+
+ KUndo2MagicString actionName = kundo2_i18n("Lower Bottom Nodes");
+ KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
+ juggler->moveNode(nodes, parent, above);
+}
+
void KisNodeManager::removeSingleNode(KisNodeSP node)
{
if (!node || !node->parent()) {
diff --git a/plugins/dockers/defaultdockers/kis_layer_box.h b/plugins/dockers/defaultdockers/kis_layer_box.h
--- a/plugins/dockers/defaultdockers/kis_layer_box.h
+++ b/plugins/dockers/defaultdockers/kis_layer_box.h
@@ -101,7 +101,9 @@
// from the layerbox to the node manager
void slotRmClicked();
void slotRaiseClicked();
+ void slotRaiseTopClicked();
void slotLowerClicked();
+ void slotLowerBottomClicked();
void slotPropertiesClicked();
void slotCompositeOpChanged(int index);
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
@@ -182,14 +182,13 @@
slotUpdateIcons();
m_wdgLayerBox->bnDelete->setIconSize(QSize(22, 22));
+ m_wdgLayerBox->bnRaiseTop->setIconSize(QSize(22, 22));
m_wdgLayerBox->bnRaise->setIconSize(QSize(22, 22));
+ m_wdgLayerBox->bnLowerBottom->setIconSize(QSize(22, 22));
m_wdgLayerBox->bnLower->setIconSize(QSize(22, 22));
m_wdgLayerBox->bnProperties->setIconSize(QSize(22, 22));
m_wdgLayerBox->bnDuplicate->setIconSize(QSize(22, 22));
- m_wdgLayerBox->bnLower->setEnabled(false);
- m_wdgLayerBox->bnRaise->setEnabled(false);
-
if (cfg.sliderLabels()) {
m_wdgLayerBox->opacityLabel->hide();
m_wdgLayerBox->doubleOpacity->setPrefix(QString("%1: ").arg(i18n("Opacity")));
@@ -360,11 +359,21 @@
new SyncButtonAndAction(m_removeAction, m_wdgLayerBox->bnDelete, this);
connect(m_removeAction, SIGNAL(triggered()), this, SLOT(slotRmClicked()));
+ action = actionManager->createAction("move_layer_up_top");
+ Q_ASSERT(action);
+ new SyncButtonAndAction(action, m_wdgLayerBox->bnRaiseTop, this);
+ connect(action, SIGNAL(triggered()), this, SLOT(slotRaiseTopClicked()));
+
action = actionManager->createAction("move_layer_up");
Q_ASSERT(action);
new SyncButtonAndAction(action, m_wdgLayerBox->bnRaise, this);
connect(action, SIGNAL(triggered()), this, SLOT(slotRaiseClicked()));
+ action = actionManager->createAction("move_layer_down_bottom");
+ Q_ASSERT(action);
+ new SyncButtonAndAction(action, m_wdgLayerBox->bnLowerBottom, this);
+ connect(action, SIGNAL(triggered()), this, SLOT(slotLowerBottomClicked()));
+
action = actionManager->createAction("move_layer_down");
Q_ASSERT(action);
new SyncButtonAndAction(action, m_wdgLayerBox->bnLower, this);
@@ -507,11 +516,6 @@
}
}
- m_wdgLayerBox->bnRaise->setEnabled(activeNode && activeNode->isEditable(false) && (activeNode->nextSibling()
- || (activeNode->parent() && activeNode->parent() != m_image->root())));
- m_wdgLayerBox->bnLower->setEnabled(activeNode && activeNode->isEditable(false) && (activeNode->prevSibling()
- || (activeNode->parent() && activeNode->parent() != m_image->root())));
-
m_wdgLayerBox->doubleOpacity->setEnabled(activeNode && activeNode->isEditable(false));
m_wdgLayerBox->cmbComposite->setEnabled(activeNode && activeNode->isEditable(false));
@@ -713,12 +717,24 @@
m_nodeManager->raiseNode();
}
+void KisLayerBox::slotRaiseTopClicked()
+{
+ if (!m_canvas) return;
+ m_nodeManager->raiseTopNode();
+}
+
void KisLayerBox::slotLowerClicked()
{
if (!m_canvas) return;
m_nodeManager->lowerNode();
}
+void KisLayerBox::slotLowerBottomClicked()
+{
+ if (!m_canvas) return;
+ m_nodeManager->lowerBottomNode();
+}
+
void KisLayerBox::slotPropertiesClicked()
{
if (!m_canvas) return;
@@ -1058,9 +1074,11 @@
void KisLayerBox::slotUpdateIcons() {
m_wdgLayerBox->bnAdd->setIcon(KisIconUtils::loadIcon("addlayer"));
+ m_wdgLayerBox->bnRaiseTop->setIcon(KisIconUtils::loadIcon("arrowuptop"));
m_wdgLayerBox->bnRaise->setIcon(KisIconUtils::loadIcon("arrowupblr"));
m_wdgLayerBox->bnDelete->setIcon(KisIconUtils::loadIcon("deletelayer"));
m_wdgLayerBox->bnLower->setIcon(KisIconUtils::loadIcon("arrowdown"));
+ m_wdgLayerBox->bnLowerBottom->setIcon(KisIconUtils::loadIcon("arrowdownbottom"));
m_wdgLayerBox->bnProperties->setIcon(KisIconUtils::loadIcon("properties"));
m_wdgLayerBox->bnDuplicate->setIcon(KisIconUtils::loadIcon("duplicatelayer"));
diff --git a/plugins/dockers/defaultdockers/wdglayerbox.ui b/plugins/dockers/defaultdockers/wdglayerbox.ui
--- a/plugins/dockers/defaultdockers/wdglayerbox.ui
+++ b/plugins/dockers/defaultdockers/wdglayerbox.ui
@@ -170,6 +170,31 @@
+ -
+
+
+
+ 28
+ 28
+
+
+
+ Move layer or mask to bottom
+
+
+ ...
+
+
+
+ 22
+ 22
+
+
+
+ true
+
+
+
-
@@ -220,6 +245,31 @@
+ -
+
+
+
+ 28
+ 28
+
+
+
+ Move layer or mask to top
+
+
+ ...
+
+
+
+ 22
+ 22
+
+
+
+ true
+
+
+
-
@@ -320,8 +370,10 @@
cmbComposite
bnDuplicate
+ bnLowerBottom
bnLower
bnRaise
+ bnRaiseTop
bnProperties
bnDelete