Skip to content

Commit 5f94fd7

Browse files
committed
Correctly use defaults when adding device/connection
1 parent 2f7305f commit 5f94fd7

9 files changed

Lines changed: 140 additions & 7 deletions

src/customwidgets/deviceconfigtab.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include <QComboBox>
99
#include <QHBoxLayout>
10+
#include <QJsonArray>
1011
#include <QLabel>
1112
#include <QLineEdit>
1213
#include <QVBoxLayout>
@@ -77,7 +78,13 @@ DeviceConfigTab::DeviceConfigTab(SettingsModel* pSettingsModel,
7778
void DeviceConfigTab::onAdapterChanged(int index)
7879
{
7980
QString newAdapterId = _pAdapterCombo->itemData(index).toString();
80-
rebuildSchemaForm(newAdapterId, QJsonObject());
81+
QJsonObject defaultValues;
82+
const QJsonArray defaultDevices = _pSettingsModel->adapterData(newAdapterId)->defaults().value("devices").toArray();
83+
if (!defaultDevices.isEmpty())
84+
{
85+
defaultValues = defaultDevices.first().toObject();
86+
}
87+
rebuildSchemaForm(newAdapterId, defaultValues);
8188
}
8289

8390
void DeviceConfigTab::rebuildSchemaForm(const QString& adapterId, const QJsonObject& deviceValues)

src/dialogs/adapterconnectionsettings.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,14 @@ void AdapterConnectionSettings::buildConnectionsSection(const QJsonObject& schem
9090

9191
connect(_pConnectionTabs, &AddableTabWidget::addTabRequested, this, [this]() {
9292
auto* form = new SchemaFormWidget(_pConnectionTabs);
93-
form->setSchema(_connectionItemSchema, QJsonObject());
93+
QJsonObject defaultValues;
94+
const QJsonArray defaultConnections =
95+
_pSettingsModel->adapterData(_adapterId)->defaults().value("connections").toArray();
96+
if (!defaultConnections.isEmpty())
97+
{
98+
defaultValues = defaultConnections.first().toObject();
99+
}
100+
form->setSchema(_connectionItemSchema, defaultValues);
94101
_pConnectionTabs->addNewTab(QString("Connection %1").arg(_pConnectionTabs->count() + 1), form);
95102
});
96103

src/dialogs/adapterdevicesettings.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,17 @@ void AdapterDeviceSettings::handleAddTab()
8282
return;
8383
}
8484

85+
QJsonObject defaultValues;
86+
const QJsonArray defaultDevices =
87+
_pSettingsModel->adapterData(defaultAdapterId)->defaults().value("devices").toArray();
88+
if (!defaultDevices.isEmpty())
89+
{
90+
defaultValues = defaultDevices.first().toObject();
91+
}
92+
8593
int tabIndex = _pDeviceTabs->count() + 1;
86-
auto* tab = new DeviceConfigTab(_pSettingsModel, defaultAdapterId, QJsonObject(), _pDeviceTabs);
87-
_pDeviceTabs->addNewTab(constructTabName(QJsonObject(), tabIndex), tab);
94+
auto* tab = new DeviceConfigTab(_pSettingsModel, defaultAdapterId, defaultValues, _pDeviceTabs);
95+
_pDeviceTabs->addNewTab(constructTabName(defaultValues, tabIndex), tab);
8896
}
8997

9098
QString AdapterDeviceSettings::constructTabName(const QJsonObject& deviceValues, int tabIndex) const

tests/customwidgets/tst_deviceconfigtab.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "models/settingsmodel.h"
55

66
#include <QComboBox>
7+
#include <QJsonArray>
78
#include <QJsonObject>
89
#include <QTest>
910

@@ -97,7 +98,7 @@ void TestDeviceConfigTab::valuesReturnsDeviceFieldValues()
9798

9899
DeviceConfigTab tab(&model, "adapterA", deviceValues);
99100

100-
QCOMPARE(tab.values()["name"].toString(), QStringLiteral("Pump"));
101+
QCOMPARE(tab.values().value("name").toString(), QStringLiteral("Pump"));
101102
}
102103

103104
void TestDeviceConfigTab::adapterIdMatchesComboInitially()
@@ -138,4 +139,27 @@ void TestDeviceConfigTab::deviceNameEmptyForUnregisteredDevice()
138139
QVERIFY(tab.deviceName().isEmpty());
139140
}
140141

142+
void TestDeviceConfigTab::adapterChangeUsesDefaults()
143+
{
144+
SettingsModel model;
145+
model.updateAdapterFromDescribe("adapterA", makeAdapterDescribe("adapterA"));
146+
147+
QJsonObject describeB = makeAdapterDescribe("adapterB");
148+
QJsonObject defaultDevice;
149+
defaultDevice["name"] = "defaultName";
150+
QJsonObject defaults;
151+
defaults["devices"] = QJsonArray{ defaultDevice };
152+
describeB["defaults"] = defaults;
153+
model.updateAdapterFromDescribe("adapterB", describeB);
154+
155+
DeviceConfigTab tab(&model, "adapterA", QJsonObject());
156+
157+
auto* combo = tab.findChild<QComboBox*>(QString(), Qt::FindDirectChildrenOnly);
158+
QVERIFY(combo != nullptr);
159+
160+
combo->setCurrentIndex(combo->findData(QStringLiteral("adapterB")));
161+
162+
QCOMPARE(tab.values().value("name").toString(), QStringLiteral("defaultName"));
163+
}
164+
141165
QTEST_MAIN(TestDeviceConfigTab)

tests/customwidgets/tst_deviceconfigtab.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ private slots:
1616
void adapterIdMatchesComboInitially();
1717
void deviceNameInitializesFromDeviceModel();
1818
void deviceNameEmptyForUnregisteredDevice();
19+
void adapterChangeUsesDefaults();
1920

2021
private:
2122
//! Populate \a model with two adapters that each have a minimal device schema.

tests/dialogs/tst_adapterconnectionsettings.cpp

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,50 @@ void TestAdapterConnectionSettings::acceptValuesStoresConfigInAdapterData()
195195

196196
const AdapterData* adapter = model.adapterData("testAdapter");
197197
QCOMPARE(adapter->hasStoredConfig(), true);
198-
QCOMPARE(adapter->currentConfig()["connections"].toArray().at(0).toObject()["host"].toString(),
198+
QCOMPARE(adapter->currentConfig().value("connections").toArray().at(0).toObject().value("host").toString(),
199199
QStringLiteral("192.168.1.1"));
200200
}
201201

202+
void TestAdapterConnectionSettings::addTabUsesConnectionDefaults()
203+
{
204+
SettingsModel model;
205+
206+
QJsonObject portProp;
207+
portProp["type"] = "integer";
208+
portProp["title"] = "Port";
209+
QJsonObject itemProps;
210+
itemProps["port"] = portProp;
211+
212+
QJsonObject describe = makeDescribeResult("array", QJsonObject(), itemProps);
213+
214+
QJsonObject defaultConn;
215+
defaultConn["port"] = 502;
216+
QJsonObject defaults;
217+
defaults["connections"] = QJsonArray{ defaultConn };
218+
defaults["devices"] = QJsonArray();
219+
defaults["general"] = QJsonObject();
220+
describe["defaults"] = defaults;
221+
222+
model.updateAdapterFromDescribe("testAdapter", describe);
223+
224+
QJsonObject config;
225+
config["connections"] = QJsonArray();
226+
config["devices"] = QJsonArray();
227+
config["general"] = QJsonObject();
228+
model.setAdapterCurrentConfig("testAdapter", config);
229+
230+
AdapterConnectionSettings w(&model);
231+
232+
auto* tabs = w.findChild<AddableTabWidget*>();
233+
QVERIFY(tabs != nullptr);
234+
QCOMPARE(tabs->count(), 0);
235+
236+
emit tabs->addTabRequested();
237+
238+
QCOMPARE(tabs->count(), 1);
239+
auto* form = qobject_cast<SchemaFormWidget*>(tabs->tabContent(0));
240+
QVERIFY(form != nullptr);
241+
QCOMPARE(form->values().value("port").toInt(), 502);
242+
}
243+
202244
QTEST_MAIN(TestAdapterConnectionSettings)

tests/dialogs/tst_adapterconnectionsettings.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ private slots:
1717
void generalSectionHiddenWhenPropertiesEmpty();
1818
void generalSectionShownWhenNonEmpty();
1919
void acceptValuesStoresConfigInAdapterData();
20+
void addTabUsesConnectionDefaults();
2021
};
2122

2223
#endif // TST_ADAPTERCONNECTIONSETTINGS_H

tests/dialogs/tst_adapterdevicesettings.cpp

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ void TestAdapterDeviceSettings::missingNameFallsBackToDeviceN()
131131

132132
auto* tabs = w.findChild<AddableTabWidget*>();
133133
QVERIFY(tabs != nullptr);
134+
if (tabs == nullptr)
135+
{
136+
return;
137+
}
134138
QVERIFY(tabs->tabText(0).startsWith("Device "));
135139
}
136140

@@ -159,7 +163,7 @@ void TestAdapterDeviceSettings::acceptValuesSavesToAdapterConfig()
159163

160164
const AdapterData* adapter = model.adapterData("adapterA");
161165
QCOMPARE(adapter->hasStoredConfig(), true);
162-
QCOMPARE(adapter->currentConfig()["devices"].toArray().at(0).toObject()["id"].toInt(), 2);
166+
QCOMPARE(adapter->currentConfig().value("devices").toArray().at(0).toObject().value("id").toInt(), 2);
163167
}
164168

165169
void TestAdapterDeviceSettings::acceptValuesSavesDeviceNameToModel()
@@ -190,4 +194,42 @@ void TestAdapterDeviceSettings::acceptValuesSavesDeviceNameToModel()
190194
QCOMPARE(model.deviceSettings(1)->name(), QStringLiteral("New Name"));
191195
}
192196

197+
void TestAdapterDeviceSettings::addTabUsesDeviceDefaults()
198+
{
199+
SettingsModel model;
200+
201+
QJsonObject describe = makeAdapterDescribe("adapterA");
202+
QJsonObject defaultDevice;
203+
defaultDevice["id"] = 5;
204+
QJsonObject defaults;
205+
defaults["devices"] = QJsonArray{ defaultDevice };
206+
defaults["connections"] = QJsonArray();
207+
defaults["general"] = QJsonObject();
208+
describe["defaults"] = defaults;
209+
210+
model.updateAdapterFromDescribe("adapterA", describe);
211+
212+
QJsonObject config;
213+
config["general"] = QJsonObject();
214+
config["connections"] = QJsonArray();
215+
config["devices"] = QJsonArray();
216+
model.setAdapterCurrentConfig("adapterA", config);
217+
218+
AdapterDeviceSettings w(&model);
219+
220+
auto* tabs = w.findChild<AddableTabWidget*>();
221+
QVERIFY(tabs != nullptr);
222+
QCOMPARE(tabs->count(), 0);
223+
224+
emit tabs->addTabRequested();
225+
226+
QCOMPARE(tabs->count(), 1);
227+
auto* tab = qobject_cast<DeviceConfigTab*>(tabs->tabContent(0));
228+
QVERIFY(tab != nullptr);
229+
230+
auto* spin = tab->findChild<QSpinBox*>();
231+
QVERIFY(spin != nullptr);
232+
QCOMPARE(spin->value(), 5);
233+
}
234+
193235
QTEST_MAIN(TestAdapterDeviceSettings)

tests/dialogs/tst_adapterdevicesettings.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ private slots:
1717
void missingNameFallsBackToDeviceN();
1818
void acceptValuesSavesToAdapterConfig();
1919
void acceptValuesSavesDeviceNameToModel();
20+
void addTabUsesDeviceDefaults();
2021

2122
private:
2223
//! Populate \a model with an adapter that has a minimal device schema and

0 commit comments

Comments
 (0)