diff --git a/sdrbase/device/deviceuserargs.cpp b/sdrbase/device/deviceuserargs.cpp index 3310f9466..2df5367e1 100644 --- a/sdrbase/device/deviceuserargs.cpp +++ b/sdrbase/device/deviceuserargs.cpp @@ -20,6 +20,16 @@ #include "util/simpleserializer.h" #include "deviceuserargs.h" +QDataStream &operator<<(QDataStream &ds, const DeviceUserArgs::Args &inObj) +{ + ds << inObj.m_id << inObj.m_sequence << inObj.m_args; +} + +QDataStream &operator>>(QDataStream &ds, DeviceUserArgs::Args &outObj) +{ + ds >> outObj.m_id >> outObj.m_sequence >> outObj.m_args; +} + QByteArray DeviceUserArgs::serialize() const { SimpleSerializer s(1); @@ -54,30 +64,96 @@ bool DeviceUserArgs::deserialize(const QByteArray& data) } } -void DeviceUserArgs::splitDeviceKey(const QString& key, QString& id, int& sequence) +QList::iterator DeviceUserArgs::findDeviceArgs(const QString& id, int sequence) { - QStringList elms = key.split('-'); + DeviceUserArgs::Args args; + args.m_id = id; + args.m_sequence = sequence; + QList::iterator it = m_argsByDevice.begin(); - if (elms.size() > 0) { - id = elms[0]; - } - - if (elms.size() > 1) + for (; it != m_argsByDevice.end(); ++it) { - bool ok; - QString seqStr = elms[1]; - int seq = seqStr.toInt(&ok); - - if (ok) { - sequence = seq; + if (*it == args) { + return it; } } } -void DeviceUserArgs::composeDeviceKey(const QString& id, int sequence, QString& key) +void DeviceUserArgs::addDeviceArgs(const QString& id, int sequence, const QString& deviceArgs) { - QStringList strList; - strList.append(id); - strList.append(QString::number(sequence)); - key = strList.join('-'); + Args args; + args.m_id = id; + args.m_sequence = sequence; + args.m_args = deviceArgs; + + QList::iterator it = m_argsByDevice.begin(); + + for (; it != m_argsByDevice.end(); ++it) + { + if (*it == args) { + break; + } + } + + if (it == m_argsByDevice.end()) { + m_argsByDevice.push_back(args); + } +} + +void DeviceUserArgs::addOrUpdateDeviceArgs(const QString& id, int sequence, const QString& deviceArgs) +{ + Args args; + args.m_id = id; + args.m_sequence = sequence; + args.m_args = deviceArgs; + + QList::iterator it = m_argsByDevice.begin(); + + for (; it != m_argsByDevice.end(); ++it) + { + if (*it == args) + { + it->m_args = deviceArgs; + return; + } + } + + if (it == m_argsByDevice.end()) { + m_argsByDevice.push_back(args); + } +} + +void DeviceUserArgs::updateDeviceArgs(const QString& id, int sequence, const QString& deviceArgs) +{ + Args args; + args.m_id = id; + args.m_sequence = sequence; + + QList::iterator it = m_argsByDevice.begin(); + + for (; it != m_argsByDevice.end(); ++it) + { + if (*it == args) + { + it->m_args = deviceArgs; + } + } +} + +void DeviceUserArgs::deleteDeviceArgs(const QString& id, int sequence) +{ + Args args; + args.m_id = id; + args.m_sequence = sequence; + + QList::iterator it = m_argsByDevice.begin(); + + for (; it != m_argsByDevice.end(); ++it) + { + if (*it == args) + { + m_argsByDevice.erase(it); + return; + } + } } diff --git a/sdrbase/device/deviceuserargs.h b/sdrbase/device/deviceuserargs.h index 1f65d56cb..94a70800e 100644 --- a/sdrbase/device/deviceuserargs.h +++ b/sdrbase/device/deviceuserargs.h @@ -18,7 +18,7 @@ #ifndef SDRBASE_DEVICE_DEVICEUSERARGS_H_ #define SDRBASE_DEVICE_DEVICEUSERARGS_H_ -#include +#include #include #include @@ -27,13 +27,29 @@ struct DEVICES_API DeviceUserArgs { public: + struct Args { + QString m_id; + int m_sequence; + QString m_args; + + bool operator==(const Args& rhs) { //!< reference equality + return (m_id == rhs.m_id) && (m_sequence == rhs.m_sequence); + } + + friend QDataStream &operator << (QDataStream &ds, const Args &inObj); + friend QDataStream &operator >> (QDataStream &ds, Args &outObj); + }; + QByteArray serialize() const; bool deserialize(const QByteArray& data); + QList::iterator findDeviceArgs(const QString& id, int sequence); + void addDeviceArgs(const QString& id, int sequence, const QString& args); //!< Will not add if it exists for same reference + void addOrUpdateDeviceArgs(const QString& id, int sequence, const QString& args); //!< Add or update if it exists for same reference + void updateDeviceArgs(const QString& id, int sequence, const QString& args); //!< Will not update if reference does not exist + void deleteDeviceArgs(const QString& id, int sequence); + const QList& getArgsByDevice() const { return m_argsByDevice; } - static void splitDeviceKey(const QString& key, QString& id, int& sequence); - static void composeDeviceKey(const QString& id, int sequence, QString& key); - - QMap m_argsByDevice; //!< "id-sequence" to arg map. Id is hardwareId when referencing hardware device but not limited to it + QList m_argsByDevice; //!< args corresponding to a device }; diff --git a/sdrgui/gui/deviceuserargsdialog.cpp b/sdrgui/gui/deviceuserargsdialog.cpp index 75e7caa29..4992aa767 100644 --- a/sdrgui/gui/deviceuserargsdialog.cpp +++ b/sdrgui/gui/deviceuserargsdialog.cpp @@ -16,7 +16,6 @@ /////////////////////////////////////////////////////////////////////////////////// #include "device/deviceenumerator.h" -#include "device/deviceuserargs.h" #include "ui_deviceuserargsdialog.h" #include "deviceuserargsdialog.h" @@ -29,9 +28,8 @@ DeviceUserArgsDialog::DeviceUserArgsDialog( ui(new Ui::DeviceUserArgsDialog), m_deviceEnumerator(deviceEnumerator), m_hardwareDeviceUserArgs(hardwareDeviceUserArgs), - m_argsByDeviceCopy(hardwareDeviceUserArgs.m_argsByDevice) + m_deviceUserArgsCopy(hardwareDeviceUserArgs) { - qDebug("DeviceUserArgsDialog::DeviceUserArgsDialog"); ui->setupUi(this); for (int i = 0; i < m_deviceEnumerator->getNbRxSamplingDevices(); i++) { @@ -68,25 +66,24 @@ DeviceUserArgsDialog::~DeviceUserArgsDialog() void DeviceUserArgsDialog::displayArgsByDevice() { + ui->argsTree->blockSignals(true); ui->argsTree->clear(); ui->argStringEdit->clear(); - QMap::iterator it = m_argsByDeviceCopy.begin(); + QList::const_iterator it = m_deviceUserArgsCopy.getArgsByDevice().begin(); - for (; it != m_argsByDeviceCopy.end(); ++it) + for (; it != m_deviceUserArgsCopy.getArgsByDevice().end(); ++it) { - QString hardwareId; - int sequence; - DeviceUserArgs::splitDeviceKey(it.key(), hardwareId, sequence); QTreeWidgetItem *treeItem = new QTreeWidgetItem(ui->argsTree); - treeItem->setText(0, hardwareId); - treeItem->setText(1, tr("%1").arg(sequence)); - treeItem->setText(2, m_argsByDeviceCopy.value(it.value())); + treeItem->setText(0, it->m_id); + treeItem->setText(1, tr("%1").arg(it->m_sequence)); + treeItem->setText(2, it->m_args); } ui->argsTree->resizeColumnToContents(0); ui->argsTree->resizeColumnToContents(1); ui->argsTree->resizeColumnToContents(2); + ui->argsTree->blockSignals(false); } void DeviceUserArgsDialog::pushHWDeviceReference(const PluginInterface::SamplingDevice *samplingDevice) @@ -113,7 +110,7 @@ void DeviceUserArgsDialog::pushHWDeviceReference(const PluginInterface::Sampling void DeviceUserArgsDialog::accept() { - m_hardwareDeviceUserArgs.m_argsByDevice = m_argsByDeviceCopy; + m_hardwareDeviceUserArgs = m_deviceUserArgsCopy; QDialog::accept(); } @@ -126,18 +123,9 @@ void DeviceUserArgsDialog::on_importDevice_clicked(bool checked) { (void) checked; QTreeWidgetItem *deviceItem = ui->deviceTree->currentItem(); - QStringList strList; - strList.append(deviceItem->text(0)); - strList.append(deviceItem->text(1)); - QString key = strList.join('-'); - qDebug("DeviceUserArgsDialog::on_importDevice_clicked: key: %s", qPrintable(key)); - - QMap::iterator it = m_argsByDeviceCopy.find(key); - - if (it == m_argsByDeviceCopy.end()) { - m_argsByDeviceCopy[key] = ""; - } - + bool ok; + int sequence = deviceItem->text(1).toInt(&ok); + m_deviceUserArgsCopy.addDeviceArgs(deviceItem->text(0), sequence, ""); displayArgsByDevice(); } @@ -147,13 +135,21 @@ void DeviceUserArgsDialog::on_deleteArgs_clicked(bool checked) QTreeWidgetItem *deviceItem = ui->argsTree->currentItem(); bool ok; int sequence = deviceItem->text(1).toInt(&ok); - QString key; - DeviceUserArgs::composeDeviceKey(deviceItem->text(0), sequence, key); - m_argsByDeviceCopy.remove(key); + m_deviceUserArgsCopy.deleteDeviceArgs(deviceItem->text(0), sequence); displayArgsByDevice(); } -void DeviceUserArgsDialog::on_argStringEdit_returnPressed() +void DeviceUserArgsDialog::on_argsTree_currentItemChanged(QTreeWidgetItem* currentItem, QTreeWidgetItem* previousItem) { + (void) previousItem; + ui->argStringEdit->setText(currentItem->text(2)); +} +void DeviceUserArgsDialog::on_argStringEdit_editingFinished() +{ + QTreeWidgetItem *deviceItem = ui->argsTree->currentItem(); + bool ok; + int sequence = deviceItem->text(1).toInt(&ok); + m_deviceUserArgsCopy.updateDeviceArgs(deviceItem->text(0), sequence, ui->argStringEdit->text()); + displayArgsByDevice(); } \ No newline at end of file diff --git a/sdrgui/gui/deviceuserargsdialog.h b/sdrgui/gui/deviceuserargsdialog.h index 75dfe4e7a..32379f743 100644 --- a/sdrgui/gui/deviceuserargsdialog.h +++ b/sdrgui/gui/deviceuserargsdialog.h @@ -22,11 +22,11 @@ #include #include "plugin/plugininterface.h" +#include "device/deviceuserargs.h" #include "export.h" class QTreeWidgetItem; class DeviceEnumerator; -struct DeviceUserArgs; namespace Ui { class DeviceUserArgsDialog; @@ -57,7 +57,7 @@ private: DeviceEnumerator* m_deviceEnumerator; DeviceUserArgs& m_hardwareDeviceUserArgs; std::vector m_availableHWDevices; - QMap m_argsByDeviceCopy; + DeviceUserArgs m_deviceUserArgsCopy; void pushHWDeviceReference(const PluginInterface::SamplingDevice *samplingDevice); void displayArgsByDevice(); @@ -67,7 +67,8 @@ private slots: void reject(); void on_importDevice_clicked(bool checked); void on_deleteArgs_clicked(bool checked); - void on_argStringEdit_returnPressed(); + void on_argsTree_currentItemChanged(QTreeWidgetItem* currentItem, QTreeWidgetItem* previousItem); + void on_argStringEdit_editingFinished(); }; #endif // SDRGUI_GUI_DEVICEUSERARGSDIALOG_H \ No newline at end of file diff --git a/sdrgui/gui/deviceuserargsdialog.ui b/sdrgui/gui/deviceuserargsdialog.ui index 86da3f2d1..24695dc5a 100644 --- a/sdrgui/gui/deviceuserargsdialog.ui +++ b/sdrgui/gui/deviceuserargsdialog.ui @@ -51,7 +51,7 @@ - User argument string to open hardware + Arguments for hardware 0 @@ -69,6 +69,9 @@ 151 + + List of available hardware + HwID @@ -104,7 +107,7 @@ - Add the key + Add the selected hardware in the list below @@ -136,7 +139,7 @@ - Add the key + Delete arguments and remove hardware from list above @@ -155,9 +158,6 @@ 22 - - Edit value - Args @@ -166,7 +166,7 @@ - Value + Edit user arguments of hardware selected above @@ -181,6 +181,9 @@ 151 + + List of hardware with user arguments + HwID