wiRedPanda
Logic Circuit Simulator
Loading...
Searching...
No Matches
Port.h
Go to the documentation of this file.
1// Copyright (c) 2012, STANISLAW ADASZEWSKI
2// SPDX-License-Identifier: BSD-3-Clause
3//
4// Portions Copyright 2015 - 2026, GIBIS-UNIFESP and the wiRedPanda contributors
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
7// Originally derived from Stanislaw Adaszewski's Qt Node Editor (qneblock); since
8// re-authored for wiRedPanda. The BSD attribution above is retained as a license
9// obligation for the derived design.
10
14
15#pragma once
16
17#include <QBrush>
18#include <QGraphicsPathItem>
19#include <QPen>
20
21#include "App/Core/Enums.h"
22
23class GraphicElement;
24class Connection;
25class Port;
26
38class Port : public QGraphicsPathItem
39{
40public:
41 // --- Type ---
42
43 enum { Type = QGraphicsItem::UserType + 1 };
44 int type() const override { return Type; }
45
47 QPainterPath shape() const override;
48
51 QRectF boundingRect() const override;
52
55 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
56
57 // --- Lifecycle ---
58
60 explicit Port(QGraphicsItem *parent = nullptr);
61 virtual ~Port() = default;
62
63 // --- Element Access ---
64
69
70 // --- Identity & Status ---
71
73 QString name() const;
74
77
79 Status status() const { return m_status; }
80
85 bool isConnected(Port *otherPort);
86
88 bool isRequired() const;
89
91 const QList<Connection *> &connections() const;
92
94 int index() const;
95
100 int globalIndex() const;
101
105 static quint64 makeSerialId(quint64 elementBase, int globalIndex);
106
108 virtual bool isInput() const = 0;
109
111 virtual bool isOutput() const = 0;
112
114 virtual bool isValid() const = 0;
115
116 // --- Status Management ---
117
118 virtual void setStatus(Status status) = 0;
119
120 // --- Connection Management ---
121
123 void attachConnection(Connection *conn);
124
129 void detachConnection(Connection *conn);
130
132 void hoverEnter();
133
135 void hoverLeave();
136
138 void updateTheme();
139
144 void setCurrentBrush(const QBrush &currentBrush);
145
147 QPen currentPen() const { return m_currentPen; }
148
153 void setDefaultStatus(const Status defaultStatus);
154
160
165 void setIndex(const int index);
166
171 void setName(const QString &name);
172
178 void setRequired(const bool required);
179
181 void updateConnections();
182
183protected:
184 // --- Qt Event Handling ---
185
187 QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
188
195 void drainConnections(bool isInput);
196
199 static constexpr int kRadius = 5;
200
201 // --- Members ---
202
210 QList<Connection *> m_connections;
211 QString m_name;
212 Status m_defaultStatus = Status::Unknown;
213 Status m_status = Status::Unknown;
214 bool m_required = true;
215 int m_index = 0;
216
217private:
218 QBrush currentBrush() const;
219};
220
228class InputPort : public Port
229{
230public:
232 explicit InputPort(QGraphicsItem *parent = nullptr);
233 ~InputPort() override;
234
235 // --- Type Queries ---
236
238 bool isInput() const override;
240 bool isOutput() const override;
242 bool isValid() const override;
243
244 // --- Status Management ---
245
247 void setStatus(const Status status) override;
248
249private:
250 Q_DISABLE_COPY_MOVE(InputPort)
251};
252
260class OutputPort : public Port
261{
262public:
264 explicit OutputPort(QGraphicsItem *parent = nullptr);
265 ~OutputPort() override;
266
267 // --- Type Queries ---
268
270 bool isInput() const override;
272 bool isOutput() const override;
274 bool isValid() const override;
275
276 // --- Status Management ---
277
279 void setStatus(const Status status) override;
280
281private:
282 Q_DISABLE_COPY_MOVE(OutputPort)
283};
Central enumeration types for element types, groups, and signal status.
Enums::Status Status
Definition Enums.h:106
A bezier-curve wire connecting an output port to an input port in the scene.
Definition Connection.h:38
Abstract base class for all graphical circuit elements in wiRedPanda.
bool isInput() const override
Definition Port.cpp:321
bool isValid() const override
Definition Port.cpp:331
bool isOutput() const override
Definition Port.cpp:326
~InputPort() override
Definition Port.cpp:299
void setStatus(const Status status) override
Definition Port.cpp:307
InputPort(QGraphicsItem *parent=nullptr)
Constructs an input port attached to parent.
Definition Port.cpp:279
void setStatus(const Status status) override
Definition Port.cpp:361
bool isInput() const override
Definition Port.cpp:377
bool isOutput() const override
Definition Port.cpp:382
OutputPort(QGraphicsItem *parent=nullptr)
Constructs an output port attached to parent.
Definition Port.cpp:338
bool isValid() const override
Definition Port.cpp:387
~OutputPort() override
Definition Port.cpp:354
Abstract base class for circuit element ports (connection endpoints).
Definition Port.h:39
virtual bool isOutput() const =0
Returns true if this is an output port. Pure virtual.
Status m_status
Definition Port.h:213
void setCurrentBrush(const QBrush &currentBrush)
Sets the brush used to fill the port shape.
Definition Port.cpp:183
QRectF boundingRect() const override
Definition Port.cpp:35
int m_index
Definition Port.h:215
void attachConnection(Connection *conn)
Registers conn as a connection attached to this port.
Definition Port.cpp:62
int type() const override
Definition Port.h:44
bool m_required
Definition Port.h:214
virtual bool isValid() const =0
Returns true if the port satisfies its connection requirement. Pure virtual.
const GraphicElement * graphicElement() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition Port.h:68
void hoverEnter()
Applies hover-enter visual feedback.
Definition Port.cpp:218
QString m_name
Definition Port.h:211
void setRequired(const bool required)
Marks whether a wire to this port is mandatory.
Definition Port.cpp:199
virtual void setStatus(Status status)=0
void setGraphicElement(GraphicElement *graphicElement)
Binds this port to graphicElement.
Definition Port.cpp:208
QPen currentPen() const
Returns the pen paint() draws the port outline with for its current status.
Definition Port.h:147
void updateConnections()
Triggers a path update on all attached connections.
Definition Port.cpp:100
void detachConnection(Connection *conn)
Removes conn from this port's connection list.
Definition Port.cpp:77
static constexpr int kRadius
Definition Port.h:199
Status m_defaultStatus
Definition Port.h:212
GraphicElement * graphicElement()
Returns the graphic element that owns this port.
Definition Port.h:66
Status status() const
Returns the current logical status (Active/Inactive/Unknown/Error).
Definition Port.h:79
QPen m_currentPen
Definition Port.h:209
void drainConnections(bool isInput)
Drains all attached connections, breaking back-references before deletion.
Definition Port.cpp:260
int globalIndex() const
Definition Port.cpp:148
QBrush m_currentBrush
Definition Port.h:204
void hoverLeave()
Reverts hover-enter visual feedback.
Definition Port.cpp:213
int index() const
Returns the port's visual/logical index within the element.
Definition Port.cpp:138
Port(QGraphicsItem *parent=nullptr)
Constructs the port with optional parent item.
Definition Port.cpp:16
static quint64 makeSerialId(quint64 elementBase, int globalIndex)
Definition Port.cpp:156
QPainterPath shape() const override
Definition Port.cpp:25
QVariant itemChange(GraphicsItemChange change, const QVariant &value) override
Definition Port.cpp:129
Status defaultValue() const
Returns the default status applied when the port is unconnected.
Definition Port.h:76
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
Definition Port.cpp:44
virtual ~Port()=default
void setDefaultStatus(const Status defaultStatus)
Sets the status applied when the port has no connection.
Definition Port.cpp:172
void updateTheme()
Reapplies the status-based pen and brush from the current ThemeManager palette.
Definition Port.cpp:223
virtual bool isInput() const =0
Returns true if this is an input port. Pure virtual.
bool isConnected(Port *otherPort)
Returns true if this port is connected to otherPort via any wire.
Definition Port.cpp:94
const QList< Connection * > & connections() const
Returns the list of wires attached to this port.
Definition Port.cpp:57
GraphicElement * m_graphicElement
Definition Port.h:203
@ Type
Definition Port.h:43
bool isRequired() const
Returns true if a connection to this port is mandatory.
Definition Port.cpp:194
void setName(const QString &name)
Sets the label text shown next to the port.
Definition Port.cpp:166
QString name() const
Returns the port's label text.
Definition Port.cpp:161
void setIndex(const int index)
Sets the port's visual index within the element.
Definition Port.cpp:143
QList< Connection * > m_connections
Definition Port.h:210