diff --git a/sources/autoNum/ui/autonumberingdockwidget.cpp b/sources/autoNum/ui/autonumberingdockwidget.cpp index 65cfeeafe..664a00e90 100644 --- a/sources/autoNum/ui/autonumberingdockwidget.cpp +++ b/sources/autoNum/ui/autonumberingdockwidget.cpp @@ -115,6 +115,8 @@ void AutoNumberingDockWidget::setProject(QETProject *project, this,SLOT(setActive())); //Conductor, Element and Folio Signals + disconnect(m_project, &QETProject::autoNumContextUpdated, + this, &AutoNumberingDockWidget::refreshValueFields); disconnect(m_project, &QETProject::destroyed, this, &AutoNumberingDockWidget::projectClosed); } @@ -152,6 +154,8 @@ void AutoNumberingDockWidget::setProject(QETProject *project, this,SLOT(setActive())); //Conductor, Element and Folio Signals + connect(m_project, &QETProject::autoNumContextUpdated, + this, &AutoNumberingDockWidget::refreshValueFields); connect(m_project, &QETProject::destroyed, this, &AutoNumberingDockWidget::projectClosed); @@ -441,6 +445,29 @@ int AutoNumberingDockWidget::counterIndex(const NumerotationContext &context) return -1; } +/** + @brief AutoNumberingDockWidget::refreshValueFields + Re-read all three value fields from the project. Called whenever a + numerotation context's values change, which includes every element or + conductor that consumes the next number -- without this the field only + caught up when the user re-picked a rule from the combo box, because + the combo's activated() signal fires on user interaction alone. +*/ +void AutoNumberingDockWidget::refreshValueFields() +{ + //Leave alone a field the user is typing in: numbering an element + //refreshes all three, and overwriting a half-typed value under the + //cursor is worse than showing it a moment out of date. Only this + //automatic path skips; an explicit refresh after a reset or an edit + //still writes, so the field always ends up canonical. + if (!ui->m_conductor_value_le->hasFocus()) + refreshValueField(ui->m_conductor_cb, ui->m_conductor_value_le, AutoNumCategory::Conductor); + if (!ui->m_element_value_le->hasFocus()) + refreshValueField(ui->m_element_cb, ui->m_element_value_le, AutoNumCategory::Element); + if (!ui->m_folio_value_le->hasFocus()) + refreshValueField(ui->m_folio_cb, ui->m_folio_value_le, AutoNumCategory::Folio); +} + /** @brief AutoNumberingDockWidget::refreshValueField Show the current value of the selected context's counter, so the field diff --git a/sources/autoNum/ui/autonumberingdockwidget.h b/sources/autoNum/ui/autonumberingdockwidget.h index 7ba80ac15..cdfb9f08e 100644 --- a/sources/autoNum/ui/autonumberingdockwidget.h +++ b/sources/autoNum/ui/autonumberingdockwidget.h @@ -54,6 +54,7 @@ class AutoNumberingDockWidget : public QDockWidget void folioAutoNumChanged(); void clear(); void projectClosed(); + void refreshValueFields(); void on_m_configure_pb_clicked(); diff --git a/sources/qetproject.cpp b/sources/qetproject.cpp index 3d205edfa..9b115458d 100644 --- a/sources/qetproject.cpp +++ b/sources/qetproject.cpp @@ -726,6 +726,7 @@ QHash QETProject::folioAutoNum() const */ void QETProject::addConductorAutoNum(const QString& key, const NumerotationContext& context) { m_conductor_autonum.insert(key, context); + emit autoNumContextUpdated(); } /** @@ -739,6 +740,7 @@ void QETProject::addElementAutoNum(const QString& key, const NumerotationContext { m_element_autonum.insert(key, context); emit elementAutoNumAdded(key); + emit autoNumContextUpdated(); } /** @@ -750,6 +752,7 @@ void QETProject::addElementAutoNum(const QString& key, const NumerotationContext */ void QETProject::addFolioAutoNum(const QString& key, const NumerotationContext& context) { m_folio_autonum.insert(key, context); + emit autoNumContextUpdated(); } /** diff --git a/sources/qetproject.h b/sources/qetproject.h index dfd5ab8ea..61427ca72 100644 --- a/sources/qetproject.h +++ b/sources/qetproject.h @@ -234,6 +234,12 @@ class QETProject : public QObject void conductorAutoNumAdded(); void conductorAutoNumRemoved(); void folioAutoNumAdded(); + /// A numerotation context's *values* changed -- as happens every + /// time an element or conductor consumes the next number, not + /// only when a rule is added or removed. Deliberately separate + /// from the *Added/*Removed signals above, which make listeners + /// rebuild their rule lists; this one just says "re-read me". + void autoNumContextUpdated(); void folioAutoNumRemoved(); void folioAutoNumChanged(QString); void defaultTitleBlockPropertiesChanged();