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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Andrei Rudenko + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Andrei Rudenko + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Andrei Rudenko + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Andrei Rudenko + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Andrei Rudenko + + + + + + + + + + + + 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