ParameterInputRow
One editable parameter: label, value widget, optional expression.
| Inherits | QWidget |
Declared in src/libs/libconstruct/construct/ui/components/ParameterInputRow.hpp.
Detailed description
Programmatic setters never emit
**Invariant: no setter on this class emits valueChanged.** Only genuine user interaction with the value widget does. setValue(), setParameterValue(), setExpression() and setExpressionMode() are all silent, and every inner input widget (FloatInput, EnumInput, …) is silent on programmatic set for the same reason.
This was true before it was ever written down, which is precisely the problem: because nothing stated or tested it, each of the seven callers defended against it independently — `mSuppressEdits`, `m_applying`, `m_applyingAppRow` and friends — and one setter (setExpression) had quietly broken it. An unstated invariant that every caller works around is indistinguishable from no invariant at all.
`testParameterRowSetterSilence` pins it for every setter and every row type. If you add a setter, add it there; do not reintroduce a guard at the call site.
A caller that genuinely needs the model round-trip suppressed — where writing the model fires a change signal that comes back — still needs its own flag. That is a different problem and this invariant does not solve it.