Skip to content

Commit 448f410

Browse files
iio-widgets: Add empty data strategy
Signed-off-by: Andrei-Fabian-Pop <[email protected]>
1 parent fb84036 commit 448f410

File tree

13 files changed

+185
-84
lines changed

13 files changed

+185
-84
lines changed

gr-util/src/grdeviceaddon.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,14 @@ QWidget *GRDeviceAddon::createAttrMenu(QWidget *parent)
2727
MenuSectionWidget *attrContainer = new MenuSectionWidget(parent);
2828
MenuCollapseSection *attr =
2929
new MenuCollapseSection("ATTRIBUTES", MenuCollapseSection::MHCW_NONE, attrContainer);
30-
QList<IIOWidget *> attrWidgets = IIOWidgetBuilder().device(m_src->iioDev()).parent(parent).buildAll();
30+
QList<IIOWidget *> attrWidgets = IIOWidgetBuilder(parent).device(m_src->iioDev()).buildAll();
3131
const struct iio_context *ctx = iio_device_get_context(m_src->iioDev());
32-
attrWidgets.append(IIOWidgetBuilder()
32+
attrWidgets.append(IIOWidgetBuilder(parent)
3333
.context(const_cast<iio_context *>(ctx))
3434
.device(m_src->iioDev())
3535
.attribute("Triggers")
3636
.uiStrategy(IIOWidgetBuilder::UIS::ComboUi)
3737
.dataStrategy(IIOWidgetBuilder::DS::TriggerData)
38-
.parent(parent)
3938
.buildSingle());
4039

4140
auto layout = new QVBoxLayout();

gr-util/src/grtimechanneladdon.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ QWidget *GRTimeChannelAddon::createAttrMenu(QWidget *parent)
193193
MenuSectionWidget *attrcontainer = new MenuSectionWidget(parent);
194194
MenuCollapseSection *attr =
195195
new MenuCollapseSection("ATTRIBUTES", MenuCollapseSection::MHCW_NONE, attrcontainer);
196-
QList<IIOWidget *> attrWidgets = IIOWidgetBuilder().channel(grch()->channel()).parent(parent).buildAll();
196+
QList<IIOWidget *> attrWidgets = IIOWidgetBuilder(parent).channel(grch()->channel()).buildAll();
197197

198198
auto layout = new QVBoxLayout();
199199
layout->setSpacing(10);
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#ifndef EMPTYDATASTRATEGY_H
2+
#define EMPTYDATASTRATEGY_H
3+
4+
#include <QObject>
5+
#include "datastrategy/datastrategyinterface.h"
6+
#include "scopy-iio-widgets_export.h"
7+
8+
namespace scopy {
9+
class SCOPY_IIO_WIDGETS_EXPORT EmptyDataStrategy : public QObject, public DataStrategyInterface
10+
{
11+
Q_OBJECT
12+
Q_INTERFACES(scopy::DataStrategyInterface)
13+
public:
14+
explicit EmptyDataStrategy(QObject *parent = nullptr);
15+
16+
QString data() override;
17+
QString optionalData() override;
18+
19+
public Q_SLOTS:
20+
int write(QString data) override;
21+
QPair<QString, QString> read() override;
22+
void writeAsync(QString data) override;
23+
void readAsync() override;
24+
25+
Q_SIGNALS:
26+
void sendData(QString data, QString dataOptions) override;
27+
void aboutToWrite(QString oldData, QString newData) override;
28+
void emitStatus(QDateTime timestamp, QString oldData, QString newData, int returnCode, bool isReadOp) override;
29+
30+
private:
31+
QString m_data;
32+
QString m_previousData;
33+
};
34+
} // namespace scopy
35+
36+
#endif // EMPTYDATASTRATEGY_H

iio-widgets/include/iio-widgets/iioconfigurationpopup.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class SCOPY_IIO_WIDGETS_EXPORT IIOConfigurationPopup : public QWidget
2525

2626
Q_SIGNALS:
2727
void selectButtonClicked(IIOItem *selected);
28+
void emptyButtonClicked();
2829
void exitButtonClicked();
2930

3031
protected Q_SLOTS:
@@ -39,6 +40,7 @@ protected Q_SLOTS:
3940
IIOWidgetSelector *m_widgetSelector;
4041
QPushButton *m_exitButton;
4142
QPushButton *m_selectButton;
43+
QPushButton *m_emptyButton;
4244
IIOItem *m_root;
4345
};
4446
} // namespace scopy

iio-widgets/include/iio-widgets/iiowidget.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,19 +232,19 @@ protected Q_SLOTS:
232232
void setLastOperationTimestamp(QDateTime timestamp);
233233
void setLastOperationState(IIOWidget::State state);
234234

235-
// Core variables
235+
/* Core variables */
236236
GuiStrategyInterface *m_uiStrategy;
237237
DataStrategyInterface *m_dataStrategy;
238238
IIOWidgetFactoryRecipe m_recipe;
239239

240-
// Logged data
240+
/* Logged data */
241241
QString m_lastData;
242242
SmallProgressBar *m_progressBar;
243243
QDateTime *m_lastOpTimestamp;
244244
int m_lastReturnCode;
245245
IIOWidget::State *m_lastOpState;
246246

247-
// Optional configuration
247+
/* Optional configuration */
248248
QPushButton *m_configBtn;
249249
IIOConfigurationPopup *m_configPopup;
250250
bool m_isConfigurable;

iio-widgets/include/iio-widgets/iiowidgetbuilder.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class SCOPY_IIO_WIDGETS_EXPORT IIOWidgetBuilder : public QObject
4242
TriggerData,
4343
DeviceAttrData,
4444
ContextAttrData,
45+
EmptyData,
4546
};
4647

4748
enum UIS
@@ -53,7 +54,7 @@ class SCOPY_IIO_WIDGETS_EXPORT IIOWidgetBuilder : public QObject
5354
RangeUi,
5455
};
5556

56-
explicit IIOWidgetBuilder(QObject *parent = nullptr);
57+
explicit IIOWidgetBuilder(QWidget *parent = nullptr);
5758
~IIOWidgetBuilder();
5859

5960
/**
@@ -101,6 +102,13 @@ class SCOPY_IIO_WIDGETS_EXPORT IIOWidgetBuilder : public QObject
101102
*/
102103
IIOWidgetBuilder &configMode(bool isConfigurable);
103104

105+
/**
106+
* @brief title Sets the title of the IIOWidget
107+
* @param title QString
108+
* @return
109+
*/
110+
IIOWidgetBuilder &title(QString title);
111+
104112
/**
105113
* @brief Sets the context that will be used, if no iio_device or iio_channel
106114
* is set, the build functions will work with the context.
@@ -160,12 +168,6 @@ class SCOPY_IIO_WIDGETS_EXPORT IIOWidgetBuilder : public QObject
160168
*/
161169
IIOWidgetBuilder &uiStrategy(IIOWidgetBuilder::UIS uiStrategy);
162170

163-
/**
164-
* @brief Sets the parent of the IIOWidget that will be built.
165-
* @param parent
166-
*/
167-
IIOWidgetBuilder &parent(QWidget *parent);
168-
169171
private:
170172
DataStrategyInterface *createDS();
171173
GuiStrategyInterface *createUIS();
@@ -179,6 +181,7 @@ class SCOPY_IIO_WIDGETS_EXPORT IIOWidgetBuilder : public QObject
179181
QString m_attribute;
180182
QString m_optionsAttribute;
181183
QString m_optionsValues;
184+
QString m_title;
182185
IIOWidgetBuilder::DS m_dataStrategy;
183186
IIOWidgetBuilder::UIS m_uiStrategy;
184187
QWidget *m_widgetParent;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include "emptydatastrategy.h"
2+
3+
using namespace scopy;
4+
5+
EmptyDataStrategy::EmptyDataStrategy(QObject *parent)
6+
: QObject{parent}
7+
, m_data("")
8+
, m_previousData("")
9+
{}
10+
11+
QString EmptyDataStrategy::data() { return m_data; }
12+
13+
QString EmptyDataStrategy::optionalData() { return ""; }
14+
15+
int EmptyDataStrategy::write(QString data)
16+
{
17+
m_previousData = data;
18+
m_data = data;
19+
return 0;
20+
}
21+
22+
QPair<QString, QString> EmptyDataStrategy::read() { return {m_data, ""}; }
23+
24+
void EmptyDataStrategy::writeAsync(QString data)
25+
{
26+
int res = write(data);
27+
Q_EMIT emitStatus(QDateTime::currentDateTime(), m_data, data, (int)(res), false);
28+
readAsync();
29+
}
30+
31+
void EmptyDataStrategy::readAsync()
32+
{
33+
QPair<QString, QString> res = read();
34+
Q_EMIT emitStatus(QDateTime::currentDateTime(), m_previousData, m_data, 0, true);
35+
Q_EMIT sendData(res.first, res.second);
36+
}
37+
38+
#include "moc_emptydatastrategy.cpp"

iio-widgets/src/iioconfigurationpopup.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ void IIOConfigurationPopup::init()
134134

135135
Q_EMIT selectButtonClicked(iioItem);
136136
});
137+
QObject::connect(m_emptyButton, &QPushButton::clicked, this, &IIOConfigurationPopup::emptyButtonClicked);
137138
QObject::connect(m_exitButton, &QPushButton::clicked, this, &IIOConfigurationPopup::exitButtonClicked);
138139
m_selectButton->setDisabled(true);
139140
}
@@ -161,12 +162,11 @@ void IIOConfigurationPopup::initUI()
161162
buttonGroupLayout->setSpacing(10);
162163

163164
m_selectButton = new QPushButton("Select", buttonGroup);
164-
m_selectButton->setObjectName("selectButton");
165-
165+
m_emptyButton = new QPushButton("No Data", buttonGroup);
166166
m_exitButton = new QPushButton("Exit", buttonGroup);
167-
m_exitButton->setObjectName("exitButton");
168167

169168
buttonGroupLayout->addWidget(m_exitButton);
169+
buttonGroupLayout->addWidget(m_emptyButton);
170170
buttonGroupLayout->addWidget(m_selectButton);
171171

172172
backgroundLayout->addWidget(m_titleLabel);
@@ -175,9 +175,10 @@ void IIOConfigurationPopup::initUI()
175175

176176
backgroundWidget->setLayout(backgroundLayout);
177177

178-
StyleHelper::TutorialChapterTitleLabel(m_titleLabel, "titleLabel");
179-
StyleHelper::BlueButton(m_selectButton, "selectButton");
180-
StyleHelper::BlueButton(m_exitButton, "exitButton");
178+
StyleHelper::TutorialChapterTitleLabel(m_titleLabel, "TitleLabel");
179+
StyleHelper::BlueButton(m_selectButton, "SelectButton");
180+
StyleHelper::BlueButton(m_emptyButton, "EmptyButton");
181+
StyleHelper::BlueButton(m_exitButton, "ExitButton");
181182
StyleHelper::OverlayMenu(this, "IIOConfigurationPopupOverlay");
182183
}
183184

iio-widgets/src/iiowidget.cpp

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,18 @@
1919
*/
2020

2121
#include "iiowidget.h"
22-
#include "channelattrdatastrategy.h"
23-
#include "contextattrdatastrategy.h"
24-
#include "deviceattrdatastrategy.h"
25-
#include "iiowidgetselector.h"
22+
#include "datastrategy/channelattrdatastrategy.h"
23+
#include "datastrategy/contextattrdatastrategy.h"
24+
#include "datastrategy/deviceattrdatastrategy.h"
25+
#include "datastrategy/emptydatastrategy.h"
26+
2627
#include <iioutil/connectionprovider.h>
27-
#include <QDateTime>
28-
#include <QApplication>
2928
#include <pluginbase/preferences.h>
3029
#include <gui/utils.h>
3130

31+
#include <QDateTime>
32+
#include <QApplication>
33+
3234
using namespace scopy;
3335

3436
Q_LOGGING_CATEGORY(CAT_IIOWIDGET, "iioWidget")
@@ -44,41 +46,61 @@ IIOWidget::IIOWidget(GuiStrategyInterface *uiStrategy, DataStrategyInterface *da
4446
, m_lastReturnCode(0)
4547
, m_isConfigurable(false)
4648
{
49+
// Config button
50+
m_configBtn->setStyleSheet("border-image: url(\":/gui/icons/scopy-default/icons/gear_wheel.svg\");");
51+
m_configBtn->setVisible(m_isConfigurable);
52+
53+
// General layout
4754
setLayout(new QVBoxLayout(this));
4855
layout()->setContentsMargins(0, 0, 0, 0);
4956
layout()->setSpacing(0);
5057
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
5158

59+
QWidget *topWidget = new QWidget(this);
60+
topWidget->setLayout(new QHBoxLayout(topWidget));
61+
topWidget->layout()->setContentsMargins(0, 0, 0, 0);
62+
5263
QWidget *ui = m_uiStrategy->ui();
5364
if(ui) {
54-
layout()->addWidget(ui);
65+
topWidget->layout()->addWidget(ui);
5566
}
67+
topWidget->layout()->addWidget(m_configBtn);
68+
69+
layout()->addWidget(topWidget);
5670
layout()->addWidget(m_progressBar);
5771

58-
QObject *uiStrategyObject = dynamic_cast<QObject *>(m_uiStrategy);
59-
QObject *dataStrategyObject = dynamic_cast<QObject *>(m_dataStrategy);
72+
QObject *uiStrategyWidget = dynamic_cast<QObject *>(m_uiStrategy);
73+
QObject *dataStrategyWidget = dynamic_cast<QObject *>(m_dataStrategy);
6074

61-
uiStrategyObject->setParent(this);
62-
dataStrategyObject->setParent(this);
75+
uiStrategyWidget->setParent(this);
76+
dataStrategyWidget->setParent(this);
6377

78+
connect(m_configBtn, &QPushButton::clicked, this, &IIOWidget::reconfigure);
6479
connect(m_progressBar, &SmallProgressBar::progressFinished, this, [this]() { this->saveData(m_lastData); });
6580

66-
connect(uiStrategyObject, SIGNAL(emitData(QString)), this, SLOT(startTimer(QString)));
81+
connect(uiStrategyWidget, SIGNAL(emitData(QString)), this, SLOT(startTimer(QString)));
82+
connect(uiStrategyWidget, SIGNAL(emitData(QString)), this, SIGNAL(emitData(QString)));
83+
connect(uiStrategyWidget, SIGNAL(displayedNewData(QString, QString)), this,
84+
SIGNAL(displayedNewData(QString, QString)));
6785

68-
connect(dataStrategyObject, SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)), this,
86+
connect(dataStrategyWidget, SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)), this,
6987
SLOT(emitDataStatus(QDateTime, QString, QString, int, bool)));
7088

7189
// forward data request from ui strategy to data strategy
72-
connect(uiStrategyObject, SIGNAL(requestData()), dataStrategyObject, SLOT(readAsync()));
90+
connect(uiStrategyWidget, SIGNAL(requestData()), dataStrategyWidget, SLOT(readAsync()));
91+
connect(dataStrategyWidget, SIGNAL(sendData(QString, QString)), this, SIGNAL(sendData(QString, QString)));
92+
connect(dataStrategyWidget, SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)), this,
93+
SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)));
7394

7495
// forward data from data strategy to ui strategy
75-
connect(dataStrategyObject, SIGNAL(sendData(QString, QString)), uiStrategyObject,
96+
connect(dataStrategyWidget, SIGNAL(sendData(QString, QString)), uiStrategyWidget,
7697
SLOT(receiveData(QString, QString)));
98+
connect(dataStrategyWidget, SIGNAL(aboutToWrite(QString, QString)), this,
99+
SIGNAL(aboutToWrite(QString, QString)));
77100

78101
// intercept the sendData from dataStrategy to collect information
79-
connect(dataStrategyObject, SIGNAL(sendData(QString, QString)), this, SLOT(storeReadInfo(QString, QString)));
102+
connect(dataStrategyWidget, SIGNAL(sendData(QString, QString)), this, SLOT(storeReadInfo(QString, QString)));
80103

81-
// The data will be populated here
82104
bool useLazyLoading = Preferences::GetInstance()->get("iiowidgets_use_lazy_loading").toBool();
83105
if(!useLazyLoading) { // force skip lazy load
84106
LAZY_LOAD(initialize);
@@ -95,9 +117,9 @@ void IIOWidget::writeAsync(QString data) { m_dataStrategy->writeAsync(data); }
95117

96118
DataStrategyInterface *IIOWidget::swapDataStrategy(DataStrategyInterface *dataStrategy)
97119
{
98-
QWidget *dataStrategyWidget = dynamic_cast<QWidget *>(m_dataStrategy);
99-
QWidget *uiStrategyWidget = dynamic_cast<QWidget *>(m_uiStrategy);
100-
QWidget *newDataStrategyWidget = dynamic_cast<QWidget *>(dataStrategy);
120+
QObject *dataStrategyWidget = dynamic_cast<QObject *>(m_dataStrategy);
121+
QObject *uiStrategyWidget = dynamic_cast<QObject *>(m_uiStrategy);
122+
QObject *newDataStrategyWidget = dynamic_cast<QObject *>(dataStrategy);
101123

102124
// disconnect old data strategy
103125
disconnect(dataStrategyWidget, SIGNAL(emitStatus(QDateTime, QString, QString, int, bool)), this,
@@ -241,6 +263,13 @@ void IIOWidget::reconfigure()
241263

242264
connect(m_configPopup, &IIOConfigurationPopup::exitButtonClicked, this,
243265
[&]() { m_configPopup->deleteLater(); });
266+
connect(m_configPopup, &IIOConfigurationPopup::emptyButtonClicked, this, [&]() {
267+
DataStrategyInterface *ds = new EmptyDataStrategy(this);
268+
DataStrategyInterface *oldDS = swapDataStrategy(ds);
269+
delete oldDS;
270+
delete m_configPopup;
271+
m_uiStrategy->changeName("Empty");
272+
});
244273
connect(m_configPopup, &IIOConfigurationPopup::selectButtonClicked, this, [&](IIOItem *item) {
245274
DataStrategyInterface *dsCreated = nullptr;
246275
switch(item->type()) {

0 commit comments

Comments
 (0)