File indexing completed on 2024-12-01 05:13:07
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 #ifndef NODE_H 0012 #define NODE_H 0013 0014 //#include <canvas.h> // 2018.10.16 - not needed 0015 #include "canvasitems.h" 0016 #include <QPointer> 0017 0018 class CNItem; 0019 class Item; 0020 class ICNDocument; 0021 class ICNDocument; 0022 class Connector; 0023 class Node; 0024 class NodeData; 0025 class NodeGroup; 0026 class QTimer; 0027 0028 typedef QList<QPointer<Connector>> ConnectorList; 0029 typedef QList<QPointer<Node>> NodeList; 0030 0031 /** 0032 @short A standard node that can be associated with a Connector or a CNItem 0033 @author David Saxton 0034 */ 0035 class Node : /* public QObject, */ public KtlQCanvasPolygon 0036 { 0037 Q_OBJECT 0038 public: 0039 // this shall disappear one day 0040 /** 0041 * Used for run-time identification of the node: 0042 * Can be electronic node (so has values of current, voltage, etc) 0043 * or a pic part node 0044 * this enum will be cleared soon 0045 */ 0046 enum node_type { ec_pin, ec_junction, fp_in, fp_out, fp_junction }; 0047 0048 /** 0049 * @param dir the direction of the node; 0 degrees for left, 90 degrees for 0050 * up, etc in an anti-clockwise direction. An "up" node has the 0051 * wire-connection point at the top and the (component/flowpart)-end at the 0052 * bottom. 0053 */ 0054 Node(ICNDocument *icnDocument, Node::node_type type, int dir, const QPoint &pos, QString *id = nullptr); 0055 ~Node() override; 0056 0057 /** 0058 * Sets the node's visibility, as well as updating the visibility of the 0059 * attached connectors as appropriate 0060 */ 0061 void setVisible(bool yes) override; 0062 /** 0063 * Returns the global id, that is unique to the node 0064 * amongst all the nodes on the canvas 0065 */ 0066 const QString id() const 0067 { 0068 return m_id; 0069 } 0070 /** 0071 * Returns the id that is internal to the CNItem to which the 0072 * node belongs to. Returns a null QString if no parentitem 0073 */ 0074 const QString childId() const 0075 { 0076 return m_childId; 0077 } 0078 /** 0079 * Use this function to set the child-id, that is unique to the node 0080 * amongst the other nodes associated with its parent CNItem 0081 */ 0082 void setChildId(const QString &id) 0083 { 0084 m_childId = id; 0085 } 0086 /** 0087 * Sets the "level" of the node. By default, the level is 0. The level of 0088 * the node tells the node what CNItems it can be connected to through 0089 * a connector. 0090 * @see level 0091 */ 0092 virtual void setLevel(const int level); 0093 /** 0094 * Returns the level of the nodes 0095 * @see setLevel 0096 */ 0097 int level() const 0098 { 0099 return m_level; 0100 } 0101 0102 /** 0103 * Sets the orientation of the node. 0104 */ 0105 void setOrientation(int dir); 0106 /** 0107 * Changes the lenght of the node. By default, this is 8. Some node types 0108 * (such as junctions) do not make use of this value. 0109 */ 0110 void setLength(int length); 0111 /** 0112 * Associates a CNItem with the node - ie the node belongs to the CNItem, 0113 * and hence gets deleted when the CNItem gets deleted.s 0114 */ 0115 virtual void setParentItem(CNItem *parentItem); 0116 /** 0117 * Returns true if the node is part of a CNItem 0118 * (i.e. not between multiple connectors) 0119 */ 0120 bool isChildNode() const 0121 { 0122 return (p_parentItem != nullptr); 0123 } 0124 /** 0125 * Returns a pointer to the CNItem to which the node belongs, 0126 * or Null if it doesn't. 0127 */ 0128 CNItem *parentItem() const 0129 { 0130 return p_parentItem; 0131 } 0132 0133 NodeData nodeData() const; 0134 0135 void setNodeGroup(NodeGroup *ng) 0136 { 0137 p_nodeGroup = ng; 0138 } 0139 NodeGroup *nodeGroup() const 0140 { 0141 return p_nodeGroup; 0142 } 0143 0144 /* interface common to ecnode and fpnode; these might be required by ItemDocumentData, ICNDocument */ 0145 0146 virtual bool isConnected(Node *node, NodeList *checkedNodes = nullptr) = 0; 0147 0148 virtual void removeConnector(Connector *connector) = 0; 0149 0150 /** 0151 * Returns the total number of connections to the node. This is the number 0152 * of connectors and the parent 0153 * item connector if it exists and is requested. 0154 * @param includeParentItem Count the parent item as a connector if it exists 0155 * @param includeHiddenConnectors hidden connectors are those as e.g. part of a subcircuit 0156 */ 0157 virtual int numCon(bool includeParentItem, bool includeHiddenConnectors) const = 0; 0158 0159 /** 0160 * @return the list of all the connectors attached to the node 0161 */ 0162 virtual ConnectorList getAllConnectors() const = 0; 0163 0164 /** 0165 * For a flownode: returns the first input connector, if it exist, or the fist outptut connector, if it exists. 0166 * For an electric node: returns the first connector 0167 * If the node isn't connected to anyithing, returns null ( 0 ) 0168 * @return pointer to the desired connector 0169 */ 0170 virtual Connector *getAConnector() const = 0; 0171 0172 /** 0173 * Removes all the NULL connectors 0174 */ 0175 virtual void removeNullConnectors() = 0; 0176 0177 /** 0178 * Draw shape. Note that this has to remain public. 0179 */ 0180 void drawShape(QPainter &p) override = 0; 0181 0182 void setICNDocument(ICNDocument *documentPtr); 0183 0184 public slots: 0185 void moveBy(double dx, double dy) override; 0186 void removeNode(Item *) 0187 { 0188 removeNode(); 0189 } 0190 void removeNode(); 0191 void setNodeSelected(bool yes); 0192 0193 signals: 0194 void moved(Node *node); 0195 /** 0196 * Emitted when the CNItem is removed. Normally, this signal is caught by associated 0197 * nodes, who will remove themselves as well. 0198 */ 0199 void removed(Node *node); 0200 0201 protected: 0202 virtual void initPoints(); 0203 /** 0204 * Moves and rotates (according to m_dir) the painter, so that our current 0205 * position is (0,0). 0206 */ 0207 void initPainter(QPainter &p); 0208 /** 0209 * Undoes the effects of initPainter. 0210 */ 0211 void deinitPainter(QPainter &p); 0212 0213 /** If this node has precisely two connectors emerging from it, then this 0214 * function will trace the two connectors until the point where they 0215 * diverge; this point is returned. */ 0216 virtual QPoint findConnectorDivergePoint(bool *found) = 0; 0217 0218 /** The node's type. This member will be removed! */ 0219 node_type m_type; 0220 0221 int m_dir; 0222 int m_length; 0223 int m_level; 0224 0225 ICNDocument *p_icnDocument; 0226 CNItem *p_parentItem; 0227 0228 NodeGroup *p_nodeGroup; 0229 0230 static QColor m_selectedColor; 0231 0232 private: 0233 // these fields are critical to saved circuit documents. 0234 QString m_id; 0235 QString m_childId; 0236 0237 bool b_deleted; 0238 }; 0239 0240 #endif