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 // Port is abstract (isInput()/isOutput()/isValid()/setStatus() are pure virtual), so it can
62 // never be the most-derived type of a real object -- its own vtable "deleting destructor"
63 // (D0) slot is dead by construction, unlike a concrete class's (pattern 34/pattern 35's
64 // MainWindowHost precedent). Every real deletion, even through a base Port* pointer, resolves
65 // to InputPort's/OutputPort's own D0, which then invokes this D2 (base-object destructor).
66 virtual ~Port() = default; // LCOV_EXCL_LINE
67
68 // --- Element Access ---
69
74
75 // --- Identity & Status ---
76
78 QString name() const;
79
82
84 Status status() const { return m_status; }
85
90 bool isConnected(Port *otherPort);
91
93 bool isRequired() const;
94
96 const QList<Connection *> &connections() const;
97
99 int index() const;
100
105 int globalIndex() const;
106
110 static quint64 makeSerialId(quint64 elementBase, int globalIndex);
111
113 virtual bool isInput() const = 0;
114
116 virtual bool isOutput() const = 0;
117
119 virtual bool isValid() const = 0;
120
121 // --- Status Management ---
122
123 virtual void setStatus(Status status) = 0;
124
125 // --- Connection Management ---
126
128 void attachConnection(Connection *conn);
129
134 void detachConnection(Connection *conn);
135
137 void hoverEnter();
138
140 void hoverLeave();
141
143 void updateTheme();
144
149 void setCurrentBrush(const QBrush &currentBrush);
150
152 QPen currentPen() const { return m_currentPen; }
153
158 void setDefaultStatus(const Status defaultStatus);
159
165
170 void setIndex(const int index);
171
176 void setName(const QString &name);
177
183 void setRequired(const bool required);
184
186 void updateConnections();
187
188protected:
189 // --- Qt Event Handling ---
190
192 QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
193
200 void drainConnections(bool isInput);
201
204 static constexpr int kRadius = 5;
205
206 // --- Members ---
207
215 QList<Connection *> m_connections;
216 QString m_name;
217 Status m_defaultStatus = Status::Unknown;
218 Status m_status = Status::Unknown;
219 bool m_required = true;
220 int m_index = 0;
221
222private:
223 QBrush currentBrush() const;
224};
225
233class InputPort : public Port
234{
235public:
237 explicit InputPort(QGraphicsItem *parent = nullptr);
238 ~InputPort() override;
239
240 // --- Type Queries ---
241
243 bool isInput() const override;
245 bool isOutput() const override;
247 bool isValid() const override;
248
249 // --- Status Management ---
250
252 void setStatus(const Status status) override;
253
254private:
255 Q_DISABLE_COPY_MOVE(InputPort)
256};
257
265class OutputPort : public Port
266{
267public:
269 explicit OutputPort(QGraphicsItem *parent = nullptr);
270 ~OutputPort() override;
271
272 // --- Type Queries ---
273
275 bool isInput() const override;
277 bool isOutput() const override;
279 bool isValid() const override;
280
281 // --- Status Management ---
282
284 void setStatus(const Status status) override;
285
286private:
287 Q_DISABLE_COPY_MOVE(OutputPort)
288};
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:218
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:220
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:219
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:73
void hoverEnter()
Applies hover-enter visual feedback.
Definition Port.cpp:218
QString m_name
Definition Port.h:216
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:152
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:204
Status m_defaultStatus
Definition Port.h:217
GraphicElement * graphicElement()
Returns the graphic element that owns this port.
Definition Port.h:71
Status status() const
Returns the current logical status (Active/Inactive/Unknown/Error).
Definition Port.h:84
QPen m_currentPen
Definition Port.h:214
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:209
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:81
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:208
@ 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:215