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:
ispyisail
2026-10-12 16:36:56 +13:00
parent 9078e4e321
commit 244de05421
10 changed files with 345 additions and 3 deletions
@@ -119,3 +119,27 @@ void ChangeElementInformationCommand::updateProjectDB()
elmt->diagram()->project()->dataBase()->elementInfoChanged(list_);
}
}
ChangeStoredElementInformationCommand::ChangeStoredElementInformationCommand(
QETProject *project, const QUuid &element, const DiagramContext &old_info,
const DiagramContext &new_info, QUndoCommand *parent) :
QUndoCommand(parent),
m_project(project),
m_element(element),
m_old_info(old_info),
m_new_info(new_info)
{
setText(QObject::tr("Change the information of the element"));
}
void ChangeStoredElementInformationCommand::undo()
{
if (m_project)
m_project->dataBase()->setPlacedElementInformation(m_element, m_old_info);
}
void ChangeStoredElementInformationCommand::redo()
{
if (m_project)
m_project->dataBase()->setPlacedElementInformation(m_element, m_new_info);
}