[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [calligra] krita: Return support for clone layers of group layers
From:       Torio Mlshi <mlshi () lavabit ! com>
Date:       2011-10-31 23:01:25
Message-ID: 20111031230125.9A7F3A60A6 () git ! kde ! org
[Download RAW message or body]

Git commit c56677070ddc6bffa457885e386cfdb7c8de6cb6 by Torio Mlshi.
Committed on 31/10/2011 at 23:54.
Pushed by mlshi into branch 'master'.

Return support for clone layers of group layers

Also add checking if clone layer could be moved to group layer not
causing cyclic behaviour. This checking is recursive and so any case
when clone layer depends on groups or another clones could be checked.

M  +27   -1    krita/image/kis_group_layer.cc
M  +1    -1    krita/plugins/extensions/dockers/defaultdockers/kis_layer_box.cpp
M  +7    -7    krita/ui/kis_layer_manager.cc
M  +28   -3    krita/ui/kis_node_manager.cpp
M  +1    -0    krita/ui/kis_node_manager.h

http://commits.kde.org/calligra/c56677070ddc6bffa457885e386cfdb7c8de6cb6

diff --git a/krita/image/kis_group_layer.cc b/krita/image/kis_group_layer.cc
index b5d08c0..0ae2938 100644
--- a/krita/image/kis_group_layer.cc
+++ b/krita/image/kis_group_layer.cc
@@ -30,6 +30,7 @@
 #include "kis_image.h"
 #include "kis_paint_device.h"
 #include "kis_default_bounds.h"
+#include "kis_clone_layer.h"
 
 class KisGroupLayer::Private
 {
@@ -69,7 +70,32 @@ KisGroupLayer::~KisGroupLayer()
 
 bool KisGroupLayer::allowAsChild(KisNodeSP node) const
 {
-    Q_UNUSED(node);
+    if (node->inherits("KisCloneLayer")) {
+        KisNodeSP source = qobject_cast<KisCloneLayer*>(node.data())->copyFrom();
+        if (source) {
+            if (source->inherits("KisGroupLayer")) {
+                KisNodeSP parent = const_cast<KisGroupLayer*>(this);
+                while (parent && parent->parent()) {
+                    if (parent == source || !parent->allowAsChild(source)) {
+                        return false;
+                    }
+                    parent = parent->parent();
+                }
+            } else if (source->inherits("KisCloneLayer")) {
+                return allowAsChild(source);
+            }
+        }
+    }
+    
+    if (node->inherits("KisGroupLayer")) {
+        KisNodeSP child = node->firstChild();
+        while (child) {
+            if (!allowAsChild(child)) {
+                return false;
+            }
+            child = child->nextSibling();
+        }
+    }
     return true;
 }
 
diff --git a/krita/plugins/extensions/dockers/defaultdockers/kis_layer_box.cpp \
b/krita/plugins/extensions/dockers/defaultdockers/kis_layer_box.cpp index \
                21a52f3..616e2c5 100644
--- a/krita/plugins/extensions/dockers/defaultdockers/kis_layer_box.cpp
+++ b/krita/plugins/extensions/dockers/defaultdockers/kis_layer_box.cpp
@@ -332,7 +332,7 @@ void KisLayerBox::updateUI()
     m_newTransparencyMaskAction->setEnabled(active);
     m_newEffectMaskAction->setEnabled(active);
     m_newSelectionMaskAction->setEnabled(active);
-    m_newCloneLayerAction->setEnabled(active && !active->inherits("KisGroupLayer"));
+    m_newCloneLayerAction->setEnabled(active);
 
 }
 
diff --git a/krita/ui/kis_layer_manager.cc b/krita/ui/kis_layer_manager.cc
index c5cea71..e1d3bd4 100644
--- a/krita/ui/kis_layer_manager.cc
+++ b/krita/ui/kis_layer_manager.cc
@@ -335,19 +335,19 @@ void KisLayerManager::addCloneLayer()
 
 void KisLayerManager::addCloneLayer(KisNodeSP parent, KisNodeSP above)
 {
-    Q_ASSERT(!m_activeLayer->inherits("KisGroupLayer"));
     KisImageWSP image = m_view->image();
     if (image) {
         // Check whether we are not cloning a parent layer
         if (KisGroupLayer * from = \
                dynamic_cast<KisGroupLayer*>(m_activeLayer.data())) {
-            KisNodeSP parent = parent;
-            while (parent && parent != image->root()) {
-                if (parent.data() == from) {
+            KisNodeSP parent1 = parent;
+            while (parent1 && parent1 != image->root()) {
+                if (parent1.data() == from) {
                     // The chosen layer is one of our own parents -- this will
-                    // lead to cyclic behaviour when updating. Don't do that!
-                    return;
+                    // lead to cyclic behaviour when updating. So we need to change \
parent +                    parent = parent1->parent();
+                    above = parent1;
                 }
-                parent = parent->parent();
+                parent1 = parent1->parent();
             }
         }
 
diff --git a/krita/ui/kis_node_manager.cpp b/krita/ui/kis_node_manager.cpp
index 95f8d06..4d2758c 100644
--- a/krita/ui/kis_node_manager.cpp
+++ b/krita/ui/kis_node_manager.cpp
@@ -209,6 +209,31 @@ bool allowAsChild(const QString & parentType, const QString & \
childType)  return true;
 }
 
+void KisNodeManager::getNewNodeLocation(KisNodeSP& node, KisNodeSP& parent, \
KisNodeSP& above, KisNodeSP _activeNode) +{
+    KisNodeSP root = m_d->view->image()->root();
+    if (!_activeNode)
+        _activeNode = root->firstChild();
+    KisNodeSP active = _activeNode;
+    // Find the first node above the current node that can have the desired
+    // layer type as child. XXX_NODE: disable the menu entries for node types
+    // that are not compatible with the active node type.
+    while (active) {
+        if (active->allowAsChild(node)) {
+            parent = active;
+            if (_activeNode->parent() == parent) {
+                above = _activeNode;
+            } else {
+                above = parent->firstChild();
+            }
+            return;
+        }
+        active = active->parent();
+    }
+    parent = root;
+    above = parent->firstChild();
+}
+
 void KisNodeManager::getNewNodeLocation(const QString & nodeType, KisNodeSP &parent, \
KisNodeSP &above, KisNodeSP _activeNode)  {
     KisNodeSP root = m_d->view->image()->root();
@@ -239,7 +264,7 @@ void KisNodeManager::addNode(KisNodeSP node, KisNodeSP \
activeNode)  KisNodeSP parent;
     KisNodeSP above;
 
-    getNewNodeLocation(node->metaObject()->className(), parent, above, activeNode);
+    getNewNodeLocation(node, parent, above, activeNode);
     m_d->commandsAdapter->addNode(node, parent, above);
     node->setDirty(node->extent());
 }
@@ -256,7 +281,7 @@ void KisNodeManager::moveNode(KisNodeSP node, KisNodeSP \
activeNode)  KisNodeSP parent;
     KisNodeSP above;
 
-    getNewNodeLocation(node->metaObject()->className(), parent, above, activeNode);
+    getNewNodeLocation(node, parent, above, activeNode);
     if (node->inherits("KisSelectionMask") && parent->inherits("KisLayer")) {
         KisSelectionMask *m = dynamic_cast<KisSelectionMask*>(node.data());
         KisLayer *l = dynamic_cast<KisLayer*>(parent.data());
@@ -270,7 +295,7 @@ void KisNodeManager::moveNode(KisNodeSP node, KisNodeSP \
activeNode)  
 void KisNodeManager::moveNodeAt(KisNodeSP node, KisNodeSP parent, int index)
 {
-    if (allowAsChild(parent->metaObject()->className(), \
node->metaObject()->className())) { +    if (parent->allowAsChild(node)) {
         if (node->inherits("KisSelectionMask") && parent->inherits("KisLayer")) {
             KisSelectionMask *m = dynamic_cast<KisSelectionMask*>(node.data());
             KisLayer *l = dynamic_cast<KisLayer*>(parent.data());
diff --git a/krita/ui/kis_node_manager.h b/krita/ui/kis_node_manager.h
index 6816f8f..fce84eb 100644
--- a/krita/ui/kis_node_manager.h
+++ b/krita/ui/kis_node_manager.h
@@ -179,6 +179,7 @@ private slots:
 private:
     
     void getNewNodeLocation(const QString & nodeType, KisNodeSP &parent, KisNodeSP \
&above, KisNodeSP active); +    void getNewNodeLocation(KisNodeSP &node, KisNodeSP \
&parent, KisNodeSP &above, KisNodeSP _activeNode);  
     /**
      * Scales opacity from the range 0...1


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic