From e7cd72b2e08ac21f78414c701156bfed53960737 Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Wed, 27 Aug 2025 11:40:50 +0200 Subject: [PATCH] Base: refactor unit formatting defaults Defaults for both precision (number of digits after decimal point) and denominator (number of fractions) are defined on various places making difficult to find which default is used for various tasks. Store these values at one central place: UnitsApi. Unless overriden by user, default values are defined by unitSchemasDataPack. --- src/App/Application.cpp | 3 +- src/Base/Quantity.cpp | 11 ++---- src/Base/Quantity.h | 15 -------- src/Base/UnitsApi.cpp | 34 +++++++++---------- src/Base/UnitsApi.h | 13 +++---- .../PreferencePages/DlgSettingsGeneral.cpp | 4 +-- 6 files changed, 30 insertions(+), 50 deletions(-) diff --git a/src/App/Application.cpp b/src/App/Application.cpp index 35957b7e8a..a5dd147c00 100644 --- a/src/App/Application.cpp +++ b/src/App/Application.cpp @@ -2782,8 +2782,7 @@ void Application::initApplication() ("User parameter:BaseApp/Preferences/Units"); Base::UnitsApi::setSchema(hGrp->GetInt("UserSchema", Base::UnitsApi::getDefSchemaNum())); Base::UnitsApi::setDecimals(hGrp->GetInt("Decimals", Base::UnitsApi::getDecimals())); - Base::QuantityFormat::setDefaultDenominator( - hGrp->GetInt("FracInch", Base::QuantityFormat::getDefaultDenominator())); + Base::UnitsApi::setDenominator(hGrp->GetInt("FracInch", Base::UnitsApi::getDenominator())); #if defined (_DEBUG) Base::Console().log("Application is built with debug information\n"); diff --git a/src/Base/Quantity.cpp b/src/Base/Quantity.cpp index 499e4247df..478a2f7f0a 100644 --- a/src/Base/Quantity.cpp +++ b/src/Base/Quantity.cpp @@ -57,23 +57,18 @@ using Base::Quantity; using Base::QuantityFormat; using Base::UnitsSchema; -// ====== Static attributes ========================= -// NOLINTNEXTLINE -int QuantityFormat::defaultDenominator = 8; // for 1/8" - - QuantityFormat::QuantityFormat() : option(OmitGroupSeparator | RejectGroupSeparator) , format(Fixed) - , precision(static_cast(UnitsApi::getDecimals())) - , denominator(defaultDenominator) + , precision(UnitsApi::getDecimals()) + , denominator(UnitsApi::getDenominator()) {} QuantityFormat::QuantityFormat(QuantityFormat::NumberFormat format, int decimals) : option(OmitGroupSeparator | RejectGroupSeparator) , format(format) , precision(decimals < 0 ? UnitsApi::getDecimals() : decimals) - , denominator(defaultDenominator) + , denominator(UnitsApi::getDenominator()) {} // ---------------------------------------------------------------------------- diff --git a/src/Base/Quantity.h b/src/Base/Quantity.h index ec69975c65..01f16609bc 100644 --- a/src/Base/Quantity.h +++ b/src/Base/Quantity.h @@ -52,21 +52,6 @@ struct BaseExport QuantityFormat int precision; int denominator; - // Default denominator of minimum fractional inch. Only used in certain - // schemas. - // NOLINTNEXTLINE - static int defaultDenominator; // i.e 8 for 1/8" - - static inline int getDefaultDenominator() - { - return defaultDenominator; - } - - static inline void setDefaultDenominator(int denom) - { - defaultDenominator = denom; - } - inline int getDenominator() const { return denominator; diff --git a/src/Base/UnitsApi.cpp b/src/Base/UnitsApi.cpp index 65ea8f9448..a58790e8a2 100644 --- a/src/Base/UnitsApi.cpp +++ b/src/Base/UnitsApi.cpp @@ -67,9 +67,24 @@ std::string UnitsApi::getBasicLengthUnit() return schemas->currentSchema()->getBasicLengthUnit(); } -std::size_t UnitsApi::getFractDenominator() +void UnitsApi::setDecimals(const int prec) { - return schemas->defFractDenominator(); + decimals = prec; +} + +int UnitsApi::getDecimals() +{ + return decimals < 0 ? schemas->getDecimals() : decimals; +} + +void UnitsApi::setDenominator(int frac) +{ + denominator = frac; +} + +int UnitsApi::getDenominator() +{ + return denominator < 0 ? schemas->defFractDenominator() : denominator; } std::unique_ptr UnitsApi::createSchema(const std::size_t num) @@ -121,18 +136,3 @@ std::string UnitsApi::schemaTranslate(const Quantity& quant) std::string dummy2; return schemas->currentSchema()->translate(quant, dummy1, dummy2); } - -void UnitsApi::setDecimals(const std::size_t prec) -{ - decimals = prec; -} - -size_t UnitsApi::getDecimals() -{ - return decimals; -} - -size_t UnitsApi::getDefDecimals() -{ - return schemas->getDecimals(); -} diff --git a/src/Base/UnitsApi.h b/src/Base/UnitsApi.h index bcf515ddc8..309f1d2e71 100644 --- a/src/Base/UnitsApi.h +++ b/src/Base/UnitsApi.h @@ -52,9 +52,11 @@ public: static double toDouble(PyObject* args, const Base::Unit& u = Base::Unit()); - static void setDecimals(std::size_t); - static std::size_t getDecimals(); - static std::size_t getDefDecimals(); + static void setDecimals(int); + static int getDecimals(); + + static void setDenominator(int); + static int getDenominator(); static std::vector getDescriptions(); static std::vector getNames(); @@ -64,7 +66,6 @@ public: static bool isMultiUnitAngle(); static bool isMultiUnitLength(); static std::string getBasicLengthUnit(); - static std::size_t getFractDenominator(); static std::size_t getDefSchemaNum() { @@ -76,8 +77,8 @@ public: protected: static inline auto schemas = std::make_unique(UnitsSchemasData::unitSchemasDataPack); - static inline std::size_t decimals {2}; - static inline std::size_t denominator {2}; + static inline int decimals {-1}; + static inline int denominator {-1}; // the python API wrapper methods static PyObject* sParseQuantity(PyObject* self, PyObject* args); diff --git a/src/Gui/PreferencePages/DlgSettingsGeneral.cpp b/src/Gui/PreferencePages/DlgSettingsGeneral.cpp index c668f5f38b..28571c79af 100644 --- a/src/Gui/PreferencePages/DlgSettingsGeneral.cpp +++ b/src/Gui/PreferencePages/DlgSettingsGeneral.cpp @@ -200,7 +200,7 @@ void DlgSettingsGeneral::saveUnitSystemSettings() hGrpu->SetInt("FracInch", FracInch); // Set the actual format value - QuantityFormat::setDefaultDenominator(FracInch); + UnitsApi::setDenominator(FracInch); // Set and save the Unit System if (ui->checkBox_projectUnitSystemIgnore->isChecked()) { @@ -272,7 +272,7 @@ void DlgSettingsGeneral::loadSettings() ui->checkBox_projectUnitSystemIgnore->setChecked(hGrpu->GetBool("IgnoreProjectSchema", false)); // Get the current user setting for the minimum fractional inch - FracInch = hGrpu->GetInt("FracInch", QuantityFormat::getDefaultDenominator()); + FracInch = hGrpu->GetInt("FracInch", UnitsApi::getDenominator()); // Convert fractional inch to the corresponding combobox index using this // handy little equation.