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

0001 //
0002 // C++ Implementation: outputflownode
0003 //
0004 // Description:
0005 //
0006 //
0007 // Author: David Saxton <david@bluehaze.org>, (C) 2008
0008 //
0009 // Copyright: See COPYING file that comes with this distribution
0010 //
0011 //
0012 #include "outputflownode.h"
0013 #include "connector.h"
0014 
0015 #include <QPainter>
0016 
0017 #include <ktechlab_debug.h>
0018 
0019 OutputFlowNode::OutputFlowNode(ICNDocument *_icnView, int dir, const QPoint &pos, QString *id)
0020     : FPNode(_icnView, Node::fp_out, dir, pos, id)
0021 {
0022 }
0023 
0024 OutputFlowNode::~OutputFlowNode()
0025 {
0026 }
0027 
0028 bool OutputFlowNode::acceptInput() const
0029 {
0030     return false;
0031 }
0032 
0033 bool OutputFlowNode::acceptOutput() const
0034 {
0035     return true;
0036 }
0037 
0038 void OutputFlowNode::addInputConnector(Connector *const /*connector*/)
0039 {
0040     qCDebug(KTL_LOG) << "BUG: trying to add input connector to an output node";
0041 }
0042 
0043 inline QPolygon arrowPoints(int dir)
0044 {
0045     QPolygon pa(3);
0046     switch (dir) {
0047     case 0:
0048         pa[0] = QPoint(3, 0);
0049         pa[1] = QPoint(0, 2);
0050         pa[2] = QPoint(0, -2);
0051         break;
0052     case 180:
0053         pa[0] = QPoint(-3, 0);
0054         pa[1] = QPoint(0, 2);
0055         pa[2] = QPoint(0, -2);
0056         break;
0057     case 90:
0058         pa[0] = QPoint(2, 0);
0059         pa[1] = QPoint(-2, 0);
0060         pa[2] = QPoint(0, 3);
0061         break;
0062     case 270:
0063         pa[0] = QPoint(2, 0);
0064         pa[1] = QPoint(-2, 0);
0065         pa[2] = QPoint(0, -3);
0066         break;
0067     };
0068     return pa;
0069 }
0070 
0071 void OutputFlowNode::drawShape(QPainter &p)
0072 {
0073     const int _x = int(x());
0074     const int _y = int(y());
0075 
0076     if (m_dir == 0)
0077         p.drawLine(_x, _y, _x - 8, _y);
0078     else if (m_dir == 90)
0079         p.drawLine(_x, _y, _x, _y - 8);
0080     else if (m_dir == 180)
0081         p.drawLine(_x, _y, _x + 8, _y);
0082     else if (m_dir == 270)
0083         p.drawLine(_x, _y, _x, _y + 8);
0084 
0085     QPolygon pa(3);
0086 
0087     switch (m_dir) {
0088     case 0: // right
0089         pa = arrowPoints(0);
0090         break;
0091     case 180: // left
0092         pa = arrowPoints(180);
0093         break;
0094     case 90: // down
0095         pa = arrowPoints(90);
0096         break;
0097     case 270: // up
0098         pa = arrowPoints(270);
0099         break;
0100     default:
0101         qCCritical(KTL_LOG) << "BUG: m_dir = " << m_dir;
0102     }
0103 
0104     // Note: I have not tested the positioning of the arrows for all combinations.
0105     // In fact, most almost definitely do not work. So feel free to change the code
0106     // as you see fit if necessary.
0107 
0108     if (m_dir == 0)
0109         pa.translate(-5, 0);
0110     else if (m_dir == 90)
0111         pa.translate(0, -5);
0112     else if (m_dir == 180)
0113         pa.translate(5, 0);
0114     else if (m_dir == 270)
0115         pa.translate(0, 5);
0116 
0117     pa.translate(_x, _y);
0118     p.drawPolygon(pa);
0119 }