[krita/krita-grids-kazakov] /: FEATURE: Quick Ungroup action (Ctrl+Alt+G)

Dmitry Kazakov dimula73 at gmail.com
Mon Mar 7 09:55:32 UTC 2016


Git commit 711d80a232695d30b24f602b185c58850b8b25b8 by Dmitry Kazakov.
Committed on 07/03/2016 at 09:54.
Pushed by dkazakov into branch 'krita-grids-kazakov'.

FEATURE: Quick Ungroup action (Ctrl+Alt+G)

1) If a group is selected, all the child layers are ungrouped and
   the group itself is removed.

2) If all the child layers are selected, they get ungrouped and
   the group itself is removed.

3) If only some child layers are selected, they just get ungrouped.
   Their parent is kept alive.

CC:kimageshop at kde.org

M  +12   -0    krita/krita.action
M  +1    -0    krita/krita.rc
M  +35   -0    libs/ui/kis_node_manager.cpp
M  +1    -0    libs/ui/kis_node_manager.h
M  +1    -0    plugins/extensions/dockers/defaultdockers/kis_layer_box.cpp

http://commits.kde.org/krita/711d80a232695d30b24f602b185c58850b8b25b8

diff --git a/krita/krita.action b/krita/krita.action
index 6607a42..5c22cd4 100644
--- a/krita/krita.action
+++ b/krita/krita.action
@@ -2384,6 +2384,18 @@
       <isCheckable>false</isCheckable>
       <statusTip></statusTip>
     </Action>
+    <Action name="quick_ungroup">
+      <icon></icon>
+      <text>Quick Ungroup</text>
+      <whatsThis></whatsThis>
+      <toolTip>Remove grouping of the layers or remove one layer out of the group</toolTip>
+      <iconText>Quick Ungroup</iconText>
+      <activationFlags>0</activationFlags>
+      <activationConditions>0</activationConditions>
+      <shortcut>Ctrl+Alt+G</shortcut>
+      <isCheckable>false</isCheckable>
+      <statusTip></statusTip>
+    </Action>
     <Action name="create_quick_clipping_group">
       <icon></icon>
       <text>Quick Clipping Group</text>
diff --git a/krita/krita.rc b/krita/krita.rc
index 2812bc1..64ba4a5 100644
--- a/krita/krita.rc
+++ b/krita/krita.rc
@@ -219,6 +219,7 @@ xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0  http://www.kde.org
       <Separator/>
       <Action name="create_quick_group"/>
       <Action name="create_quick_clipping_group"/>
+      <Action name="quick_ungroup"/>
     </Menu>
     <Menu name="Select">
       <text>&Select</text>
diff --git a/libs/ui/kis_node_manager.cpp b/libs/ui/kis_node_manager.cpp
index 1b97a19..5b26ce9 100644
--- a/libs/ui/kis_node_manager.cpp
+++ b/libs/ui/kis_node_manager.cpp
@@ -265,6 +265,9 @@ void KisNodeManager::setup(KActionCollection * actionCollection, KisActionManage
     action = actionManager->createAction("create_quick_clipping_group");
     connect(action, SIGNAL(triggered()), this, SLOT(createQuickClippingGroup()));
 
+    action = actionManager->createAction("quick_ungroup");
+    connect(action, SIGNAL(triggered()), this, SLOT(quickUngroup()));
+
     action = actionManager->createAction("select_all_layers");
     connect(action, SIGNAL(triggered()), this, SLOT(selectAllNodes()));
 
@@ -1201,6 +1204,38 @@ void KisNodeManager::createQuickClippingGroup()
     juggler->addNode(KisNodeList() << maskLayer, parent, above);
 }
 
+void KisNodeManager::quickUngroup()
+{
+    KisNodeSP active = activeNode();
+    if (!active) return;
+
+    KisNodeSP parent = active->parent();
+    KisNodeSP aboveThis = active;
+
+    KUndo2MagicString actionName = kundo2_i18n("Quick Ungroup");
+
+    if (parent && dynamic_cast<KisGroupLayer*>(active.data())) {
+        KisNodeList nodes = active->childNodes(QStringList(), KoProperties());
+
+        KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
+        juggler->moveNode(nodes, parent, active);
+        juggler->removeNode(KisNodeList() << active);
+    } else if (parent && parent->parent()) {
+        KisNodeSP grandParent = parent->parent();
+
+        KisNodeList allChildNodes = parent->childNodes(QStringList(), KoProperties());
+        KisNodeList allSelectedNodes = selectedNodes();
+
+        const bool removeParent = KritaUtils::compareListsUnordered(allChildNodes, allSelectedNodes);
+
+        KisNodeJugglerCompressed *juggler = m_d->lazyGetJuggler(actionName);
+        juggler->moveNode(allSelectedNodes, grandParent, parent);
+        if (removeParent) {
+            juggler->removeNode(KisNodeList() << parent);
+        }
+    }
+}
+
 void KisNodeManager::selectLayersImpl(const KoProperties &props, const KoProperties &invertedProps)
 {
     KisImageSP image = m_d->view->image();
diff --git a/libs/ui/kis_node_manager.h b/libs/ui/kis_node_manager.h
index a01365f..1b218e7 100644
--- a/libs/ui/kis_node_manager.h
+++ b/libs/ui/kis_node_manager.h
@@ -212,6 +212,7 @@ public Q_SLOTS:
 
     void createQuickGroup();
     void createQuickClippingGroup();
+    void quickUngroup();
 
     void selectAllNodes();
     void selectVisibleNodes();
diff --git a/plugins/extensions/dockers/defaultdockers/kis_layer_box.cpp b/plugins/extensions/dockers/defaultdockers/kis_layer_box.cpp
index 6db3c6b..8c5296c 100644
--- a/plugins/extensions/dockers/defaultdockers/kis_layer_box.cpp
+++ b/plugins/extensions/dockers/defaultdockers/kis_layer_box.cpp
@@ -522,6 +522,7 @@ void KisLayerBox::slotContextMenuRequested(const QPoint &pos, const QModelIndex
             menu.addSeparator();
             addActionToMenu(&menu, "create_quick_group");
             addActionToMenu(&menu, "create_quick_clipping_group");
+            addActionToMenu(&menu, "quick_ungroup");
             menu.addSeparator();
 
             menu.addAction(m_removeAction);


More information about the kimageshop mailing list