Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion src/customwidgets/deviceconfigtab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ DeviceConfigTab::DeviceConfigTab(SettingsModel* pSettingsModel,
_pNameEdit(new QLineEdit(this)),
_pAdapterCombo(new QComboBox(this)),
_pSchemaForm(nullptr),
_pSettingsModel(pSettingsModel)
_pSettingsModel(pSettingsModel),
_deviceId(deviceValues.value("id").toInt(-1))
{
_pLayout = new QVBoxLayout(this);
setLayout(_pLayout);
Expand Down Expand Up @@ -84,6 +85,17 @@ void DeviceConfigTab::onAdapterChanged(int index)
{
defaultValues = defaultDevices.first().toObject();
}

// Preserve the existing device id so that switching adapters does not overwrite
// the unique id assigned when the tab was created. Fall back to _deviceId when
// the id field is hidden in the schema form and not returned by values().
int currentId = _pSchemaForm ? _pSchemaForm->values().value("id").toInt(-1) : -1;
if (currentId < 0)
{
currentId = _deviceId;
}
defaultValues["id"] = currentId;

rebuildSchemaForm(newAdapterId, defaultValues);
}

Expand Down
1 change: 1 addition & 0 deletions src/customwidgets/deviceconfigtab.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ private slots:
QComboBox* _pAdapterCombo;
SchemaFormWidget* _pSchemaForm;
SettingsModel* _pSettingsModel;
int _deviceId;
};

#endif // DEVICECONFIGTAB_H
10 changes: 10 additions & 0 deletions src/dialogs/adapterdevicesettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@ AdapterDeviceSettings::AdapterDeviceSettings(SettingsModel* pSettingsModel, QWid
}
}

/*! \brief Add a new device tab with a unique, auto-incremented device ID.
*
* Creates a SettingsModel device via addNewDevice() to obtain a unique ID,
* sets its adapter, then opens a new DeviceConfigTab pre-populated with
* the adapter's default values and the assigned ID.
*/
void AdapterDeviceSettings::handleAddTab()
{
QString defaultAdapterId;
Expand Down Expand Up @@ -90,6 +96,10 @@ void AdapterDeviceSettings::handleAddTab()
defaultValues = defaultDevices.first().toObject();
}

deviceId_t newId = _pSettingsModel->addNewDevice();
_pSettingsModel->deviceSettings(newId)->setAdapterId(defaultAdapterId);
defaultValues["id"] = static_cast<int>(newId);

int tabIndex = _pDeviceTabs->count() + 1;
auto* tab = new DeviceConfigTab(_pSettingsModel, defaultAdapterId, defaultValues, _pDeviceTabs);
_pDeviceTabs->addNewTab(constructTabName(defaultValues, tabIndex), tab);
Expand Down
76 changes: 75 additions & 1 deletion tests/dialogs/tst_adapterdevicesettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "dialogs/adapterdevicesettings.h"
#include "models/settingsmodel.h"

#include <QComboBox>
#include <QJsonArray>
#include <QJsonObject>
#include <QLabel>
Expand Down Expand Up @@ -229,7 +230,80 @@ void TestAdapterDeviceSettings::addTabUsesDeviceDefaults()

auto* spin = tab->findChild<QSpinBox*>();
QVERIFY(spin != nullptr);
QCOMPARE(spin->value(), 5);
// The adapter default id (5) must be overridden with a unique SettingsModel id.
const int assignedId = spin->value();
QVERIFY(assignedId != 5);
QVERIFY(model.hasDevice(static_cast<deviceId_t>(assignedId)));
QCOMPARE(model.deviceSettings(static_cast<deviceId_t>(assignedId))->adapterId(), QStringLiteral("adapterA"));
}

void TestAdapterDeviceSettings::addTabIncrementsDeviceId()
{
SettingsModel model;
setupAdapter(model, "adapterA", QJsonArray());

AdapterDeviceSettings w(&model);

auto* tabs = w.findChild<AddableTabWidget*>();
QVERIFY(tabs != nullptr);
QCOMPARE(tabs->count(), 0);

emit tabs->addTabRequested();
emit tabs->addTabRequested();

QCOMPARE(tabs->count(), 2);

auto* tab0 = qobject_cast<DeviceConfigTab*>(tabs->tabContent(0));
auto* tab1 = qobject_cast<DeviceConfigTab*>(tabs->tabContent(1));
QVERIFY(tab0 != nullptr);
QVERIFY(tab1 != nullptr);

const int id0 = tab0->values().value("id").toInt(-1);
const int id1 = tab1->values().value("id").toInt(-1);

QVERIFY(id0 >= 1);
QVERIFY(id1 > id0);

// Both ids must be present in the SettingsModel and linked to the adapter.
QVERIFY(model.hasDevice(static_cast<deviceId_t>(id0)));
QVERIFY(model.hasDevice(static_cast<deviceId_t>(id1)));
QCOMPARE(model.deviceSettings(static_cast<deviceId_t>(id0))->adapterId(), QStringLiteral("adapterA"));
QCOMPARE(model.deviceSettings(static_cast<deviceId_t>(id1))->adapterId(), QStringLiteral("adapterA"));
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}

void TestAdapterDeviceSettings::deviceIdPreservedWhenAdapterChanged()
{
SettingsModel model;
setupAdapter(model, "adapterA", QJsonArray());
setupAdapter(model, "adapterB", QJsonArray());

AdapterDeviceSettings w(&model);

auto* tabs = w.findChild<AddableTabWidget*>();
QVERIFY(tabs != nullptr);

emit tabs->addTabRequested();

QCOMPARE(tabs->count(), 1);
auto* tab = qobject_cast<DeviceConfigTab*>(tabs->tabContent(0));
QVERIFY(tab != nullptr);

const int originalId = tab->values().value("id").toInt(-1);
QVERIFY(originalId >= 1);

// Trigger DeviceConfigTab::onAdapterChanged by switching the adapter combo
auto* adapterCombo = tab->findChild<QComboBox*>();
QVERIFY(adapterCombo != nullptr);
int adapterBIdx = adapterCombo->findData(QStringLiteral("adapterB"));
QVERIFY(adapterBIdx >= 0);
adapterCombo->setCurrentIndex(adapterBIdx);

// The device ID must be preserved across the adapter switch
QCOMPARE(tab->values().value("id").toInt(-1), originalId);
// The device must still exist in the model
QVERIFY(model.hasDevice(static_cast<deviceId_t>(originalId)));
// The tab must now report the new adapter
QCOMPARE(tab->adapterId(), QStringLiteral("adapterB"));
}

QTEST_MAIN(TestAdapterDeviceSettings)
2 changes: 2 additions & 0 deletions tests/dialogs/tst_adapterdevicesettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ private slots:
void acceptValuesSavesToAdapterConfig();
void acceptValuesSavesDeviceNameToModel();
void addTabUsesDeviceDefaults();
void addTabIncrementsDeviceId();
void deviceIdPreservedWhenAdapterChanged();

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