mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-10-15 01:54:14 +02:00
Change a symbol's information without building its folio (stage D5)
A script changing the information of a symbol on a folio not built, when nothing else shows that information (no symbol built holds it, no partner is linked to it, no label formula), changes it through the project database: the store and the symbol's element info row, undoable by uuid (ChangeStoredElementInformationCommand). Reading it back reads the store. Building the symbol later takes the change (projectDataBase::takeUnbuiltEdit(), in Element::fromXml()), the label and texts following as for any change. Saving a .qetz writes the changed information in the database in place of the rows the folio was read with, its file copied, the folio still not built; a symbol whose file holds no information block, or a .qet, builds the folio to save. 136-folio .qetz, "comment" set on the 3 513 symbols the database can change: 0.9 s, no folio built, saved in 6.1 s, none built (27 s and 116 folios when saving built them). The same edits on the 4 039 symbols with no partner and no formula, lazily and with every folio built: the two saved projects are the same file. tst_lazyfolios: a script changes a symbol not built, building none; saved as when built (fails when building ignores the change, and when the .qetz writer does); undone; the folio built afterwards shows it. ctest 96/96 eager and lazy; 342 corpus projects save the same in all four arms and export the same. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -749,6 +749,28 @@ QByteArray QetContainerDb::extract(QDomElement project, QString *error, const QB
|
||||
QStringLiteral("INSERT INTO conductor SELECT * FROM old.conductor WHERE folio_id = ? ORDER BY rowid")}) {
|
||||
Statement rows(db, sql);
|
||||
ok = ok && rows.run({id});
|
||||
}
|
||||
//Its symbols whose information changed since (QETProject::toXml()):
|
||||
//their information rows written as a symbol's block writes them
|
||||
for (const QDomElement &edited : children(d, QStringLiteral("qetz-edited-element"))) {
|
||||
Statement find(db, QStringLiteral("SELECT key FROM element WHERE folio_id = ? AND uuid = ? AND info_at IS NOT NULL"));
|
||||
find.bind({id, edited.attribute(QStringLiteral("uuid"))});
|
||||
if (!find.next()) {
|
||||
setError(error, QStringLiteral("a symbol changed on folio %1 kept as it was is not in its database").arg(id));
|
||||
return {};
|
||||
}
|
||||
const QString key = find.value(0).toString();
|
||||
Statement drop(db, QStringLiteral("DELETE FROM element_info WHERE element_key = ?"));
|
||||
ok = ok && drop.run({key});
|
||||
int ord = 0;
|
||||
for (QDomElement i : children(edited.firstChildElement(QStringLiteral("elementInformations")),
|
||||
QStringLiteral("elementInformation"))) {
|
||||
QVariant value;
|
||||
simpleValue(i, &value);
|
||||
ok = ok && element_info.run({key, ord++, i.hasAttribute(QStringLiteral("name"))
|
||||
? QVariant(i.attribute(QStringLiteral("name"))) : QVariant(),
|
||||
value, attributesJson(i, QStringLiteral("name"), true)});
|
||||
}
|
||||
}
|
||||
if (!ok) {
|
||||
setError(error, QStringLiteral("folio %1 kept as it was is not in its database").arg(id));
|
||||
|
||||
Reference in New Issue
Block a user