You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
415 lines
12 KiB
415 lines
12 KiB
5 years ago
|
/****************************************************************************
|
||
|
*
|
||
|
* (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||
|
*
|
||
|
* QGroundControl is licensed according to the terms in the file
|
||
|
* COPYING.md in the root of the source code directory.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
|
||
|
#include "InstrumentValue.h"
|
||
|
#include "QGCApplication.h"
|
||
|
#include "QGCCorePlugin.h"
|
||
|
|
||
|
#include <QSettings>
|
||
|
|
||
|
const char* InstrumentValue::_versionKey = "version";
|
||
|
const char* InstrumentValue::_factGroupNameKey = "groupName";
|
||
|
const char* InstrumentValue::_factNameKey = "factName";
|
||
|
const char* InstrumentValue::_labelKey = "label";
|
||
|
const char* InstrumentValue::_fontSizeKey = "fontSize";
|
||
|
const char* InstrumentValue::_showUnitsKey = "showUnits";
|
||
|
const char* InstrumentValue::_iconKey = "icon";
|
||
|
const char* InstrumentValue::_iconPositionKey = "iconPosition";
|
||
|
const char* InstrumentValue::_rangeTypeKey = "rangeType";
|
||
|
const char* InstrumentValue::_rangeValuesKey = "rangeValues";
|
||
|
const char* InstrumentValue::_rangeColorsKey = "rangeColors";
|
||
|
const char* InstrumentValue::_rangeIconsKey = "rangeIcons";
|
||
|
const char* InstrumentValue::_rangeOpacitiesKey = "rangeOpacities";
|
||
|
const char* InstrumentValue::_vehicleFactGroupName = "Vehicle";
|
||
|
|
||
|
QStringList InstrumentValue::_iconNames;
|
||
|
|
||
|
// Important: The indices of these strings must match the InstrumentValue::IconPosition enumconst QStringList InstrumentValue::_iconPositionNames
|
||
|
const QStringList InstrumentValue::_iconPositionNames = {
|
||
|
QT_TRANSLATE_NOOP("InstrumentValue", "Above"),
|
||
|
QT_TRANSLATE_NOOP("InstrumentValue", "Left"),
|
||
|
};
|
||
|
|
||
|
// Important: The indices of these strings must match the InstrumentValue::FontSize enum
|
||
|
const QStringList InstrumentValue::_fontSizeNames = {
|
||
|
QT_TRANSLATE_NOOP("InstrumentValue", "Default"),
|
||
|
QT_TRANSLATE_NOOP("InstrumentValue", "Small"),
|
||
|
QT_TRANSLATE_NOOP("InstrumentValue", "Medium"),
|
||
|
QT_TRANSLATE_NOOP("InstrumentValue", "Large"),
|
||
|
};
|
||
|
|
||
|
// Important: The indices of these strings must match the InstrumentValue::RangeType enum
|
||
|
const QStringList InstrumentValue::_rangeTypeNames = {
|
||
|
QT_TRANSLATE_NOOP("InstrumentValue", "None"),
|
||
|
QT_TRANSLATE_NOOP("InstrumentValue", "Color"),
|
||
|
QT_TRANSLATE_NOOP("InstrumentValue", "Opacity"),
|
||
|
QT_TRANSLATE_NOOP("InstrumentValue", "Icon"),
|
||
|
};
|
||
|
|
||
|
InstrumentValue::InstrumentValue(Vehicle* activeVehicle, FontSize fontSize, QmlObjectListModel* rowModel)
|
||
|
: QObject (rowModel)
|
||
|
, _activeVehicle(activeVehicle)
|
||
|
, _rowModel (rowModel)
|
||
|
, _fontSize (fontSize)
|
||
|
{
|
||
|
if (_iconNames.isEmpty()) {
|
||
|
QDir iconDir(":/InstrumentValueIcons/");
|
||
|
_iconNames = iconDir.entryList();
|
||
|
}
|
||
|
|
||
|
activeVehicleChanged(_activeVehicle);
|
||
|
connect(this, &InstrumentValue::rangeTypeChanged, this, &InstrumentValue::_resetRangeInfo);
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::activeVehicleChanged(Vehicle* activeVehicle)
|
||
|
{
|
||
|
_activeVehicle = activeVehicle;
|
||
|
|
||
|
_factGroupNames.clear();
|
||
|
_factGroupNames = _activeVehicle->factGroupNames();
|
||
|
for (QString& name: _factGroupNames) {
|
||
|
name[0] = name[0].toUpper();
|
||
|
}
|
||
|
_factGroupNames.prepend(_vehicleFactGroupName);
|
||
|
emit factGroupNamesChanged(_factGroupNames);
|
||
|
|
||
|
if (_fact) {
|
||
|
_fact = nullptr;
|
||
|
|
||
|
FactGroup* factGroup = nullptr;
|
||
|
if (_factGroupName == _vehicleFactGroupName) {
|
||
|
factGroup = _activeVehicle;
|
||
|
} else {
|
||
|
factGroup = _activeVehicle->getFactGroup(_factGroupName);
|
||
|
}
|
||
|
|
||
|
if (factGroup) {
|
||
|
_fact = factGroup->getFact(_factName);
|
||
|
}
|
||
|
emit factChanged(_fact);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::setFact(const QString& factGroupName, const QString& factName)
|
||
|
{
|
||
|
if (_fact) {
|
||
|
_fact = nullptr;
|
||
|
}
|
||
|
|
||
|
FactGroup* factGroup = nullptr;
|
||
|
if (factGroupName == _vehicleFactGroupName) {
|
||
|
factGroup = _activeVehicle;
|
||
|
} else {
|
||
|
factGroup = _activeVehicle->getFactGroup(factGroupName);
|
||
|
}
|
||
|
|
||
|
_factValueNames.clear();
|
||
|
_factValueNames = factGroup->factNames();
|
||
|
for (QString& name: _factValueNames) {
|
||
|
name[0] = name[0].toUpper();
|
||
|
}
|
||
|
|
||
|
QString nonEmptyFactName;
|
||
|
if (factGroup) {
|
||
|
if (factName.isEmpty()) {
|
||
|
nonEmptyFactName = _factValueNames[0];
|
||
|
} else {
|
||
|
nonEmptyFactName = factName;
|
||
|
}
|
||
|
_fact = factGroup->getFact(nonEmptyFactName);
|
||
|
}
|
||
|
|
||
|
if (_fact) {
|
||
|
_factGroupName = factGroupName;
|
||
|
_factName = nonEmptyFactName;
|
||
|
} else {
|
||
|
_factName.clear();
|
||
|
_factGroupName.clear();
|
||
|
}
|
||
|
|
||
|
emit factChanged (_fact);
|
||
|
emit factNameChanged (_factName);
|
||
|
emit factGroupNameChanged (_factGroupName);
|
||
|
emit factValueNamesChanged (_factValueNames);
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::_setFontSize(FontSize fontSize)
|
||
|
{
|
||
|
if (fontSize != _fontSize) {
|
||
|
_fontSize = fontSize;
|
||
|
emit fontSizeChanged(fontSize);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::setFontSize(FontSize fontSize)
|
||
|
{
|
||
|
_setFontSize(fontSize);
|
||
|
|
||
|
// All other items in row must change to match
|
||
|
for (int i=0; i<_rowModel->count(); i++) {
|
||
|
InstrumentValue* instrumentValue = _rowModel->value<InstrumentValue*>(i);
|
||
|
if (instrumentValue != this) {
|
||
|
instrumentValue->_setFontSize(fontSize);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::saveToSettings(QSettings& settings) const
|
||
|
{
|
||
|
settings.setValue(_versionKey, 1);
|
||
|
settings.setValue(_labelKey, _label);
|
||
|
settings.setValue(_fontSizeKey, _fontSize);
|
||
|
settings.setValue(_showUnitsKey, _showUnits);
|
||
|
settings.setValue(_iconKey, _icon);
|
||
|
settings.setValue(_iconPositionKey, _iconPosition);
|
||
|
settings.setValue(_rangeTypeKey, _rangeType);
|
||
|
|
||
|
if (_rangeType != NoRangeInfo) {
|
||
|
settings.setValue(_rangeValuesKey, _rangeValues);
|
||
|
}
|
||
|
|
||
|
switch (_rangeType) {
|
||
|
case NoRangeInfo:
|
||
|
break;
|
||
|
case ColorRange:
|
||
|
settings.setValue(_rangeColorsKey, _rangeColors);
|
||
|
break;
|
||
|
case OpacityRange:
|
||
|
settings.setValue(_rangeOpacitiesKey, _rangeOpacities);
|
||
|
break;
|
||
|
case IconSelectRange:
|
||
|
settings.setValue(_rangeIconsKey, _rangeIcons);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (_fact) {
|
||
|
settings.setValue(_factGroupNameKey, _factGroupName);
|
||
|
settings.setValue(_factNameKey, _factName);
|
||
|
} else {
|
||
|
settings.setValue(_factGroupNameKey, "");
|
||
|
settings.setValue(_factNameKey, "");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::readFromSettings(const QSettings& settings)
|
||
|
{
|
||
|
_factGroupName = settings.value(_factGroupNameKey, QString()).toString();
|
||
|
_label = settings.value(_labelKey, QString()).toString();
|
||
|
_fontSize = settings.value(_fontSizeKey, DefaultFontSize).value<FontSize>();
|
||
|
_showUnits = settings.value(_showUnitsKey, true).toBool();
|
||
|
_icon = settings.value(_iconKey, QString()).toString();
|
||
|
_iconPosition = settings.value(_iconPositionKey, IconLeft).value<IconPosition>();
|
||
|
_rangeType = settings.value(_rangeTypeKey, NoRangeInfo).value<RangeType>();
|
||
|
|
||
|
// Do this now, since the signal will cause _resetRangeInfo to be called trashing values
|
||
|
emit rangeTypeChanged(_rangeType);
|
||
|
|
||
|
_rangeValues.clear();
|
||
|
_rangeColors.clear();
|
||
|
_rangeOpacities.clear();
|
||
|
_rangeIcons.clear();
|
||
|
if (_rangeType != NoRangeInfo) {
|
||
|
_rangeValues = settings.value(_rangeValuesKey).value<QVariantList>();
|
||
|
}
|
||
|
switch (_rangeType) {
|
||
|
case NoRangeInfo:
|
||
|
break;
|
||
|
case ColorRange:
|
||
|
_rangeColors = settings.value(_rangeColorsKey).value<QVariantList>();
|
||
|
break;
|
||
|
case OpacityRange:
|
||
|
_rangeOpacities = settings.value(_rangeOpacitiesKey).value<QVariantList>();
|
||
|
break;
|
||
|
case IconSelectRange:
|
||
|
_rangeIcons = settings.value(_rangeIconsKey).value<QVariantList>();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
QString factName = settings.value(_factNameKey).toString();
|
||
|
if (!factName.isEmpty()) {
|
||
|
setFact(_factGroupName, factName);
|
||
|
}
|
||
|
|
||
|
emit factChanged (_fact);
|
||
|
emit factGroupNameChanged (_factGroupName);
|
||
|
emit labelChanged (_label);
|
||
|
emit fontSizeChanged (_fontSize);
|
||
|
emit showUnitsChanged (_showUnits);
|
||
|
emit iconChanged (_icon);
|
||
|
emit iconPositionChanged (_iconPosition);
|
||
|
emit rangeValuesChanged (_rangeValues);
|
||
|
emit rangeColorsChanged (_rangeColors);
|
||
|
emit rangeOpacitiesChanged (_rangeOpacities);
|
||
|
emit rangeIconsChanged (_rangeIcons);
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::setLabel(const QString& label)
|
||
|
{
|
||
|
if (label != _label) {
|
||
|
_label = label;
|
||
|
emit labelChanged(label);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::setShowUnits(bool showUnits)
|
||
|
{
|
||
|
if (showUnits != _showUnits) {
|
||
|
_showUnits = showUnits;
|
||
|
emit showUnitsChanged(showUnits);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::clearFact(void)
|
||
|
{
|
||
|
_fact = nullptr;
|
||
|
_factGroupName.clear();
|
||
|
_label.clear();
|
||
|
_icon.clear();
|
||
|
_showUnits = true;
|
||
|
|
||
|
emit factChanged (_fact);
|
||
|
emit factGroupNameChanged (_factGroupName);
|
||
|
emit labelChanged (_label);
|
||
|
emit iconChanged (_icon);
|
||
|
emit showUnitsChanged (_showUnits);
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::setIcon(const QString& icon)
|
||
|
{
|
||
|
if (icon != _icon) {
|
||
|
_icon = icon;
|
||
|
emit iconChanged(_icon);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::setIconPosition(IconPosition iconPosition)
|
||
|
{
|
||
|
if (iconPosition != _iconPosition) {
|
||
|
_iconPosition = iconPosition;
|
||
|
emit iconPositionChanged(iconPosition);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::setRangeType(RangeType rangeType)
|
||
|
{
|
||
|
if (rangeType != _rangeType) {
|
||
|
_rangeType = rangeType;
|
||
|
emit rangeTypeChanged(rangeType);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::setRangeValues(const QVariantList& rangeValues)
|
||
|
{
|
||
|
_rangeValues = rangeValues;
|
||
|
emit rangeValuesChanged(rangeValues);
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::setRangeColors (const QVariantList& rangeColors)
|
||
|
{
|
||
|
_rangeColors = rangeColors;
|
||
|
emit rangeColorsChanged(rangeColors);
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::setRangeIcons(const QVariantList& rangeIcons)
|
||
|
{
|
||
|
_rangeIcons = rangeIcons;
|
||
|
emit rangeIconsChanged(rangeIcons);
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::setRangeOpacities(const QVariantList& rangeOpacities)
|
||
|
{
|
||
|
_rangeOpacities = rangeOpacities;
|
||
|
emit rangeOpacitiesChanged(rangeOpacities);
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::_resetRangeInfo(void)
|
||
|
{
|
||
|
_rangeValues.clear();
|
||
|
_rangeColors.clear();
|
||
|
_rangeOpacities.clear();
|
||
|
_rangeIcons.clear();
|
||
|
|
||
|
if (_rangeType != NoRangeInfo) {
|
||
|
_rangeValues = { 0.0, 100.0 };
|
||
|
}
|
||
|
for (int i=0; i<_rangeValues.count() + 1; i++) {
|
||
|
switch (_rangeType) {
|
||
|
case NoRangeInfo:
|
||
|
break;
|
||
|
case ColorRange:
|
||
|
_rangeColors.append(QColor("green"));
|
||
|
break;
|
||
|
case OpacityRange:
|
||
|
_rangeOpacities.append(1.0);
|
||
|
break;
|
||
|
case IconSelectRange:
|
||
|
_rangeIcons.append(_iconNames[0]);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
emit rangeValuesChanged (_rangeValues);
|
||
|
emit rangeColorsChanged (_rangeColors);
|
||
|
emit rangeOpacitiesChanged (_rangeOpacities);
|
||
|
emit rangeIconsChanged (_rangeIcons);
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::addRangeValue(void)
|
||
|
{
|
||
|
_rangeValues.append(_rangeValues.last().toDouble() + 1);
|
||
|
|
||
|
switch (_rangeType) {
|
||
|
case NoRangeInfo:
|
||
|
break;
|
||
|
case ColorRange:
|
||
|
_rangeColors.append(QColor("green"));
|
||
|
break;
|
||
|
case OpacityRange:
|
||
|
_rangeOpacities.append(1.0);
|
||
|
break;
|
||
|
case IconSelectRange:
|
||
|
_rangeIcons.append(_iconNames[0]);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
emit rangeValuesChanged (_rangeValues);
|
||
|
emit rangeColorsChanged (_rangeColors);
|
||
|
emit rangeOpacitiesChanged (_rangeOpacities);
|
||
|
emit rangeIconsChanged (_rangeIcons);
|
||
|
}
|
||
|
|
||
|
void InstrumentValue::removeRangeValue(int index)
|
||
|
{
|
||
|
if (_rangeValues.count() < 2 || index <0 || index >= _rangeValues.count()) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
_rangeValues.removeAt(index);
|
||
|
|
||
|
switch (_rangeType) {
|
||
|
case NoRangeInfo:
|
||
|
break;
|
||
|
case ColorRange:
|
||
|
_rangeColors.removeAt(index + 1);
|
||
|
break;
|
||
|
case OpacityRange:
|
||
|
_rangeOpacities.removeAt(index + 1);
|
||
|
break;
|
||
|
case IconSelectRange:
|
||
|
_rangeIcons.removeAt(index + 1);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
emit rangeValuesChanged (_rangeValues);
|
||
|
emit rangeColorsChanged (_rangeColors);
|
||
|
emit rangeOpacitiesChanged (_rangeOpacities);
|
||
|
emit rangeIconsChanged (_rangeIcons);
|
||
|
}
|