From kde-commits Mon Oct 31 23:01:25 2011 From: Torio Mlshi Date: Mon, 31 Oct 2011 23:01:25 +0000 To: kde-commits Subject: [calligra] krita: Return support for clone layers of group layers Message-Id: <20111031230125.9A7F3A60A6 () git ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=132010262932028 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_bo= x.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 =3D qobject_cast(node.data())->co= pyFrom(); + if (source) { + if (source->inherits("KisGroupLayer")) { + KisNodeSP parent =3D const_cast(this); + while (parent && parent->parent()) { + if (parent =3D=3D source || !parent->allowAsChild(sour= ce)) { + return false; + } + parent =3D parent->parent(); + } + } else if (source->inherits("KisCloneLayer")) { + return allowAsChild(source); + } + } + } + = + if (node->inherits("KisGroupLayer")) { + KisNodeSP child =3D node->firstChild(); + while (child) { + if (!allowAsChild(child)) { + return false; + } + child =3D 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("KisGrou= pLayer")); + 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 =3D m_view->image(); if (image) { // Check whether we are not cloning a parent layer if (KisGroupLayer * from =3D dynamic_cast(m_active= Layer.data())) { - KisNodeSP parent =3D parent; - while (parent && parent !=3D image->root()) { - if (parent.data() =3D=3D from) { + KisNodeSP parent1 =3D parent; + while (parent1 && parent1 !=3D image->root()) { + if (parent1.data() =3D=3D from) { // The chosen layer is one of our own parents -- this = will - // lead to cyclic behaviour when updating. Don't do th= at! - return; + // lead to cyclic behaviour when updating. So we need = to change parent + parent =3D parent1->parent(); + above =3D parent1; } - parent =3D parent->parent(); + parent1 =3D 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 QS= tring & childType) return true; } = +void KisNodeManager::getNewNodeLocation(KisNodeSP& node, KisNodeSP& parent= , KisNodeSP& above, KisNodeSP _activeNode) +{ + KisNodeSP root =3D m_d->view->image()->root(); + if (!_activeNode) + _activeNode =3D root->firstChild(); + KisNodeSP active =3D _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 ty= pes + // that are not compatible with the active node type. + while (active) { + if (active->allowAsChild(node)) { + parent =3D active; + if (_activeNode->parent() =3D=3D parent) { + above =3D _activeNode; + } else { + above =3D parent->firstChild(); + } + return; + } + active =3D active->parent(); + } + parent =3D root; + above =3D parent->firstChild(); +} + void KisNodeManager::getNewNodeLocation(const QString & nodeType, KisNodeS= P &parent, KisNodeSP &above, KisNodeSP _activeNode) { KisNodeSP root =3D 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, act= iveNode); + 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, act= iveNode); + getNewNodeLocation(node, parent, above, activeNode); if (node->inherits("KisSelectionMask") && parent->inherits("KisLayer")= ) { KisSelectionMask *m =3D dynamic_cast(node.data(= )); KisLayer *l =3D dynamic_cast(parent.data()); @@ -270,7 +295,7 @@ void KisNodeManager::moveNode(KisNodeSP node, KisNodeSP= activeNode) = void KisNodeManager::moveNodeAt(KisNodeSP node, KisNodeSP parent, int inde= x) { - if (allowAsChild(parent->metaObject()->className(), node->metaObject()= ->className())) { + if (parent->allowAsChild(node)) { if (node->inherits("KisSelectionMask") && parent->inherits("KisLay= er")) { KisSelectionMask *m =3D dynamic_cast(node.d= ata()); KisLayer *l =3D dynamic_cast(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, K= isNodeSP &above, KisNodeSP active); + void getNewNodeLocation(KisNodeSP &node, KisNodeSP &parent, KisNodeSP = &above, KisNodeSP _activeNode); = /** * Scales opacity from the range 0...1