Fix qet.deleteElement() leaving the element's wires on the folio

qet.deleteElement() built its DeleteQGraphicsItemCommand from the element
alone. The Delete key's selection also carries the wires on the element's
terminals (DiagramContent's conductors to update), and the command removes
those with it. From a script they stayed: still listed by
qet.conductorUuids(), still saved, attached to an element that was gone.

The wires on the element's terminals now go into the command, as for the
Delete key. tst_scriptconductoruuid checks that no wire is left with an
end on the deleted element (it failed before this change: 1 left).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015FPuYPS4T7QuEwjNu22rXD
This commit is contained in:
ispyisail
2026-10-03 21:49:06 +13:00
parent 6144da0f91
commit 2e2801b617
2 changed files with 32 additions and 0 deletions
+10
View File
@@ -772,6 +772,16 @@ bool QetScriptApi::deleteElement(int folioIndex, const QString &elementUuid)
DiagramContent content;
content.m_elements << element;
// The wires on its terminals go with it, as when the Delete key
// removes a selected element (DiagramContent puts them in
// m_conductors_to_update); without them they stay on the folio,
// attached to an element that is no longer there.
for (Terminal *terminal : element->terminals()) {
for (Conductor *conductor : terminal->conductors()) {
if (!content.m_conductors_to_update.contains(conductor))
content.m_conductors_to_update << conductor;
}
}
if (DeleteQGraphicsItemCommand::hasNonDeletableTerminal(content)) {
log(QStringLiteral("qet.deleteElement: %1 has a non-deletable terminal (linked master/slave?), refusing").arg(elementUuid));
return false;
+22
View File
@@ -97,6 +97,28 @@ private slots:
QVERIFY(r.value(QStringLiteral("junk")).toArray().isEmpty());
QVERIFY(r.value(QStringLiteral("badFolio")).toArray().isEmpty());
}
// qet.deleteElement() takes the wires on the element's terminals with
// it, as the Delete key does; they used to stay on the folio, attached
// to an element that was gone.
void deleteElementTakesItsWires()
{
const QJsonObject r = run(QStringLiteral(
"var p = 'embed://import/probe/v2_fuse.elmt';\n"
"var a = qet.addElement(0, p, 400, 400);\n"
"var b = qet.addElement(0, p, 470, 490);\n"
"qet.addConductor(0, a, 0, b, 0);\n"
"var before = qet.conductorUuids(0).length;\n"
"var deleted = qet.deleteElement(0, a);\n"
"var dangling = qet.conductorUuids(0).filter(function (u) {\n"
" return qet.conductorEnds(0, u).some(function (e) { return e.indexOf(a) === 0; }); });\n"
"qet.log('PROBE ' + JSON.stringify({deleted: deleted, before: before,\n"
" after: qet.conductorUuids(0).length, dangling: dangling.length}));\n"));
QVERIFY2(!r.isEmpty(), "the script logged nothing");
QVERIFY(r.value(QStringLiteral("deleted")).toBool());
QCOMPARE(r.value(QStringLiteral("dangling")).toInt(), 0);
QCOMPARE(r.value(QStringLiteral("after")).toInt(), r.value(QStringLiteral("before")).toInt() - 1);
}
};
QTEST_APPLESS_MAIN(tst_scriptconductoruuid)