diff --git a/src/blackcore/application/applicationsettings.h b/src/blackcore/application/applicationsettings.h index e74595653..a11ad8dc0 100644 --- a/src/blackcore/application/applicationsettings.h +++ b/src/blackcore/application/applicationsettings.h @@ -33,7 +33,7 @@ namespace BlackCore static const QString &humanReadable() { static const QString name("Hotkeys"); return name; } //! \copydoc BlackMisc::TSettingTrait::isValid - static bool isValid(const BlackMisc::Input::CActionHotkeyList &value) + static bool isValid(const BlackMisc::Input::CActionHotkeyList &value, QString &) { for (const auto &actionHotkey : value) { @@ -63,7 +63,7 @@ namespace BlackCore } //! \copydoc BlackMisc::TSettingTrait::isValid - static bool isValid(const QStringList &pluginIdentifiers) + static bool isValid(const QStringList &pluginIdentifiers, QString &) { for (const QString &pluginIdentifier : pluginIdentifiers) { diff --git a/src/blackcore/vatsim/vatsimsettings.h b/src/blackcore/vatsim/vatsimsettings.h index 4b0ed0669..3f4bfb1a3 100644 --- a/src/blackcore/vatsim/vatsimsettings.h +++ b/src/blackcore/vatsim/vatsimsettings.h @@ -202,7 +202,7 @@ namespace BlackCore static const QString &humanReadable() { static const QString name("FSD message Logging"); return name; } /* //! \copydoc BlackMisc::TSettingTrait::isValid - static bool isValid(const CRawFsdMessageSettings &setting) + static bool isValid(const CRawFsdMessageSettings &setting, QString &) { if (setting.areRawFsdMessagesEnabled()) { return !setting.getFileDir().isEmpty(); } return true; diff --git a/src/blackgui/settings/guisettings.h b/src/blackgui/settings/guisettings.h index 65a2db70a..f589eb076 100644 --- a/src/blackgui/settings/guisettings.h +++ b/src/blackgui/settings/guisettings.h @@ -92,7 +92,7 @@ namespace BlackGui static const QString &humanReadable() { static const QString name("Background consolidation"); return name; } //! \copydoc BlackMisc::TSettingTrait::isValid - static bool isValid(const int &valueInSeconds) { return valueInSeconds == -1 || (valueInSeconds >= minSecs() && valueInSeconds <= maxSecs()); } + static bool isValid(const int &valueInSeconds, QString &) { return valueInSeconds == -1 || (valueInSeconds >= minSecs() && valueInSeconds <= maxSecs()); } //! \copydoc BlackMisc::TSettingTrait::defaultValue static const int &defaultValue() { static const int i = 60; return i; } diff --git a/src/blackgui/settings/viewupdatesettings.h b/src/blackgui/settings/viewupdatesettings.h index c03579115..82716ae73 100644 --- a/src/blackgui/settings/viewupdatesettings.h +++ b/src/blackgui/settings/viewupdatesettings.h @@ -106,7 +106,7 @@ namespace BlackGui static const QString &humanReadable() { static const QString name("View update"); return name; } //! \copydoc BlackMisc::TSettingTrait::isValid - static bool isValid(const CViewUpdateSettings &settings) { return settings.isValid(); } + static bool isValid(const CViewUpdateSettings &settings, QString &) { return settings.isValid(); } }; } // ns } // ns diff --git a/src/blackmisc/audio/audiosettings.h b/src/blackmisc/audio/audiosettings.h index 71fa0aa9c..4162144c8 100644 --- a/src/blackmisc/audio/audiosettings.h +++ b/src/blackmisc/audio/audiosettings.h @@ -109,7 +109,7 @@ namespace BlackMisc static const QString &humanReadable() { static const QString name("Audio"); return name; } //! \copydoc BlackMisc::TSettingTrait::isValid - static bool isValid(const BlackMisc::Audio::CSettings &value) { Q_UNUSED(value); return true; } + static bool isValid(const BlackMisc::Audio::CSettings &value, QString &) { Q_UNUSED(value); return true; } }; } // namespace } // namespace diff --git a/src/blackmisc/audio/settings/voicesettings.h b/src/blackmisc/audio/settings/voicesettings.h index aed8d3983..e044850b0 100644 --- a/src/blackmisc/audio/settings/voicesettings.h +++ b/src/blackmisc/audio/settings/voicesettings.h @@ -31,7 +31,7 @@ namespace BlackMisc static const QString &humanReadable() { static const QString name("Voice setup"); return name; } //! \copydoc BlackMisc::TSettingTrait::isValid - static bool isValid(const CVoiceSetup &setup) { return setup.validate().isSuccess(); } + static bool isValid(const CVoiceSetup &setup, QString &) { return setup.validate().isSuccess(); } }; } // ns } // ns diff --git a/src/blackmisc/datacache.h b/src/blackmisc/datacache.h index 8284bbb40..d11d7859d 100644 --- a/src/blackmisc/datacache.h +++ b/src/blackmisc/datacache.h @@ -451,7 +451,7 @@ namespace BlackMisc //! Validator function. Return true if the argument is valid, false otherwise. Default //! implementation just returns true. Reimplemented in derived class to support validation of the value. - static bool isValid(const T &) { return true; } + static bool isValid(const T &value, QString &reason) { Q_UNUSED(value); Q_UNUSED(reason); return true; } //! Return the value to use in case the supplied value does not satisfy the validator. //! Default implementation returns a default-constructed value. diff --git a/src/blackmisc/settingscache.h b/src/blackmisc/settingscache.h index 8909eb6ed..bb51fa649 100644 --- a/src/blackmisc/settingscache.h +++ b/src/blackmisc/settingscache.h @@ -144,7 +144,7 @@ namespace BlackMisc //! Validator function. Return true if the argument is valid, false otherwise. Default //! implementation just returns true. Reimplemented in derived class to support validation of the value. - static bool isValid(const T &) { return true; } + static bool isValid(const T &value, QString &reason) { Q_UNUSED(value); Q_UNUSED(reason); return true; } //! Return the value to use in case the supplied value does not satisfy the validator. //! Default implementation returns a default-constructed value. diff --git a/src/blackmisc/simulation/modelconverterx.h b/src/blackmisc/simulation/modelconverterx.h index 3a3e02628..a0d97f65e 100644 --- a/src/blackmisc/simulation/modelconverterx.h +++ b/src/blackmisc/simulation/modelconverterx.h @@ -52,7 +52,7 @@ namespace BlackMisc static const char *key() { return "mapping/modelconverterxbin"; } //! \copydoc BlackMisc::TSettingTrait::isValid - static bool isValid(const QString &value) + static bool isValid(const QString &value, QString &) { if (value.isEmpty()) { return true; } const QFile f(value); diff --git a/src/blackmisc/simulation/settings/fgswiftbussettings.h b/src/blackmisc/simulation/settings/fgswiftbussettings.h index dd75c6cec..ece0c1630 100644 --- a/src/blackmisc/simulation/settings/fgswiftbussettings.h +++ b/src/blackmisc/simulation/settings/fgswiftbussettings.h @@ -36,8 +36,8 @@ namespace BlackMisc //! \copydoc BlackMisc::TSettingTrait::defaultValue static QString defaultValue() { return "tcp:host=127.0.0.1,port=45003"; } - //! \copydoc BlackMisc::TSettingTrait::defaultValue - static bool isValid(const QString &dBusAddress) { return BlackMisc::CDBusServer::isSessionOrSystemAddress(dBusAddress) || BlackMisc::CDBusServer::isQtDBusAddress(dBusAddress); } + //! \copydoc BlackMisc::TSettingTrait::isValid + static bool isValid(const QString &dBusAddress, QString &) { return BlackMisc::CDBusServer::isSessionOrSystemAddress(dBusAddress) || BlackMisc::CDBusServer::isQtDBusAddress(dBusAddress); } }; } // ns } // ns diff --git a/src/blackmisc/simulation/settings/swiftpluginsettings.h b/src/blackmisc/simulation/settings/swiftpluginsettings.h index 7cec780ef..98537fb33 100644 --- a/src/blackmisc/simulation/settings/swiftpluginsettings.h +++ b/src/blackmisc/simulation/settings/swiftpluginsettings.h @@ -97,7 +97,7 @@ namespace BlackMisc static const QString &humanReadable() { static const QString name("swift plugin"); return name; } //! \copydoc BlackMisc::TSettingTrait::isValid - static bool isValid(const CSwiftPluginSettings &value) { return value.getEmulatedSimulator().isSingleSimulator(); } + static bool isValid(const CSwiftPluginSettings &value, QString &) { return value.getEmulatedSimulator().isSingleSimulator(); } }; } // ns } // ns diff --git a/src/blackmisc/simulation/settings/xswiftbussettings.h b/src/blackmisc/simulation/settings/xswiftbussettings.h index 68444dfb8..0959c6347 100644 --- a/src/blackmisc/simulation/settings/xswiftbussettings.h +++ b/src/blackmisc/simulation/settings/xswiftbussettings.h @@ -35,8 +35,8 @@ namespace BlackMisc //! \copydoc BlackMisc::TSettingTrait::defaultValue static QString defaultValue() { return "tcp:host=127.0.0.1,port=45001"; } - //! \copydoc BlackMisc::TSettingTrait::defaultValue - static bool isValid(const QString &dBusAddress) { return BlackMisc::CDBusServer::isSessionOrSystemAddress(dBusAddress) || BlackMisc::CDBusServer::isQtDBusAddress(dBusAddress); } + //! \copydoc BlackMisc::TSettingTrait::isValid + static bool isValid(const QString &dBusAddress, QString &) { return BlackMisc::CDBusServer::isSessionOrSystemAddress(dBusAddress) || BlackMisc::CDBusServer::isQtDBusAddress(dBusAddress); } }; } // ns } // ns diff --git a/src/blackmisc/valuecache.cpp b/src/blackmisc/valuecache.cpp index 3d578e8ea..7d894cf88 100644 --- a/src/blackmisc/valuecache.cpp +++ b/src/blackmisc/valuecache.cpp @@ -637,9 +637,11 @@ namespace BlackMisc key.replace("%OwnerClass%", QString(parent()->metaObject()->className()).replace("::", "/"), Qt::CaseInsensitive); key.replace("%OwnerName%", parent()->objectName(), Qt::CaseInsensitive); + QString unused; Q_ASSERT_X(! m_elements.contains(key), "CValuePage", "Can't have two CCached in the same object referring to the same value"); Q_ASSERT_X(defaultValue.isValid() ? defaultValue.userType() == metaType : true, "CValuePage", "Metatype mismatch for default value"); - Q_ASSERT_X(defaultValue.isValid() && validator ? validator(defaultValue) : true, "CValuePage", "Validator rejects default value"); + Q_ASSERT_X(defaultValue.isValid() && validator ? validator(defaultValue, unused) : true, "CValuePage", "Validator rejects default value"); + Q_UNUSED(unused); auto &element = *(m_elements[key] = ElementPtr(new Element(key, name, metaType, validator, defaultValue))); std::forward_as_tuple(element.m_value.uniqueWrite(), element.m_timestamp, element.m_saved) = m_cache->getValue(key); @@ -839,6 +841,7 @@ namespace BlackMisc CStatusMessage CValuePage::validate(const Element &element, const CVariant &value, CStatusMessage::StatusSeverity invalidSeverity) const { + QString reason; if (! value.isValid()) { return CStatusMessage(this, invalidSeverity, u"Empty cache value %1", true) << element.m_nameWithKey; @@ -847,9 +850,16 @@ namespace BlackMisc { return CStatusMessage(this).error(u"Expected %1 but got %2 for %3") << QMetaType::typeName(element.m_metaType) << value.typeName() << element.m_nameWithKey; } - else if (element.m_validator && ! element.m_validator(value)) + else if (element.m_validator && ! element.m_validator(value, reason)) { - return CStatusMessage(this).error(u"%1 is not valid for %2") << value.toQString() << element.m_nameWithKey; + if (reason.isEmpty()) + { + return CStatusMessage(this).error(u"%1 is not valid for %2") << value.toQString() << element.m_nameWithKey; + } + else + { + return CStatusMessage(this).error(u"%1 (%2 for %3)") << reason << value.toQString() << element.m_nameWithKey; + } } else { diff --git a/src/blackmisc/valuecache.h b/src/blackmisc/valuecache.h index 118bc5c6c..4891b24fe 100644 --- a/src/blackmisc/valuecache.h +++ b/src/blackmisc/valuecache.h @@ -444,7 +444,10 @@ namespace BlackMisc private: template - static Private::CValuePage::Validator wrap(F func) { return [func](const CVariant &value)->bool { return func(value.to()); }; } + static Private::CValuePage::Validator wrap(F func) + { + return [func](const CVariant &value, QString &reason) -> bool { return func(value.to(), reason); }; + } static Private::CValuePage::Validator wrap(std::nullptr_t) { return {}; } template diff --git a/src/blackmisc/valuecacheprivate.h b/src/blackmisc/valuecacheprivate.h index b036e6df5..05e9f3000 100644 --- a/src/blackmisc/valuecacheprivate.h +++ b/src/blackmisc/valuecacheprivate.h @@ -72,7 +72,7 @@ namespace BlackMisc struct Element; //! Functor used for validating values. - using Validator = std::function; + using Validator = std::function; //! Functor used to notify parent of changes. using NotifySlot = std::pair, void (QObject::*)()>; diff --git a/tests/blackmisc/testvaluecache/testvaluecache.cpp b/tests/blackmisc/testvaluecache/testvaluecache.cpp index 5e843650c..2f5afa509 100644 --- a/tests/blackmisc/testvaluecache/testvaluecache.cpp +++ b/tests/blackmisc/testvaluecache/testvaluecache.cpp @@ -314,7 +314,7 @@ namespace BlackMiscTest } //! Is value between 0 - 100? - bool validator(int value) + bool validator(int value, QString &) { return value >= 0 && value <= 100; }