Fix Project properties > OK marking the project modified with no edit

Pressing OK in Projet > Propriétés du projet without changing anything
marked the project modified and rewrote its defaults for new folios.
Besides the Page Num placeholder (fixed separately), four causes:

- Title block custom fields: since #271 the dialog offers the
  template's variables for filling in; those left empty came back as
  part of the context. Drop the ones not in the stored context.
- DiagramContext::remove() left the key's show flag behind, so a
  context with a key removed never equalled one without it.
- Guides: applyConf() marked the project modified whether or not the
  guides changed. Compare them like every other setting.
- Wire dash size and cross-reference offsets: the spin boxes cannot
  show the stored default (dash size 1 under a minimum of 2; offset 0
  under a minimum of 40 shown as "Default"), so the clamped value came
  back. Keep the stored value unless the box shows something else, as
  #1204 did for the wire panel.

Checked in the GUI (with the Page Num fix as well) on grafcet,
schema_indus and Projet_vierge: OK with no edit then Ctrl+S saves the
same file as Ctrl+S alone; master writes dash-size 1 -> 2, a
cross-reference offset 0 -> 40, and on Projet_vierge 22 empty custom
fields. New test for DiagramContext::remove() fails without the fix.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
ispyisail
2026-10-02 21:04:54 +13:00
parent b485258424
commit 82fc56c5e6
7 changed files with 49 additions and 4 deletions
+1
View File
@@ -42,6 +42,7 @@ void DiagramContext::add(DiagramContext other)
*/
void DiagramContext::remove(const QString &key) {
m_content.remove(key);
m_content_show.remove(key);
}
/**
+6
View File
@@ -126,6 +126,12 @@ ConductorProperties ConductorPropertiesWidget::properties() const
properties_.m_bicolor = ui->m_color_2_gb->isChecked();
properties_.m_color_2 = ui->m_color_2_kpb->color();
properties_.m_dash_size = ui->m_dash_size_sb->value();
//The box starts at 2, so the default size 1 shows as 2: keep the
//stored size unless the box shows something else.
if (properties_.m_dash_size == qBound(ui->m_dash_size_sb->minimum(),
m_properties.m_dash_size,
ui->m_dash_size_sb->maximum()))
properties_.m_dash_size = m_properties.m_dash_size;
properties_.style = ui -> m_line_style_cb->itemData(ui->m_line_style_cb->currentIndex()).value<QPen>().style();
properties_.m_formula = ui->m_formula_le->text();
properties_.text = ui -> m_text_le -> text();
+4 -2
View File
@@ -233,8 +233,10 @@ void NewDiagramPage::applyConf()
pg.color = g.color;
proj_guides.append(pg);
}
m_project->setDefaultGuides(proj_guides);
modified_project = true;
if (m_project->defaultGuides() != proj_guides) {
m_project->setDefaultGuides(proj_guides);
modified_project = true;
}
if (modified_project) {
m_project -> setModified(modified_project);
@@ -166,6 +166,7 @@ void TitleBlockPropertiesWidget::setProperties(
// Show the saved custom values, plus any of the template's custom variables
// that aren't defined yet, so the user only fills in the missing ones (#271).
DiagramContext context = properties.context;
m_context_keys = context.keys();
addTemplateVariables(context, index);
m_dcw -> setContext(context);
}
@@ -215,6 +216,14 @@ TitleBlockProperties TitleBlockPropertiesWidget::properties() const
}
prop.context = m_dcw -> context();
//The template's custom variables are only offered for filling in
//(#271): one left empty is not part of the properties.
const QList<QString> keys = prop.context.keys();
for (const QString &key : keys) {
if (!m_context_keys.contains(key)
&& prop.context.value(key).toString().isEmpty())
prop.context.remove(key);
}
prop.auto_page_num = ui->auto_page_cb->currentText();
+2
View File
@@ -100,6 +100,8 @@ class TitleBlockPropertiesWidget : public QWidget
private:
Ui::TitleBlockPropertiesWidget *ui;
DiagramContextWidget *m_dcw;
/// keys of the context given to setProperties()
QStringList m_context_keys;
QAction *m_tbt_edit, *m_tbt_duplicate;
QMenu *m_tbt_menu;
QList <TitleBlockTemplatesCollection *> m_tbt_collection_list;
+9 -2
View File
@@ -151,8 +151,15 @@ void XRefPropertiesWidget::saveProperties(int index) {
xrp.setPrefix("switch", ui->m_switch_prefix_le->text());
xrp.setMasterLabel(ui->m_master_le->text());
xrp.setSlaveLabel(ui->m_slave_le->text());
xrp.setOffset(ui->m_offset_sb->value());
xrp.setSlaveOffset(ui->m_slave_offset_sb->value());
//The boxes cannot show a value below their minimum (the offset's
//minimum is its "Default" entry, standing for the stored 0): keep
//the stored value unless the box shows something else.
if (ui->m_offset_sb->value() != qBound(ui->m_offset_sb->minimum(), xrp.offset(),
ui->m_offset_sb->maximum()))
xrp.setOffset(ui->m_offset_sb->value());
if (ui->m_slave_offset_sb->value() != qBound(ui->m_slave_offset_sb->minimum(), xrp.slaveOffset(),
ui->m_slave_offset_sb->maximum()))
xrp.setSlaveOffset(ui->m_slave_offset_sb->value());
m_properties.insert(type, xrp);
}
+18
View File
@@ -65,6 +65,24 @@ private slots:
QCOMPARE(fromDom(xml(value)), expected);
QCOMPARE(fromPugi(xml(value)), expected);
}
// remove() forgets the key entirely: a context with a key added
// then removed equals one that never had it. remove() used to keep
// the key's show flag, so the two never compared equal, and
// Project properties > OK saw a change where there was none.
void removeForgetsTheKey()
{
DiagramContext edited;
edited.addValue(QStringLiteral("author"), QStringLiteral("N.V."));
edited.addValue(QStringLiteral("01-numprojet"), QString());
edited.remove(QStringLiteral("01-numprojet"));
DiagramContext stored;
stored.addValue(QStringLiteral("author"), QStringLiteral("N.V."));
QCOMPARE(edited.keys(), stored.keys());
QVERIFY(edited == stored);
}
};
QTEST_APPLESS_MAIN(tst_diagramcontext)