17 auto calculateSerialId = [](
Port *port) -> quint64 {
26 QMap<QString, QVariant> map;
27 map.insert(
"startPortId", calculateSerialId(connection.
startPort()));
28 map.insert(
"endPortId", calculateSerialId(connection.
endPort()));
39 if (stream.status() != QDataStream::Ok) {
40 throw PANDACEPTION(
"Stream error reading connection map at offset %1",
41 stream.device()->pos());
44 id1 = map.value(
"startPortId").toULongLong();
45 id2 = map.value(
"endPortId").toULongLong();
50 if (stream.status() != QDataStream::Ok) {
51 throw PANDACEPTION(
"Stream error reading connection port IDs at offset %1",
52 stream.device()->pos());
71 if (!context.
portMap.contains(id1) || !context.
portMap.contains(id2)) {
75 auto *port1 = context.
portMap.value(id1);
76 auto *port2 = context.
portMap.value(id2);
81 Port *outputCandidate = port1->
isOutput() ? port1 : port2->isOutput() ? port2 :
nullptr;
82 Port *inputCandidate = port1->
isInput() ? port1 : port2->isInput() ? port2 :
nullptr;
84 if (outputCandidate && inputCandidate && outputCandidate != inputCandidate) {
85 auto *outputPort =
dynamic_cast<OutputPort *
>(outputCandidate);
86 auto *inputPort =
dynamic_cast<InputPort *
>(inputCandidate);
87 if (outputPort && inputPort) {
Common logging utilities, the Pandaception error type, and helper macros.
#define PANDACEPTION(msg,...)
ConnectionSerializer: reads/writes a Connection to a versioned QDataStream.
Connection: a wire that connects an output port to an input port in the circuit scene.
Abstract base class for all graphical circuit elements.
Port classes: Port (base), InputPort, and OutputPort.
Deserialization/serialization context structs passed through load()/save() call chains.
Circuit and waveform file serialization/deserialization utilities.
Named version predicates for file-format compatibility checks.
static void save(const Connection &connection, QDataStream &stream)
Writes connection's endpoint port serial IDs to stream.
static void load(Connection &connection, QDataStream &stream, SerializationContext &context)
Reads connection's endpoints from stream, resolving ports via context.
A bezier-curve wire connecting an output port to an input port in the scene.
OutputPort * startPort() const
Returns the output port this connection originates from.
InputPort * endPort() const
Returns the input port this connection leads to.
void updatePosFromPorts()
Moves the wire endpoints to match the current port positions.
void setEndPort(InputPort *port)
Sets the input port this connection leads to.
void setStartPort(OutputPort *port)
Sets the output port this connection originates from.
Abstract base class for all graphical circuit elements in wiRedPanda.
int id() const
Returns the unique integer identifier of this item, or -1 if unassigned.
A port that drives a signal (the source end of a wire).
Abstract base class for circuit element ports (connection endpoints).
virtual bool isOutput() const =0
Returns true if this is an output port. Pure virtual.
static quint64 makeSerialId(quint64 elementBase, int globalIndex)
virtual bool isInput() const =0
Returns true if this is an input port. Pure virtual.
static QMap< QString, QVariant > readBoundedMetadata(QDataStream &stream)
Reads the file-level metadata QMap<QString,QVariant> from stream without calling QList::reserve() wit...
bool hasConnectionQMap(const QVersionNumber &v)
V4.7: Connection uses QMap-based serialization format.
Bundles all per-deserialization state so that load() overrides receive it through one explicit parame...
QVersionNumber version
File-format version read from the stream header.
QHash< quint64, quint64 > oldPtrToSerialId
QHash< quint64, Port * > & portMap
Accumulated port-pointer map built during deserialization.