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 }