16 setMetaData(metaData);
24 , _componentId(componentId)
30 setMetaData(metaData);
35Fact::Fact(
const QString& settingsGroup,
FactMetaData *metaData, QObject *parent)
37 , _name(metaData->name())
39 , _type(metaData->type())
44 SettingsManager::adjustSettingMetaData(settingsGroup, *metaData, visible);
45 setMetaData(metaData,
true );
47 if (!
qgcApp()->runningUnitTests()) {
51 QMutexLocker<QRecursiveMutex> locker(&_rawValueMutex);
52 _rawValue = defaultValue;
59Fact::Fact(
const Fact &other, QObject *parent)
79const Fact &Fact::operator=(
const Fact& other)
104void Fact::forceSetRawValue(
const QVariant &value)
127void Fact::setRawValue(
const QVariant &value)
134 bool changed =
false;
156void Fact::setCookedValue(
const QVariant& value)
165int Fact::valueIndex(
const QString &value)
const
174void Fact::setEnumStringValue(
const QString &value)
176 const int index = valueIndex(value);
182void Fact::setEnumIndex(
int index)
191void Fact::containerSetRawValue(
const QVariant &value)
194 QVariant currentRaw = value;
195 bool changed =
false;
219QVariant Fact::cookedValue()
const
230QString Fact::enumStringValue()
233 const int enumIndex = this->enumIndex();
234 if ((enumIndex >= 0) && (enumIndex < _metaData->enumStrings().count())) {
250 for (
const QVariant &enumValue:
_metaData->enumValues()) {
251 if (enumValue == rawValue()) {
256 const double diff = fabs(enumValue.toDouble() - rawValue().toDouble());
257 static constexpr double accuracy = 1.0 / 1000000.0;
258 if (diff < accuracy) {
275QStringList Fact::enumStrings()
const
281 return QStringList();
285QVariantList Fact::enumValues()
const
291 return QVariantList();
295void Fact::setEnumInfo(
const QStringList &strings,
const QVariantList &values)
305QStringList Fact::bitmaskStrings()
const
311 return QStringList();
315QVariantList Fact::bitmaskValues()
const
321 return QVariantList();
325QStringList Fact::selectedBitmaskStrings()
const
330 if (values.size() != strings.size()) {
331 qCWarning(FactLog) <<
"Size of bitmask value and string is different." << name();
335 QStringList selected;
336 for (qsizetype i = 0; i < values.size(); i++) {
337 if (rawValue().toInt() & values[i].toInt()) {
338 selected += strings[i];
342 if (selected.isEmpty()) {
343 selected +=
"Not value selected";
357 const auto stripNegativeZero = [](QString &candidate) {
358 static const QRegularExpression reNegativeZero(QStringLiteral(
"^-0\\.0+$"));
359 const auto match = reNegativeZero.match(candidate);
360 if (match.hasMatch() || candidate == QStringLiteral(
"-0")) {
361 candidate = candidate.mid(1);
368 const float fValue = variant.toFloat();
369 if (qIsNaN(fValue)) {
370 valueString = invalidValueString(decimalPlaces);
372 valueString = QStringLiteral(
"%1").arg(fValue, 0,
'f', decimalPlaces);
373 stripNegativeZero(valueString);
379 const double dValue = variant.toDouble();
380 if (qIsNaN(dValue)) {
381 valueString = invalidValueString(decimalPlaces);
383 valueString = QStringLiteral(
"%1").arg(dValue, 0,
'f', decimalPlaces);
384 stripNegativeZero(valueString);
389 valueString = variant.toBool() ? tr(
"true") : tr(
"false");
393 const double dValue = variant.toDouble();
394 if (qIsNaN(dValue)) {
395 valueString = invalidValueString(decimalPlaces);
397 QTime time(0, 0, 0, 0);
398 time = time.addSecs(dValue);
399 valueString = time.toString(QStringLiteral(
"hh:mm:ss"));
404 valueString = variant.toString();
411QString Fact::invalidValueString(
int decimalPlaces)
const {
415 if (decimalPlaces <= 0) {
416 return QStringLiteral(
"–");
418 return QStringLiteral(
"–.") +
419 QString(decimalPlaces, QChar(u
'–'));
421 return QStringLiteral(
"––:––:––");
423 return QStringLiteral(
"–");
427QString Fact::rawValueStringFullPrecision()
const
432QString Fact::rawValueString()
const
437QString Fact::cookedValueString()
const
442QVariant Fact::rawDefaultValue()
const
446 qCDebug(FactLog) <<
"Access to unavailable default value";
455QVariant Fact::cookedDefaultValue()
const
459 qCDebug(FactLog) <<
"Access to unavailable default value";
468QString Fact::cookedDefaultValueString()
const
473QString Fact::shortDescription()
const
483QString Fact::longDescription()
const
493QString Fact::rawUnits()
const
503QString Fact::cookedUnits()
const
513QVariant Fact::rawMin()
const
523QVariant Fact::cookedMin()
const
533QVariant Fact::rawUserMin()
const
543QVariant Fact::cookedUserMin()
const
553QString Fact::cookedMinString()
const
558QString Fact::cookedUserMinString()
const
563QVariant Fact::rawMax()
const
573QVariant Fact::cookedMax()
const
583QVariant Fact::rawUserMax()
const
593QVariant Fact::cookedUserMax()
const
603QString Fact::cookedMaxString()
const
608QString Fact::cookedUserMaxString()
const
613bool Fact::minIsDefaultForType()
const
623bool Fact::maxIsDefaultForType()
const
633int Fact::decimalPlaces()
const
643QString Fact::category()
const
653QString Fact::group()
const
663void Fact::setMetaData(
FactMetaData *metaData,
bool setDefaultFromMetaData)
667 setRawValue(rawDefaultValue());
672bool Fact::valueEqualsDefault()
const
686bool Fact::defaultValueAvailable()
const
696QString Fact::validate(
const QString &cookedValue,
bool convertOnly)
707 return QStringLiteral(
"Internal error: Meta data pointer missing");
711QVariant Fact::clamp(
const QString &cookedValue)
727bool Fact::vehicleRebootRequired()
const
737bool Fact::qgcRebootRequired()
const
747void Fact::setSendValueChangedSignals(
bool sendValueChangedSignals)
765void Fact::sendDeferredValueChangedSignal()
773QString Fact::enumOrValueString()
777 return enumStringValue();
779 return cookedValueString();
787double Fact::rawIncrement()
const
794 return std::numeric_limits<double>::quiet_NaN();
797double Fact::cookedIncrement()
const
804 return std::numeric_limits<double>::quiet_NaN();
807bool Fact::hasControl()
const
817bool Fact::readOnly()
const
827bool Fact::writeOnly()
const
837bool Fact::volatileValue()
const
856void Fact::_checkForRebootMessaging()
859 if (!
qgcApp()->runningUnitTests()) {
860 if (vehicleRebootRequired()) {
861 qgcApp()->showRebootAppMessage(tr(
"Reboot vehicle for changes to take effect."));
862 }
else if (qgcRebootRequired()) {
863 qgcApp()->showRebootAppMessage(tr(
"Restart application for changes to take effect."));
#define QGC_LOGGING_CATEGORY(name, categoryStr)
Provides a list model of values for incrementing/decrementing the value of a Fact.
A Fact is used to hold a single value within the system.
bool _sendValueChangedSignals
bool _deferredValueChangeSignal
void sendValueChangedSignalsChanged(bool sendValueChangedSignals)
FactMetaData::ValueType_t _type
void rawValueChanged(const QVariant &value)
QRecursiveMutex _rawValueMutex
static constexpr const char * kMissingMetadata
void containerRawValueChanged(const QVariant &value)
This signal is meant for use by Fact container implementations. Used to send changed values to vehicl...
QString _variantToString(const QVariant &variant, int decimalPlaces) const
FactValueSliderListModel * _valueSliderModel
void _sendValueChangedSignal(const QVariant &value)
void vehicleUpdated(const QVariant &value)
Signalled when the param write ack comes back from the vehicle.
void valueChanged(const QVariant &value)
This signal is only meant for use by the QT property system. It should not be connected to by client ...