diff --git a/scwx-qt/source/scwx/qt/settings/settings_variable.cpp b/scwx-qt/source/scwx/qt/settings/settings_variable.cpp index 276c9070..1a7160f5 100644 --- a/scwx-qt/source/scwx/qt/settings/settings_variable.cpp +++ b/scwx-qt/source/scwx/qt/settings/settings_variable.cpp @@ -30,6 +30,7 @@ public: std::optional staged_ {}; std::optional minimum_ {}; std::optional maximum_ {}; + std::function transform_ {}; std::function validator_ {nullptr}; boost::unordered_flat_map @@ -79,7 +80,7 @@ bool SettingsVariable::SetValue(const T& value) if (Validate(value)) { - p->value_ = value; + p->value_ = (p->transform_ != nullptr) ? p->transform_(value) : value; validated = true; for (auto& callback : p->valueChangedCallbackFunctions_) @@ -102,7 +103,7 @@ bool SettingsVariable::SetValueOrDefault(const T& value) if (Validate(value)) { - p->value_ = value; + p->value_ = (p->transform_ != nullptr) ? p->transform_(value) : value; validated = true; } else if (p->minimum_.has_value() && value < p->minimum_) @@ -182,9 +183,11 @@ bool SettingsVariable::StageValue(const T& value) if (Validate(value)) { - if (p->value_ != value) + T transformed = (p->transform_ != nullptr) ? p->transform_(value) : value; + + if (p->value_ != transformed) { - p->staged_ = value; + p->staged_ = transformed; } else { @@ -195,7 +198,7 @@ bool SettingsVariable::StageValue(const T& value) for (auto& callback : p->valueStagedCallbackFunctions_) { - callback.second(value); + callback.second(transformed); } } @@ -285,6 +288,12 @@ std::optional SettingsVariable::GetMaximum() const return p->maximum_; } +template +void SettingsVariable::SetTransform(std::function transform) +{ + p->transform_ = transform; +} + template void SettingsVariable::SetValidator(std::function validator) { @@ -384,7 +393,7 @@ bool SettingsVariable::Equals(const SettingsVariableBase& o) const // This is only ever called with SettingsVariable, so static_cast is safe const SettingsVariable& v = static_cast&>(o); - // Don't compare validator + // Don't compare transform or validator return SettingsVariableBase::Equals(o) && // p->value_ == v.p->value_ && // p->default_ == v.p->default_ && // diff --git a/scwx-qt/source/scwx/qt/settings/settings_variable.hpp b/scwx-qt/source/scwx/qt/settings/settings_variable.hpp index bf461e8a..581ebcbe 100644 --- a/scwx-qt/source/scwx/qt/settings/settings_variable.hpp +++ b/scwx-qt/source/scwx/qt/settings/settings_variable.hpp @@ -165,6 +165,13 @@ public: */ void SetMaximum(const T& value); + /** + * Sets a custom transform function for the settings variable. + * + * @param transform Transform function + */ + void SetTransform(std::function transform); + /** * Sets a custom validator function for the settings variable. *