Base: QuantityFormat: avoid storing formatting defaults

User defined precision and fractional inch are stored on QuantityFormat
construction making changes persistent to object life time.
Change that so until not explicitely overriden, user defined values
are always returned.

Co-authored-by: Matthias Danner <28687794+matthiasdanner@users.noreply.github.com>
This commit is contained in:
Ladislav Michl
2025-09-02 23:17:22 +02:00
parent e7cd72b2e0
commit 01b547912f
10 changed files with 42 additions and 29 deletions

View File

@@ -60,17 +60,27 @@ using Base::UnitsSchema;
QuantityFormat::QuantityFormat() QuantityFormat::QuantityFormat()
: option(OmitGroupSeparator | RejectGroupSeparator) : option(OmitGroupSeparator | RejectGroupSeparator)
, format(Fixed) , format(Fixed)
, precision(UnitsApi::getDecimals()) , _precision(-1)
, denominator(UnitsApi::getDenominator()) , _denominator(-1)
{} {}
QuantityFormat::QuantityFormat(QuantityFormat::NumberFormat format, int decimals) QuantityFormat::QuantityFormat(QuantityFormat::NumberFormat format, int decimals)
: option(OmitGroupSeparator | RejectGroupSeparator) : option(OmitGroupSeparator | RejectGroupSeparator)
, format(format) , format(format)
, precision(decimals < 0 ? UnitsApi::getDecimals() : decimals) , _precision(decimals)
, denominator(UnitsApi::getDenominator()) , _denominator(-1)
{} {}
int QuantityFormat::getPrecision() const
{
return _precision < 0 ? UnitsApi::getDecimals() : _precision;
}
int QuantityFormat::getDenominator() const
{
return _denominator < 0 ? UnitsApi::getDenominator() : _denominator;
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
Quantity::Quantity() Quantity::Quantity()
@@ -255,7 +265,7 @@ std::string Quantity::toNumber(const QuantityFormat& format) const
default: default:
break; break;
} }
ss << std::setprecision(format.precision) << myValue; ss << std::setprecision(format.getPrecision()) << myValue;
return ss.str(); return ss.str();
} }

View File

@@ -49,18 +49,19 @@ struct BaseExport QuantityFormat
using NumberOptions = int; using NumberOptions = int;
NumberOptions option; NumberOptions option;
NumberFormat format; NumberFormat format;
int precision;
int denominator;
inline int getDenominator() const int getPrecision() const;
inline void setPrecision(int precision)
{ {
return denominator; _precision = precision;
} }
inline void setDenominator(int denom) int getDenominator() const;
inline void setDenominator(int denominator)
{ {
denominator = denom; _denominator = denominator;
} }
QuantityFormat(); QuantityFormat();
explicit QuantityFormat(NumberFormat format, int decimals = -1); explicit QuantityFormat(NumberFormat format, int decimals = -1);
inline char toFormat() const inline char toFormat() const
@@ -93,6 +94,9 @@ struct BaseExport QuantityFormat
return Default; return Default;
} }
} }
private:
int _precision, _denominator;
}; };
/** /**

View File

@@ -57,7 +57,7 @@ std::string QuantityPy::representation() const
PyObject* QuantityPy::toStr(PyObject* args) const PyObject* QuantityPy::toStr(PyObject* args) const
{ {
int prec = getQuantityPtr()->getFormat().precision; int prec = getQuantityPtr()->getFormat().getPrecision();
if (!PyArg_ParseTuple(args, "|i", &prec)) { if (!PyArg_ParseTuple(args, "|i", &prec)) {
return nullptr; return nullptr;
} }
@@ -669,9 +669,9 @@ Py::Dict QuantityPy::getFormat() const
QuantityFormat fmt = getQuantityPtr()->getFormat(); QuantityFormat fmt = getQuantityPtr()->getFormat();
Py::Dict dict; Py::Dict dict;
dict.setItem("Precision", Py::Long(fmt.precision)); dict.setItem("Precision", Py::Long(fmt.getPrecision()));
dict.setItem("NumberFormat", Py::Char(fmt.toFormat())); dict.setItem("NumberFormat", Py::Char(fmt.toFormat()));
dict.setItem("Denominator", Py::Long(fmt.denominator)); dict.setItem("Denominator", Py::Long(fmt.getDenominator()));
return dict; return dict;
} }
@@ -681,7 +681,7 @@ void QuantityPy::setFormat(Py::Dict arg)
if (arg.hasKey("Precision")) { if (arg.hasKey("Precision")) {
Py::Long prec(arg.getItem("Precision")); Py::Long prec(arg.getItem("Precision"));
fmt.precision = static_cast<int>(prec); fmt.setPrecision(static_cast<int>(prec));
} }
if (arg.hasKey("NumberFormat")) { if (arg.hasKey("NumberFormat")) {
@@ -719,7 +719,7 @@ void QuantityPy::setFormat(Py::Dict arg)
if (fracInch & (fracInch - 1)) { if (fracInch & (fracInch - 1)) {
throw Py::ValueError("Denominator must be a power of two"); throw Py::ValueError("Denominator must be a power of two");
} }
fmt.denominator = fracInch; fmt.setDenominator(fracInch);
} }
getQuantityPtr()->setFormat(fmt); getQuantityPtr()->setFormat(fmt);

View File

@@ -208,9 +208,7 @@ PyObject* UnitsApi::sToNumber(PyObject* /*self*/, PyObject* args)
} }
bool ok {}; bool ok {};
QuantityFormat qf; QuantityFormat qf {QuantityFormat::toFormat(format[0], &ok), decimals};
qf.format = QuantityFormat::toFormat(format[0], &ok);
qf.precision = decimals;
if (!ok) { if (!ok) {
PyErr_SetString(PyExc_ValueError, "Invalid format string"); PyErr_SetString(PyExc_ValueError, "Invalid format string");

View File

@@ -98,7 +98,8 @@ UnitsSchema::toLocale(const Quantity& quant, const double factor, const std::str
} }
auto valueString = auto valueString =
Lc.toString(quant.getValue() / factor, format.toFormat(), format.precision).toStdString(); Lc.toString(quant.getValue() / factor, format.toFormat(), format.getPrecision())
.toStdString();
auto notUnit = [](auto s) { auto notUnit = [](auto s) {
return s.empty() || s == "°" || s == "" || s == "" || s == "\"" || s == "'"; return s.empty() || s == "°" || s == "" || s == "" || s == "\"" || s == "'";

View File

@@ -563,13 +563,13 @@ QString InputField::getUnitText()
int InputField::getPrecision() const int InputField::getPrecision() const
{ {
return this->actQuantity.getFormat().precision; return this->actQuantity.getFormat().getPrecision();
} }
void InputField::setPrecision(const int precision) void InputField::setPrecision(const int precision)
{ {
Base::QuantityFormat format = actQuantity.getFormat(); Base::QuantityFormat format = actQuantity.getFormat();
format.precision = precision; format.setPrecision(precision);
actQuantity.setFormat(format); actQuantity.setFormat(format);
updateText(actQuantity); updateText(actQuantity);
} }

View File

@@ -743,14 +743,14 @@ bool QuantitySpinBox::isCheckedRangeInExpresion() const
int QuantitySpinBox::decimals() const int QuantitySpinBox::decimals() const
{ {
Q_D(const QuantitySpinBox); Q_D(const QuantitySpinBox);
return d->quantity.getFormat().precision; return d->quantity.getFormat().getPrecision();
} }
void QuantitySpinBox::setDecimals(int v) void QuantitySpinBox::setDecimals(int v)
{ {
Q_D(QuantitySpinBox); Q_D(QuantitySpinBox);
Base::QuantityFormat f = d->quantity.getFormat(); Base::QuantityFormat f = d->quantity.getFormat();
f.precision = v; f.setPrecision(v);
d->quantity.setFormat(f); d->quantity.setFormat(f);
updateText(d->quantity); updateText(d->quantity);
} }

View File

@@ -136,7 +136,7 @@ Quantity Constraint::getPresentationValue() const
QuantityFormat format = quantity.getFormat(); QuantityFormat format = quantity.getFormat();
format.option = QuantityFormat::None; format.option = QuantityFormat::None;
format.format = QuantityFormat::Default; format.format = QuantityFormat::Default;
format.precision = 6; // QString's default format.setPrecision(6); // QString's default
quantity.setFormat(format); quantity.setFormat(format);
return quantity; return quantity;
} }

View File

@@ -69,7 +69,7 @@ protected:
UnitsApi::setSchema(name); UnitsApi::setSchema(name);
Quantity quantity {value, unit}; Quantity quantity {value, unit};
QuantityFormat format = quantity.getFormat(); QuantityFormat format = quantity.getFormat();
format.precision = precision; format.setPrecision(precision);
quantity.setFormat(format); quantity.setFormat(format);
return quantity.getSafeUserString(); return quantity.getSafeUserString();
} }

View File

@@ -51,18 +51,18 @@ private Q_SLOTS:
{ {
auto quant = qsb->value(); auto quant = qsb->value();
auto format = quant.getFormat(); auto format = quant.getFormat();
format.precision = 7; format.setPrecision(7);
quant.setFormat(format); quant.setFormat(format);
qsb->setValue(quant); qsb->setValue(quant);
auto val1 = qsb->value(); auto val1 = qsb->value();
QCOMPARE(val1.getFormat().precision, 7); QCOMPARE(val1.getFormat().getPrecision(), 7);
// format shouldn't change after setting a double // format shouldn't change after setting a double
qsb->setValue(3.5); qsb->setValue(3.5);
auto val2 = qsb->value(); auto val2 = qsb->value();
QCOMPARE(val2.getFormat().precision, 7); QCOMPARE(val2.getFormat().getPrecision(), 7);
} }
private: private: