File indexing completed on 2024-12-08 11:06:53

0001 //
0002 // C++ Implementation: junctionflownode
0003 //
0004 // Description:
0005 //
0006 //
0007 // Copyright: See COPYING file that comes with this distribution
0008 //
0009 //
0010 #include "junctionflownode.h"
0011 #include "connector.h"
0012 #include "flowconnector.h"
0013 
0014 #include <QPainter>
0015 
0016 JunctionFlowNode::JunctionFlowNode(ICNDocument *_icnView, int dir, const QPoint &pos, QString *id)
0017     : FPNode(_icnView, Node::fp_junction, dir, pos, id)
0018 {
0019 }
0020 
0021 JunctionFlowNode::~JunctionFlowNode()
0022 {
0023 }
0024 
0025 void JunctionFlowNode::initPoints()
0026 {
0027     setPoints(QPolygon(QRect(-4, -4, 9, 9)));
0028 }
0029 
0030 bool JunctionFlowNode::acceptInput() const
0031 {
0032     return true;
0033 }
0034 
0035 bool JunctionFlowNode::acceptOutput() const
0036 {
0037     return true;
0038 }
0039 
0040 void JunctionFlowNode::checkForRemoval(Connector *connector)
0041 {
0042     FPNode::checkForRemoval(connector);
0043 
0044     if (!m_outputConnector)
0045         removeNode();
0046 }
0047 
0048 inline QPolygon arrowPoints(int dir)
0049 {
0050     QPolygon pa(3);
0051     switch (dir) {
0052     case 0:
0053         pa[0] = QPoint(3, 0);
0054         pa[1] = QPoint(0, 2);
0055         pa[2] = QPoint(0, -2);
0056         break;
0057     case 180:
0058         pa[0] = QPoint(-3, 0);
0059         pa[1] = QPoint(0, 2);
0060         pa[2] = QPoint(0, -2);
0061         break;
0062     case 90:
0063         pa[0] = QPoint(2, 0);
0064         pa[1] = QPoint(-2, 0);
0065         pa[2] = QPoint(0, 3);
0066         break;
0067     case 270:
0068         pa[0] = QPoint(2, 0);
0069         pa[1] = QPoint(-2, 0);
0070         pa[2] = QPoint(0, -3);
0071         break;
0072     };
0073     return pa;
0074 }
0075 
0076 void JunctionFlowNode::drawShape(QPainter &p)
0077 {
0078     const int _x = int(x());
0079     const int _y = int(y());
0080 
0081     if (!m_inFlowConnList.isEmpty()) {
0082         const FlowConnectorList::iterator end = m_inFlowConnList.end();
0083         for (FlowConnectorList::iterator it = m_inFlowConnList.begin(); it != end; ++it) {
0084             Connector *connector = *it;
0085             if (!connector)
0086                 continue;
0087 
0088             // Work out the direction of the connector
0089             const QPointList points = connector->connectorPoints(false);
0090 
0091             const int count = points.size();
0092             if (count < 2)
0093                 continue;
0094 
0095             QPoint end_0 = points[count - 1];
0096             QPoint end_1 = points[count - 2];
0097 
0098             QPolygon pa;
0099             if (end_0.x() < end_1.x()) {
0100                 pa = arrowPoints(180);
0101                 pa.translate(4, 0);
0102             } else if (end_0.x() > end_1.x()) {
0103                 pa = arrowPoints(0);
0104                 pa.translate(-4, 0);
0105             } else if (end_0.y() < end_1.y()) {
0106                 pa = arrowPoints(270);
0107                 pa.translate(0, 4);
0108             } else if (end_0.y() > end_1.y()) {
0109                 pa = arrowPoints(90);
0110                 pa.translate(0, -4);
0111             } else
0112                 continue;
0113 
0114             pa.translate(_x, _y);
0115             p.setPen(connector->isSelected() ? m_selectedColor : Qt::black);
0116             p.drawPolygon(pa);
0117         }
0118         return;
0119     }
0120 
0121     if (m_dir == 0)
0122         p.drawLine(_x, _y, _x - 8, _y);
0123     else if (m_dir == 90)
0124         p.drawLine(_x, _y, _x, _y - 8);
0125     else if (m_dir == 180)
0126         p.drawLine(_x, _y, _x + 8, _y);
0127     else if (m_dir == 270)
0128         p.drawLine(_x, _y, _x, _y + 8);
0129 }