File indexing completed on 2024-05-12 15:58:28

0001 /*
0002  *  SPDX-FileCopyrightText: 2007 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_node_facade.h"
0008 #include "kis_node_graph_listener.h"
0009 #include <kis_debug.h>
0010 
0011 struct Q_DECL_HIDDEN KisNodeFacade::Private
0012 {
0013 public:
0014     KisNodeWSP root;
0015 };
0016 
0017 KisNodeFacade::KisNodeFacade()
0018         : m_d(new Private())
0019 {
0020 }
0021 
0022 KisNodeFacade::KisNodeFacade(KisNodeSP root)
0023         : m_d(new Private())
0024 {
0025     m_d->root = root;
0026 }
0027 
0028 KisNodeFacade::~KisNodeFacade()
0029 {
0030 }
0031 
0032 void KisNodeFacade::setRoot(KisNodeSP root)
0033 {
0034     m_d->root = root;
0035 }
0036 
0037 const KisNodeSP KisNodeFacade::root() const
0038 {
0039     return m_d->root;
0040 }
0041 
0042 bool KisNodeFacade::moveNode(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis)
0043 {
0044     dbgImage << "moveNode " << node << " " << parent << " " << aboveThis;
0045     if (!node) {
0046         dbgImage << "cannot move null node"; return false;
0047     }
0048     if (!parent)  {
0049         dbgImage << "cannot move to null parent"; return false;
0050     }
0051     if (node == parent)  {
0052         dbgImage << "cannot move self inside self"; return false;
0053     }
0054     if (node == aboveThis)  {
0055         dbgImage << "cannot move self above self"; return false;
0056     }
0057     if (parent == aboveThis)  {
0058         dbgImage << "cannot move above parent"; return false;
0059     }
0060     if (!node->parent())  {
0061         dbgImage << "node does not have a parent"; return false;
0062     }
0063 
0064     if (aboveThis && aboveThis->parent() != parent)  {
0065         dbgImage << "above this parent is not the parent"; return false;
0066     }
0067 
0068     int newIndex = aboveThis ? parent->index(aboveThis) + 1 : 0;
0069     return moveNode(node, parent, newIndex);
0070 }
0071 
0072 bool KisNodeFacade::moveNode(KisNodeSP node, KisNodeSP parent, quint32 newIndex)
0073 {
0074     dbgImage << "moveNode " << node << " " << parent << " " << newIndex;
0075     int oldIndex = node->parent()->index(node);
0076 
0077     if (node->graphListener())
0078         node->graphListener()->aboutToMoveNode(node.data(), oldIndex, newIndex);
0079     KisNodeSP aboveThis = parent->at(newIndex - 1);
0080     if (aboveThis == node) return false;
0081     if (node->parent()) {
0082         if (!node->parent()->remove(node)) return false;
0083     }
0084     dbgImage << "moving node to " << newIndex;
0085     bool success = addNode(node, parent, aboveThis);
0086     if (node->graphListener())
0087         node->graphListener()->nodeHasBeenMoved(node.data(), oldIndex, newIndex);
0088     return success;
0089 }
0090 
0091 
0092 bool KisNodeFacade::addNode(KisNodeSP node, KisNodeSP parent)
0093 {
0094     dbgImage << "Add node " << node << " to " << parent;
0095     if (!node) return false;
0096     if (!parent && !m_d->root) return false;
0097 
0098     if (parent)
0099         return parent->add(node, parent->lastChild());
0100     else
0101         return m_d->root->add(node, m_d->root->lastChild());
0102 }
0103 
0104 bool KisNodeFacade::addNode(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis)
0105 {
0106     if (!node) return false;
0107     if (!parent) return false;
0108 
0109     return parent->add(node, aboveThis);
0110 }
0111 
0112 bool KisNodeFacade::addNode(KisNodeSP node,  KisNodeSP parent, quint32 index)
0113 {
0114     if (!node) return false;
0115     if (!parent) return false;
0116 
0117     if (index == parent->childCount())
0118         return parent->add(node, parent->lastChild());
0119     else if (index != 0)
0120         return parent->add(node, parent->at(index));
0121     else
0122         return parent->add(node, 0);
0123 }
0124 
0125 bool KisNodeFacade::removeNode(KisNodeSP node)
0126 {
0127     if (!node) return false;
0128     if (!node->parent()) return false;
0129 
0130     return node->parent()->remove(node);
0131 
0132 }
0133 
0134 bool KisNodeFacade::raiseNode(KisNodeSP node)
0135 {
0136     if (!node) return false;
0137     if (!node->parent()) return false;
0138 
0139     if (node->nextSibling())
0140         return moveNode(node, node->parent(), node->nextSibling());
0141     else
0142         return true; // we're already at the top, but there is no
0143     // sense in complaining.
0144 
0145 }
0146 
0147 bool KisNodeFacade::lowerNode(KisNodeSP node)
0148 {
0149     if (!node) return false;
0150     if (!node->parent()) return false;
0151 
0152     KisNodeSP parent = node->parent();
0153     KisNodeSP prevSibling = node->prevSibling();
0154 
0155     if (node->prevSibling()) {
0156         int prevIndex = parent->index(prevSibling);
0157         return moveNode(node, parent, prevIndex);
0158     } else {
0159         return true; // We're already at bottom, but there's no sense
0160         // in complaining
0161     }
0162 }
0163 
0164 bool KisNodeFacade::toTop(KisNodeSP node)
0165 {
0166     if (!node) return false;
0167     if (!node->parent()) return false;
0168     if (node == node->parent()->lastChild()) return true;
0169 
0170     return moveNode(node, node->parent(), node->parent()->lastChild());
0171 
0172 }
0173 
0174 bool KisNodeFacade::toBottom(KisNodeSP node)
0175 {
0176     if (!node) return false;
0177     if (!node->parent()) return false;
0178 
0179     KisNodeSP parent = node->parent();
0180 
0181     if (node == parent->firstChild()) return true;
0182 
0183     // Sets the parent of this node to 0
0184     if (!parent->remove(node)) return false;
0185 
0186     return parent->add(node, 0);
0187 
0188 }