From a3511e86940bd9bf5a3dd8c9ea3060e73354cdf4 Mon Sep 17 00:00:00 2001 From: ispyisail Date: Sun, 2 Aug 2026 08:12:22 +1200 Subject: [PATCH] Give Conductor its own persisted uuid Slice 1 of discussion #503 (from-to wiring list built on projectDataBase). Conductor is the one item type on a diagram without a stable identity of its own -- Element and Diagram both have a uuid, Conductor didn't. This is the prerequisite the wiring-list tables need: a conductor table keyed by uuid, the same way the existing element table is keyed by Element::uuid(). - Conductor gets a QUuid m_uuid, generated in the constructor, with uuid()/newUuid() accessors mirroring Element's exact pattern. - toXml()/fromXml() read/write a "uuid" attribute the same way Element already does, including the same generate-on-missing fallback (QUuid(e.attribute("uuid", QUuid::createUuid().toString()))) for projects saved before this change. - PasteDiagramCommand::redo() calls newUuid() on every pasted conductor (content.conductors(), all three categories), mirroring the existing per-element newUuid() call right above it -- otherwise copy-paste would duplicate a conductor's uuid. Backward compatibility: Conductor::valideXml() doesn't require the "uuid" attribute, so old files parse unchanged. Verified by opening a genuinely pre-uuid project (examples/industrial.qet, 150 folios, 671 conductors, legacy integer terminal1/terminal2 references with no uuid attribute at all) -- loads and renders correctly, gets uuids assigned on load, and those uuids are stable across a second load/save cycle (byte-identical uuid values). Verified paste separately: copying a selection with conductors and pasting produces distinct new uuids for every pasted conductor, none colliding with the originals or each other. --- sources/diagramcommands.cpp | 7 +++++++ sources/qetgraphicsitem/conductor.cpp | 8 ++++++++ sources/qetgraphicsitem/conductor.h | 4 ++++ 3 files changed, 19 insertions(+) diff --git a/sources/diagramcommands.cpp b/sources/diagramcommands.cpp index 2922c32b1..763f1f987 100644 --- a/sources/diagramcommands.cpp +++ b/sources/diagramcommands.cpp @@ -75,6 +75,13 @@ void PasteDiagramCommand::redo() { first_redo = false; + //make new uuid for every pasted conductor, because old uuid are + //the uuid of the copied conductor + const QList all_pasted_conductors = content.conductors(); + for (Conductor *c : all_pasted_conductors) { + c -> newUuid(); + } + //this is the first paste, we do some actions for the new element const QList elmts_list = content.m_elements; for (Element *e : elmts_list) diff --git a/sources/qetgraphicsitem/conductor.cpp b/sources/qetgraphicsitem/conductor.cpp index 291608620..546f64b3e 100644 --- a/sources/qetgraphicsitem/conductor.cpp +++ b/sources/qetgraphicsitem/conductor.cpp @@ -91,6 +91,7 @@ Conductor::Conductor(Terminal *p1, Terminal* p2) : //set Zvalue at 11 to be upper than the DiagramImageItem and element setZValue(11); m_previous_z_value = zValue(); + m_uuid = QUuid::createUuid(); //Add this conductor to the list of conductors of each of the two terminals bool ajout_p1 = terminal1 -> addConductor(this); @@ -1005,6 +1006,12 @@ void Conductor::pointsToSegments(const QList& points_list) { */ bool Conductor::fromXml(QDomElement &dom_element) { + //Older project files have no conductor uuid attribute at all -- + //generate one on load, same treatment terminal uuids got when + //that field was introduced (see terminal1/terminal2 handling in + //toXml() below). + m_uuid = QUuid(dom_element.attribute("uuid", QUuid::createUuid().toString())); + setPos(dom_element.attribute("x", nullptr).toDouble(), dom_element.attribute("y", nullptr).toDouble()); @@ -1043,6 +1050,7 @@ QDomElement Conductor::toXml(QDomDocument &dom_document, { QDomElement dom_element = dom_document.createElement("conductor"); + dom_element.setAttribute("uuid", m_uuid.toString()); dom_element.setAttribute("x", QString::number(pos().x())); dom_element.setAttribute("y", QString::number(pos().y())); diff --git a/sources/qetgraphicsitem/conductor.h b/sources/qetgraphicsitem/conductor.h index dc4d5586b..91ca92afb 100644 --- a/sources/qetgraphicsitem/conductor.h +++ b/sources/qetgraphicsitem/conductor.h @@ -21,6 +21,7 @@ #include "../conductorproperties.h" #include +#include class ConductorProfile; class ConductorSegmentProfile; @@ -77,6 +78,8 @@ class Conductor : public QGraphicsObject int type() const override { return Type; } Diagram *diagram() const; ConductorTextItem *textItem() const; + QUuid uuid() const {return m_uuid;} + void newUuid() {m_uuid = QUuid::createUuid();} //create new uuid for this conductor void updatePath(const QRectF & = QRectF()); //This method do nothing, it's only made to be used with Q_PROPERTY @@ -205,6 +208,7 @@ class Conductor : public QGraphicsObject Highlight must_highlight_; bool m_valid; bool m_freeze_label = false; + QUuid m_uuid; /// QPen et QBrush objects used to draw conductors static QPen conductor_pen;