File indexing completed on 2024-04-21 05:44:03

0001 /***************************************************************************
0002  *   Copyright (C) 2003-2005 by David Saxton                               *
0003  *   david@bluehaze.org                                                    *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  ***************************************************************************/
0010 
0011 #include "node.h"
0012 #include "cnitem.h"
0013 #include "connector.h"
0014 #include "icndocument.h"
0015 #include "itemdocumentdata.h"
0016 
0017 #include <QPainter>
0018 
0019 #include <ktechlab_debug.h>
0020 
0021 QColor Node::m_selectedColor = QColor(101, 134, 192);
0022 
0023 Node::Node(ICNDocument *icnDocument, Node::node_type type, int dir, const QPoint &pos, QString *id)
0024     : // QObject(),
0025     KtlQCanvasPolygon(icnDocument ? icnDocument->canvas() : nullptr)
0026 {
0027     QString name("Node");
0028     if (id) {
0029         name.append(QString("-%1").arg(*id));
0030     } else {
0031         name.append("-Unknown");
0032     }
0033     setObjectName(name.toLatin1().data());
0034     qCDebug(KTL_LOG) << " this=" << this;
0035 
0036     m_length = 8;
0037     p_nodeGroup = nullptr;
0038     p_parentItem = nullptr;
0039     b_deleted = false;
0040     m_dir = dir;
0041     m_type = type;
0042     p_icnDocument = icnDocument;
0043     m_level = 0;
0044 
0045     if (p_icnDocument) {
0046         if (id) {
0047             m_id = *id;
0048             if (!p_icnDocument->registerUID(*id))
0049                 qCCritical(KTL_LOG) << "Could not register id " << *id;
0050         } else
0051             m_id = p_icnDocument->generateUID("node" + QString::number(type));
0052     }
0053 
0054     initPoints();
0055     move(pos.x(), pos.y());
0056     setBrush(Qt::black);
0057     setPen(QPen(Qt::black));
0058     show();
0059 
0060     emit(moved(this));
0061 }
0062 
0063 Node::~Node()
0064 {
0065     if (p_icnDocument)
0066         p_icnDocument->unregisterUID(id());
0067 }
0068 
0069 void Node::setLevel(const int level)
0070 {
0071     m_level = level;
0072 }
0073 
0074 void Node::setLength(int length)
0075 {
0076     if (m_length == length)
0077         return;
0078     m_length = length;
0079     initPoints();
0080 }
0081 
0082 void Node::setOrientation(int dir)
0083 {
0084     if (m_dir == dir)
0085         return;
0086     m_dir = dir;
0087     initPoints();
0088 }
0089 
0090 void Node::initPoints()
0091 {
0092     int l = m_length;
0093 
0094     // Bounding rectangle, facing right
0095     QPolygon pa(QRect(0, -8, l, 16));
0096 
0097     QTransform m;
0098     m.rotate(m_dir);
0099     pa = m.map(pa);
0100     setPoints(pa);
0101 }
0102 
0103 void Node::setVisible(bool yes)
0104 {
0105     if (isVisible() == yes)
0106         return;
0107 
0108     KtlQCanvasPolygon::setVisible(yes);
0109 }
0110 
0111 void Node::setParentItem(CNItem *parentItem)
0112 {
0113     if (!parentItem) {
0114         qCCritical(KTL_LOG) << "no parent item";
0115         return;
0116     }
0117 
0118     p_parentItem = parentItem;
0119 
0120     setLevel(p_parentItem->level());
0121 
0122     connect(p_parentItem, qOverload<double, double>(&CNItem::movedBy), this, qOverload<double, double>(&Node::moveBy));
0123     connect(p_parentItem, &CNItem::removed, this, qOverload<Item *>(&Node::removeNode));
0124 }
0125 
0126 void Node::removeNode()
0127 {
0128     if (b_deleted)
0129         return;
0130     b_deleted = true;
0131 
0132     emit removed(this);
0133     p_icnDocument->appendDeleteList(this);
0134 }
0135 
0136 void Node::setICNDocument(ICNDocument *documentPtr)
0137 {
0138     p_icnDocument = documentPtr;
0139 }
0140 
0141 void Node::moveBy(double dx, double dy)
0142 {
0143     if (dx == 0 && dy == 0)
0144         return;
0145     KtlQCanvasPolygon::moveBy(dx, dy);
0146     emit moved(this);
0147 }
0148 
0149 NodeData Node::nodeData() const
0150 {
0151     NodeData data;
0152     data.x = x();
0153     data.y = y();
0154     return data;
0155 }
0156 
0157 void Node::setNodeSelected(bool yes)
0158 {
0159     if (isSelected() == yes)
0160         return;
0161 
0162     KtlQCanvasItem::setSelected(yes);
0163 
0164     setPen(yes ? m_selectedColor : Qt::black);
0165     setBrush(yes ? m_selectedColor : Qt::black);
0166 }
0167 
0168 void Node::initPainter(QPainter &p)
0169 {
0170     p.translate(int(x()), int(y()));
0171     p.rotate(m_dir);
0172 }
0173 
0174 void Node::deinitPainter(QPainter &p)
0175 {
0176     p.rotate(-m_dir);
0177     p.translate(-int(x()), -int(y()));
0178 }
0179 
0180 #include "moc_node.cpp"