QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
FactValueGrid.cc
Go to the documentation of this file.
1#include "FactValueGrid.h"
3#include "QGCApplication.h"
4#include "QGCCorePlugin.h"
6#include "Vehicle.h"
7
8#include <QtCore/QSettings>
9#include <QtCore/QDir>
10
11QStringList FactValueGrid::_iconNames;
12
13// Important: The indices of these strings must match the FactValueGrid::FontSize enum
14const QStringList FactValueGrid::_fontSizeNames = {
15 QT_TRANSLATE_NOOP("FactValueGrid", "Default"),
16 QT_TRANSLATE_NOOP("FactValueGrid", "Small"),
17 QT_TRANSLATE_NOOP("FactValueGrid", "Medium"),
18 QT_TRANSLATE_NOOP("FactValueGrid", "Large"),
19};
20
21QList<FactValueGrid*> FactValueGrid::_vehicleCardInstanceList;
22
24 : QQuickItem(parent)
25 , _columns (new QmlObjectListModel(this))
26{
27 if (_iconNames.isEmpty()) {
28 QDir iconDir(":/InstrumentValueIcons/");
29 _iconNames = iconDir.entryList();
30 }
31}
32
34{
35 QQuickItem::componentComplete();
36
37 connect(this, &FactValueGrid::fontSizeChanged, this, &FactValueGrid::_saveSettings);
38
40 _vehicleCardInstanceList.append(this);
41 _initForNewVehicle(_specificVehicleForCard);
42 } else {
43 // We are not tracking a specific vehicle so we need to track the active vehicle or offline editing vehicle if not active vehicle
44 auto multiVehicleManager = MultiVehicleManager::instance();
45 connect(multiVehicleManager, &MultiVehicleManager::activeVehicleChanged, this, &FactValueGrid::_activeVehicleChanged);
46 _activeVehicle = multiVehicleManager->activeVehicle();
47 if (!_activeVehicle) {
48 _activeVehicle = multiVehicleManager->offlineEditingVehicle();
49 }
50 _initForNewVehicle(_activeVehicle);
51 }
52}
53
54void FactValueGrid::_initForNewVehicle(Vehicle* vehicle)
55{
56 if (!vehicle) {
57 qCritical() << "FactValueGrid::_initForNewVehicle: vehicle is NULL";
58 return;
59 }
60
61 connect(vehicle, &Vehicle::vehicleTypeChanged, this, &FactValueGrid::_resetFromSettings);
62 _resetFromSettings();
63}
64
65void FactValueGrid::_deinitVehicle(Vehicle* vehicle)
66{
67 disconnect(vehicle, &Vehicle::vehicleTypeChanged, this, &FactValueGrid::_resetFromSettings);
68}
69
70void FactValueGrid::_activeVehicleChanged(Vehicle* activeVehicle)
71{
72 if (!_activeVehicle) {
73 qCritical() << "FactValueGrid::_activeVehicleChanged: _activeVehicle is NULL";
74 }
75
76 if (_activeVehicle) {
77 _deinitVehicle(_activeVehicle);
78 _activeVehicle = nullptr;
79 }
80
81 if (!activeVehicle) {
82 activeVehicle = MultiVehicleManager::instance()->offlineEditingVehicle();
83 }
84 _activeVehicle = activeVehicle;
85 _initForNewVehicle(activeVehicle);
86}
87
89{
90 _vehicleCardInstanceList.removeAll(this);
91}
92
97
98void FactValueGrid::resetToDefaults(void)
99{
100 QSettings settings;
101 settings.remove(_settingsGroup);
102 _resetFromSettings();
103}
104
105QString FactValueGrid::_pascalCase(const QString& text)
106{
107 return text[0].toUpper() + text.right(text.length() - 1);
108}
109
111{
112 if (fontSize != _fontSize) {
115 }
116}
117
118void FactValueGrid::_saveValueData(QSettings& settings, InstrumentValueData* value)
119{
120 settings.setValue(_textKey, value->text());
121 settings.setValue(_showUnitsKey, value->showUnits());
122 settings.setValue(_iconKey, value->icon());
123 settings.setValue(_rangeTypeKey, value->rangeType());
124
126 settings.setValue(_rangeValuesKey, value->rangeValues());
127 }
128
129 switch (value->rangeType()) {
131 break;
133 settings.setValue(_rangeColorsKey, value->rangeColors());
134 break;
136 settings.setValue(_rangeOpacitiesKey, value->rangeOpacities());
137 break;
139 settings.setValue(_rangeIconsKey, value->rangeIcons());
140 break;
141 }
142
143 settings.setValue(_factGroupNameKey, value->factGroupName());
144 settings.setValue(_factNameKey, value->factName());
145}
146
147void FactValueGrid::_loadValueData(QSettings& settings, InstrumentValueData* value)
148{
149 QString factName = settings.value(_factNameKey).toString();
150 if (!factName.isEmpty()) {
151 value->setFact(settings.value(_factGroupNameKey).toString(), factName);
152 }
153
154 value->setText (settings.value(_textKey).toString());
155 value->setShowUnits (settings.value(_showUnitsKey, true).toBool());
156 value->setIcon (settings.value(_iconKey).toString());
157 value->setRangeType (settings.value(_rangeTypeKey, InstrumentValueData::NoRangeInfo).value<InstrumentValueData::RangeType>());
158
160 value->setRangeValues(settings.value(_rangeValuesKey).value<QVariantList>());
161 }
162 switch (value->rangeType()) {
164 break;
166 value->setRangeColors(settings.value(_rangeColorsKey).value<QVariantList>());
167 break;
169 value->setRangeOpacities(settings.value(_rangeOpacitiesKey).value<QVariantList>());
170 break;
172 value->setRangeIcons(settings.value(_rangeIconsKey).value<QVariantList>());
173 break;
174 }
175}
176
177void FactValueGrid::_connectSaveSignals(InstrumentValueData* value)
178{
179 connect(value, &InstrumentValueData::factNameChanged, this, &FactValueGrid::_saveSettings);
180 connect(value, &InstrumentValueData::factGroupNameChanged, this, &FactValueGrid::_saveSettings);
181 connect(value, &InstrumentValueData::textChanged, this, &FactValueGrid::_saveSettings);
182 connect(value, &InstrumentValueData::showUnitsChanged, this, &FactValueGrid::_saveSettings);
183 connect(value, &InstrumentValueData::iconChanged, this, &FactValueGrid::_saveSettings);
184 connect(value, &InstrumentValueData::rangeTypeChanged, this, &FactValueGrid::_saveSettings);
185 connect(value, &InstrumentValueData::rangeValuesChanged, this, &FactValueGrid::_saveSettings);
186 connect(value, &InstrumentValueData::rangeColorsChanged, this, &FactValueGrid::_saveSettings);
187 connect(value, &InstrumentValueData::rangeOpacitiesChanged, this, &FactValueGrid::_saveSettings);
188 connect(value, &InstrumentValueData::rangeIconsChanged, this, &FactValueGrid::_saveSettings);
189}
190
192{
193 for (int colIndex=0; colIndex<_columns->count(); colIndex++) {
195 list->append(_createNewInstrumentValueWorker(list));
196
197 }
198 _rowCount++;
200 _saveSettings();
201}
202
204{
205 if (_rowCount <= 1) {
206 return;
207 }
208 for (int colIndex=0; colIndex<_columns->count(); colIndex++) {
210 list->removeAt(list->count() - 1)->deleteLater();
211 }
212 _rowCount--;
214 _saveSettings();
215}
216
218{
220 _columns->append(newList);
221
222 // If this is the first row then we automatically add the first column as well
223 int cRowsToAdd = qMax(_rowCount, 1);
224 for (int i=0; i<cRowsToAdd; i++) {
225 newList->append(_createNewInstrumentValueWorker(newList));
226 }
227
228 if (cRowsToAdd != _rowCount) {
229 _rowCount = cRowsToAdd;
231 }
232
233 _saveSettings();
234
235 return newList;
236}
237
239{
240 if (_columns->count() > 1) {
241 _columns->removeAt(_columns->count() - 1)->deleteLater();
242 _saveSettings();
243 }
244}
245
246InstrumentValueData* FactValueGrid::_createNewInstrumentValueWorker(QObject* parent)
247{
248 InstrumentValueData* value = new InstrumentValueData(this, parent);
249 value->setFact(InstrumentValueData::vehicleFactGroupName, "AltitudeRelative");
250 value->setText(value->fact()->shortDescription());
251 _connectSaveSignals(value);
252 return value;
253
254}
255
256void FactValueGrid::_saveSettings(void)
257{
259 return;
260 }
261
262 QSettings settings;
263 QString groupNameFormat("%1-%2");
264
265 settings.beginGroup(_settingsKey());
266 settings.remove(""); // Remove any previous settings
267
268 settings.setValue(_versionKey, 1);
269 settings.setValue(_fontSizeKey, _fontSize);
270 settings.setValue(_rowCountKey, _rowCount);
271
272 settings.beginWriteArray(_columnsKey);
273 for (int colIndex=0; colIndex<_columns->count(); colIndex++) {
275
276 settings.setArrayIndex(colIndex);
277 settings.beginWriteArray(_rowsKey);
278
279 for (int rowIndex=0; rowIndex<columns->count(); rowIndex++) {
281 settings.setArrayIndex(rowIndex);
282 _saveValueData(settings, value);
283 }
284
285 settings.endArray();
286 }
287 settings.endArray();
288
289 // If this settings change was set from a Vehicle card, this makes so the changes are
290 // immediately applied to the other Vehicle cards.
292 for (FactValueGrid* obj : _vehicleCardInstanceList) {
293 if (obj != this) {
294 obj->_resetFromSettings();
295 }
296 }
297 }
298}
299
300QString FactValueGrid::_settingsKey(void)
301{
302 return QStringLiteral("%1-%2").arg(_settingsGroup).arg(vehicleClass());
303}
304
305void FactValueGrid::_resetFromSettings(void)
306{
308
309 _columns->deleteLater();
310
311 _columns = new QmlObjectListModel(this);
312 _rowCount = 0;
313
314 QSettings settings;
315 QString groupNameFormat("%1-%2");
316
317 if (settings.childGroups().contains(_settingsKey())) {
318 // Load from settings
319 settings.beginGroup(_settingsKey());
320
321 int version = settings.value(_versionKey, 0).toInt();
322 if (version != 1) {
323 qgcApp()->showAppMessage(tr("Settings version %1 for %2 is not supported. Setup will be reset to defaults.").arg(version).arg(_settingsGroup), tr("Load Settings"));
324 settings.remove("");
325 QGCCorePlugin::instance()->factValueGridCreateDefaultSettings(this);
326 }
327 _fontSize = settings.value(_fontSizeKey, DefaultFontSize).value<FontSize>();
328
329 // Initial setup of empty items
330 int cRows = settings.value(_rowCountKey).toInt();
331 int cModelLists = settings.beginReadArray(_columnsKey);
332 if (cModelLists && cRows) {
333 appendColumn();
334 for (int rowIndex=1; rowIndex<cRows; rowIndex++) {
335 appendRow();
336 }
337 for (int colIndex=1; colIndex<cModelLists; colIndex++) {
338 appendColumn();
339 }
340 }
341
342 // Fill in the items from settings
343 for (int colIndex=0; colIndex<cModelLists; colIndex++) {
344 settings.setArrayIndex(colIndex);
345 int cItems = settings.beginReadArray(_rowsKey);
346 for (int itemIndex=0; itemIndex<cItems; itemIndex++) {
348 InstrumentValueData* value = list->value<InstrumentValueData*>(itemIndex);
349 settings.setArrayIndex(itemIndex);
350 _loadValueData(settings, value);
351 }
352 settings.endArray();
353 }
354 settings.endArray();
355 } else {
356 // Default settings are added directly to this FactValueGrid
357 QGCCorePlugin::instance()->factValueGridCreateDefaultSettings(this);
358 }
359
361
362 _preventSaveSettings = false;
363}
#define qgcApp()
void deleteLastColumn(void)
Vehicle * _activeVehicle
Vehicle * _specificVehicleForCard
void rowCountChanged(int rowCount)
QmlObjectListModel * columns(void) const
Vehicle * currentVehicle(void) const
FontSize _fontSize
void componentComplete(void) final
QmlObjectListModel * _columns
void setFontSize(FontSize fontSize)
QmlObjectListModel * appendColumn(void)
FactValueGrid(QQuickItem *parent=nullptr)
QGCMAVLink::VehicleClass_t vehicleClass(void) const
void deleteLastRow(void)
void appendRow(void)
QString _settingsGroup
QmlObjectListModel *columns MEMBER _columns NOTIFY columnsChanged(int rowCount MEMBER _rowCount NOTIFY rowCountChanged) 1(QStringList iconNames READ iconNames CONSTANT) 1(FontSize fontSize READ fontSize WRITE setFontSize NOTIFY fontSizeChanged) 1(QStringList fontSizeNames MEMBER _fontSizeNames CONSTANT) 1(QString settingsGroup MEMBER _settingsGroup NOTIFY settingsGroupChanged REQUIRED) 1(Vehicle *specificVehicleForCard MEMBER _specificVehicleForCard NOTIFY specificVehicleForCardChanged REQUIRED) 1 void resetToDefaults(void)
< null means track active vehicle, set to specific vehicle to track a single vehicle and share settin...
bool _preventSaveSettings
void fontSizeChanged(FontSize fontSize)
FontSize fontSize(void) const
static constexpr const char * vehicleFactGroupName
void setRangeOpacities(const QVariantList &rangeOpacities)
void rangeOpacitiesChanged(const QVariantList &rangeOpacities)
FactValueGrid *factValueGrid MEMBER _factValueGrid const QString & factName
QString text(void) const
void showUnitsChanged(bool showUnits)
void factGroupNameChanged(const QString &factGroup)
QVariantList rangeOpacities(void) const
void rangeTypeChanged(RangeType rangeType)
Fact * fact(void) const
void setText(const QString &text)
QVariantList rangeColors(void) const
void setRangeType(RangeType rangeType)
QVariantList rangeValues(void) const
void setIcon(const QString &icon)
RangeType rangeType(void) const
void textChanged(QString text)
bool showUnits(void) const
void rangeIconsChanged(const QVariantList &rangeIcons)
void rangeValuesChanged(const QVariantList &rangeValues)
void rangeColorsChanged(const QVariantList &rangeColors)
QString factGroupName(void) const
void setRangeColors(const QVariantList &rangeColors)
void factNameChanged(const QString &factName)
void setRangeIcons(const QVariantList &rangeIcons)
void setShowUnits(bool showUnits)
void setRangeValues(const QVariantList &rangeValues)
QString icon(void) const
QVariantList rangeIcons(void) const
void iconChanged(const QString &icon)
void activeVehicleChanged(Vehicle *activeVehicle)
void append(QObject *object)
Caller maintains responsibility for object ownership and deletion.
T value(int index) const
QObject * removeAt(int index)
int count() const override final
void vehicleTypeChanged()