wiRedPanda
Logic Circuit Simulator
Loading...
Searching...
No Matches
IC.h
Go to the documentation of this file.
1// Copyright 2015 - 2026, GIBIS-UNIFESP and the wiRedPanda contributors
2// SPDX-License-Identifier: GPL-3.0-or-later
3
7
8#pragma once
9
10#include <QByteArray>
11#include <QPixmap>
12#include <QPoint>
13#include <QSet>
14
17
18class QGraphicsSceneHoverEvent;
19class Connection;
20
30class IC : public GraphicElement
31{
32 Q_OBJECT
33
34 friend class TestArduino;
35 friend class TestIC;
36 friend class TestDanglingPointer;
37
41 friend class ICLoader;
42 friend class ICRenderer;
43 friend class ICSimulation;
44
45public:
47 explicit IC(QGraphicsItem *parent = nullptr);
48
49 ~IC() override;
50
51signals:
53 void requestOpenSubCircuit(int elementId, const QString &blobName, const QString &filePath);
54
57 void previewRequested(IC *ic, const QPoint &screenPos);
58 void previewMoved(IC *ic, const QPoint &screenPos);
61
62public:
63
65 void loadFile(const QString &fileName, const QString &contextDir = {});
66
68 void loadFromBlob(const QByteArray &blob, const QString &contextDir);
69
70 void loadFromDrop(const QString &fileName, const QString &contextDir) override;
71
72 const QString &file() const { return m_file; }
73
76 QString displayName() const;
77
79 const QString &blobName() const override { return m_blobName; }
80 void setBlobName(const QString &name) { m_blobName = name; }
81 bool isEmbedded() const override { return !m_blobName.isEmpty(); }
82
83 const QVector<GraphicElement *> &internalElements() const { return m_internalElements; }
84 const QVector<Port *> &internalInputs() const { return m_internalInputs; }
85 const QVector<Port *> &internalOutputs() const { return m_internalOutputs; }
86
91 const QPixmap &previewPixmap() const { return m_previewPixmap; }
92
93 // --- Port metadata ---
94
96 struct PortMetadata {
97 int inputCount = 0;
98 int outputCount = 0;
99 QStringList inputLabels;
100 QStringList outputLabels;
101 };
102
104 static PortMetadata buildPortMetadata(const QVector<GraphicElement *> &elements);
105
106 // --- Visual ---
107
109 void updateLogic() override;
110
114 void resettleCombinational() override;
115
118
120 QRectF boundingRect() const override;
122 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
124 void refresh() override;
125
126 // --- External file dependencies ---
127
129 QStringList externalFiles() const override;
130
131 // --- Serialization ---
132
134 void load(QDataStream &stream, SerializationContext &context) override;
136 void save(QDataStream &stream, SerializationOptions options) const override;
137
138protected:
139 // --- Event handlers ---
140
142 void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override;
143
145 void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override;
146
149 void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override;
150
152 void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override;
153
154private:
155 Q_DISABLE_COPY_MOVE(IC)
156
157 // --- Utility methods ---
158
159
161 bool isCursorOverPort(const QPointF &localPos) const;
162
165 void resetInternalState();
166
167 // --- Members ---
168
169 QString m_file;
170 QString m_blobName;
174 QByteArray m_loadedBlobSnapshot;
175 QVector<GraphicElement *> m_internalElements;
176 QVector<Connection *> m_internalConnections;
177 QVector<Port *> m_internalInputs;
178 QVector<Port *> m_internalOutputs;
179
180 // --- Members: Direct simulation ---
181
182 QVector<GraphicElement *> m_sortedInternalElements;
183 QSet<GraphicElement *> m_boundaryInputElements;
184 bool m_internalHasFeedback = false;
185
186 // --- Members: Hover preview ---
187
188 QPixmap m_previewPixmap;
189};
Abstract base class for all graphical circuit elements.
Deserialization/serialization context structs passed through load()/save() call chains.
A bezier-curve wire connecting an output port to an input port in the scene.
Definition Connection.h:38
GraphicElement(ElementType type, QGraphicsItem *parent=nullptr)
Constructs a graphic element of the given type, fetching all properties from the metadata registry.
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
Definition IC.cpp:327
~IC() override
Definition IC.cpp:64
const QVector< Port * > & internalInputs() const
Definition IC.h:84
const QVector< Port * > & internalOutputs() const
Definition IC.h:85
void resettleCombinational() override
Definition IC.cpp:354
void previewHideRequested()
void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override
Definition IC.cpp:302
void initializeSimulation()
Builds the internal simulation graph (connection graph + sort) for direct simulation.
Definition IC.cpp:344
friend class ICSimulation
Definition IC.h:43
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override
Definition IC.cpp:316
QString displayName() const
Definition IC.cpp:274
void loadFromBlob(const QByteArray &blob, const QString &contextDir)
Loads the IC from in-memory blob bytes (full .panda file format).
Definition IC.cpp:248
bool isEmbedded() const override
Returns true if this element is an embedded IC (not file-backed). Base returns false.
Definition IC.h:81
void refresh() override
Definition IC.cpp:359
friend class ICRenderer
Definition IC.h:42
friend class TestIC
Definition IC.h:35
void previewRequested(IC *ic, const QPoint &screenPos)
void load(QDataStream &stream, SerializationContext &context) override
Definition IC.cpp:98
const QString & blobName() const override
Returns the blob name for embedded ICs, empty if file-backed.
Definition IC.h:79
const QPixmap & previewPixmap() const
Definition IC.h:91
void setBlobName(const QString &name)
Definition IC.h:80
friend class TestDanglingPointer
Definition IC.h:36
friend class TestArduino
Definition IC.h:34
void save(QDataStream &stream, SerializationOptions options) const override
Definition IC.cpp:83
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override
Definition IC.cpp:264
QStringList externalFiles() const override
Definition IC.cpp:74
void loadFromDrop(const QString &fileName, const QString &contextDir) override
Polymorphic interface for drag-drop initialization (replaces elementType() == IC checks).
Definition IC.cpp:254
void previewMoved(IC *ic, const QPoint &screenPos)
const QVector< GraphicElement * > & internalElements() const
Definition IC.h:83
static PortMetadata buildPortMetadata(const QVector< GraphicElement * > &elements)
Scans elements for Input/Output groups, sorts by Y/X position, and builds labels.
Definition IC.cpp:259
void requestOpenSubCircuit(int elementId, const QString &blobName, const QString &filePath)
Emitted on double-click to request opening the sub-circuit in a new tab.
void updateLogic() override
Definition IC.cpp:349
const QString & file() const
Definition IC.h:72
void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override
Definition IC.cpp:290
void previewCancelRequested(IC *ic)
QRectF boundingRect() const override
Definition IC.cpp:322
IC(QGraphicsItem *parent=nullptr)
Constructs an IC element without loading a file.
Definition IC.cpp:53
void loadFile(const QString &fileName, const QString &contextDir={})
Loads the IC circuit from fileName and rebuilds the logic mapping.
Definition IC.cpp:243
friend class ICLoader
Definition IC.h:41
Port count and label metadata extracted from Input/Output elements.
Definition IC.h:96
QStringList inputLabels
Definition IC.h:99
int inputCount
Definition IC.h:97
int outputCount
Definition IC.h:98
QStringList outputLabels
Definition IC.h:100
Bundles all per-deserialization state so that load() overrides receive it through one explicit parame...
Options passed to GraphicElement::save() (and friends); the save-side counterpart of SerializationCon...