Skip to content

Commit 5789907

Browse files
committed
Add import/export in csv-format for whole DataView list
1 parent 3247910 commit 5789907

File tree

5 files changed

+136
-21
lines changed

5 files changed

+136
-21
lines changed

changelog.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,5 +75,7 @@
7575

7676
* When you click `Insert` in the `DataView` window, the new value is added to the list,
7777
but taking into account the address and size of the element format above.
78-
* Added insert/delete hotkeys for port/device/actions elements (copy/paste for actions)
78+
* Added insert/delete hotkeys for port/device/actions elements (copy/paste for simulation actions)
7979
* Added a confirmation prompt when deleting items such as port and device
80+
* Import/Export whole DataView list in csv-format
81+
* Import/Export simulation actions in csv-format

src/core/gui/core_ui.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -662,15 +662,17 @@ void mbCoreUi::menuSlotDataViewExportItems()
662662
mbCoreDataViewUi *ui = m_dataViewManager->activeDataViewUiCore();
663663
if (ui)
664664
{
665-
auto selectedItems = ui->selectedItemsCore();
666-
if (selectedItems.count())
665+
auto items = ui->selectedItemsCore();
666+
if (items.isEmpty())
667+
items = ui->dataViewCore()->itemsCore();
668+
if (items.count())
667669
{
668670
QString file = m_dialogs->getSaveFileName(this,
669671
QStringLiteral("Export Items ..."),
670672
QString(),
671673
m_dialogs->getFilterString(mbCoreDialogs::Filter_DataViewItemsAll));
672674
if (!file.isEmpty())
673-
m_builder->exportDataViewItems(file, selectedItems);
675+
m_builder->exportDataViewItems(file, items);
674676
}
675677
}
676678
}

src/core/gui/dialogs/core_dialogs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class MB_EXPORT mbCoreDialogs
6060
Filter_ProjectAll = Filter_ProjectFiles | Filter_XmlFiles | Filter_AllFiles,
6161
Filter_PortAll = Filter_XmlFiles | Filter_AllFiles,
6262
Filter_DeviceAll = Filter_XmlFiles | Filter_AllFiles,
63-
Filter_DataViewAll = Filter_XmlFiles | Filter_AllFiles,
63+
Filter_DataViewAll = Filter_CsvFiles | Filter_XmlFiles | Filter_AllFiles,
6464
Filter_DataViewItemsAll = Filter_CsvFiles | Filter_XmlFiles | Filter_AllFiles,
6565
};
6666

src/core/project/core_builder.cpp

Lines changed: 105 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ class DomDataViewItems : public mbCoreDomItems<mbCoreDomDataViewItem>
5252
};
5353

5454
mbCoreBuilder::Strings::Strings() :
55+
dataViewPrefix(QStringLiteral("dataview")),
56+
dataViewAttrNames(QStringList() << mbCoreDataView::Strings::instance().name
57+
<< mbCoreDataView::Strings::instance().period),
5558
xml(QStringLiteral("xml")),
5659
csv(QStringLiteral("csv")),
5760
csvSep(';')
@@ -364,13 +367,33 @@ mbCoreDevice *mbCoreBuilder::importDevice(const QString &file)
364367
}
365368

366369
mbCoreDataView *mbCoreBuilder::importDataView(const QString &file)
370+
{
371+
if (file.endsWith(Strings::instance().csv))
372+
return importDataViewCsv(file);
373+
return importDataViewXml(file);
374+
}
375+
376+
mbCoreDataView *mbCoreBuilder::importDataViewXml(const QString &file)
367377
{
368378
QScopedPointer<mbCoreDomDataView> dom(newDomDataView());
369379
if (loadXml(file, dom.data()))
370380
return toDataView(dom.data());
371381
return nullptr;
372382
}
373383

384+
mbCoreDataView *mbCoreBuilder::importDataViewCsv(const QString &file)
385+
{
386+
QFile qf(file);
387+
if (!qf.open(QIODevice::ReadOnly))
388+
{
389+
setError(qf.errorString());
390+
return nullptr;
391+
}
392+
mbCoreDataView* view = importDataViewCsv(&qf);
393+
qf.close();
394+
return view;
395+
}
396+
374397
QList<mbCoreDataViewItem *> mbCoreBuilder::importDataViewItems(const QString &file)
375398
{
376399
if (file.endsWith(Strings::instance().csv))
@@ -423,14 +446,33 @@ mbCoreDevice *mbCoreBuilder::importDevice(QIODevice *io)
423446
return nullptr;
424447
}
425448

426-
mbCoreDataView *mbCoreBuilder::importDataView(QIODevice *io)
449+
mbCoreDataView *mbCoreBuilder::importDataViewXml(QIODevice *io)
427450
{
428451
QScopedPointer<mbCoreDomDataView> dom(newDomDataView());
429452
if (loadXml(io, dom.data()))
430453
return toDataView(dom.data());
431454
return nullptr;
432455
}
433456

457+
mbCoreDataView *mbCoreBuilder::importDataViewCsv(QIODevice *io)
458+
{
459+
qint64 mempos = io->pos();
460+
QByteArray headerBytes = io->readLine();
461+
QString header = QString::fromUtf8(headerBytes);
462+
MBSETTINGS settings;
463+
if (header.startsWith(Strings::instance().dataViewPrefix))
464+
settings = parseCsvDataViewSettings(header);
465+
else
466+
io->seek(mempos);
467+
QList<mbCoreDataViewItem*> items = importDataViewItemsCsv(io);
468+
mbCoreDataView *view = newDataView();
469+
if (settings.count())
470+
view->setSettings(settings);
471+
if (items.count())
472+
view->itemsInsert(items);
473+
return view;
474+
}
475+
434476
QList<mbCoreDataViewItem *> mbCoreBuilder::importDataViewItemsXml(QIODevice *io)
435477
{
436478
DomDataViewItems dom(this);
@@ -442,8 +484,10 @@ QList<mbCoreDataViewItem *> mbCoreBuilder::importDataViewItemsXml(QIODevice *io)
442484
QList<mbCoreDataViewItem *> mbCoreBuilder::importDataViewItemsCsv(QIODevice *io)
443485
{
444486
QList<mbCoreDataViewItem *> items;
445-
QByteArray header = io->readLine();
446-
QStringList attrNames = parseCsvRow(QString::fromUtf8(header));
487+
QString header = QString::fromUtf8(io->readLine());
488+
if (header.startsWith(Strings::instance().dataViewPrefix))
489+
header = QString::fromUtf8(io->readLine());
490+
QStringList attrNames = parseCsvRow(header);
447491
if (attrNames.isEmpty())
448492
return items;
449493
while (!io->atEnd())
@@ -472,11 +516,31 @@ bool mbCoreBuilder::exportDevice(const QString &file, mbCoreDevice *cfg)
472516
}
473517

474518
bool mbCoreBuilder::exportDataView(const QString &file, mbCoreDataView *cfg)
519+
{
520+
if (file.endsWith(Strings::instance().csv))
521+
return exportDataViewCsv(file, cfg);
522+
return exportDataViewXml(file, cfg);
523+
}
524+
525+
bool mbCoreBuilder::exportDataViewXml(const QString &file, mbCoreDataView *cfg)
475526
{
476527
QScopedPointer<mbCoreDomDataView> dom(toDomDataView(cfg));
477528
return saveXml(file, dom.data());
478529
}
479530

531+
bool mbCoreBuilder::exportDataViewCsv(const QString &file, mbCoreDataView *cfg)
532+
{
533+
QFile qf(file);
534+
if (!qf.open(QIODevice::WriteOnly))
535+
{
536+
setError(qf.errorString());
537+
return false;
538+
}
539+
bool res = exportDataViewCsv(&qf, cfg);
540+
qf.close();
541+
return res;
542+
}
543+
480544
bool mbCoreBuilder::exportDataViewItems(const QString &file, const QList<mbCoreDataViewItem *> &cfg)
481545
{
482546
if (file.endsWith(Strings::instance().csv))
@@ -515,12 +579,19 @@ bool mbCoreBuilder::exportDevice(QIODevice *io, mbCoreDevice *cfg)
515579
return saveXml(io, dom.data());
516580
}
517581

518-
bool mbCoreBuilder::exportDataView(QIODevice *io, mbCoreDataView *cfg)
582+
bool mbCoreBuilder::exportDataViewXml(QIODevice *io, mbCoreDataView *cfg)
519583
{
520584
QScopedPointer<mbCoreDomDataView> dom(toDomDataView(cfg));
521585
return saveXml(io, dom.data());
522586
}
523587

588+
bool mbCoreBuilder::exportDataViewCsv(QIODevice *io, mbCoreDataView *cfg)
589+
{
590+
QString s = makeCsvDataViewSettings(Strings::instance().dataViewAttrNames, cfg->settings());
591+
io->write(s.toUtf8());
592+
return exportDataViewItemsCsv(io, cfg->itemsCore());
593+
}
594+
524595
bool mbCoreBuilder::exportDataViewItemsXml(QIODevice *io, const QList<mbCoreDataViewItem *> &cfg)
525596
{
526597
QScopedPointer<DomDataViewItems> dom(toDomDataViewItems(cfg));
@@ -647,6 +718,36 @@ void mbCoreBuilder::setProject(mbCoreProject *project)
647718
m_project = project;
648719
}
649720

721+
MBSETTINGS mbCoreBuilder::parseCsvDataViewSettings(const QString &row)
722+
{
723+
MBSETTINGS settings;
724+
QStringList attrs = parseCsvRow(row);
725+
726+
// Note: pass attrs[0] that must be equal to "dataview"
727+
for (int i = 0; i < attrs.count() /2; i++)
728+
{
729+
QString name = attrs.at(i*2+1);
730+
QString value = attrs.at(i*2+2);
731+
settings[name] = value;
732+
}
733+
return settings;
734+
}
735+
736+
QString mbCoreBuilder::makeCsvDataViewSettings(const QStringList &attrNames, const MBSETTINGS &settings)
737+
{
738+
QStringList attrs;
739+
740+
attrs.append(Strings::instance().dataViewPrefix);
741+
Q_FOREACH (const QString attrName, attrNames)
742+
{
743+
attrs.append(attrName);
744+
attrs.append(settings.value(attrName).toString());
745+
}
746+
747+
QString v = makeCsvRow(attrs);
748+
return v;
749+
}
750+
650751
MBSETTINGS mbCoreBuilder::parseCsvDataViewItem(const QStringList &attrNames, const QString &row)
651752
{
652753
MBSETTINGS settings;

src/core/project/core_builder.h

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ class MB_EXPORT mbCoreBuilder : public QObject
5252
public:
5353
struct MB_EXPORT Strings
5454
{
55+
const QString dataViewPrefix;
56+
const QStringList dataViewAttrNames;
5557
const QString xml;
5658
const QString csv;
5759
const QChar csvSep;
@@ -113,30 +115,36 @@ class MB_EXPORT mbCoreBuilder : public QObject
113115
MBSETTINGS toSettings(const mbCoreDataViewItem *item, bool processValue = true);
114116

115117
public:
116-
mbCorePort *importPort (const QString &file);
117-
mbCoreDevice *importDevice (const QString &file);
118+
mbCorePort *importPort(const QString &file);
119+
mbCoreDevice *importDevice(const QString &file);
118120
mbCoreDataView *importDataView(const QString &file);
119-
QList<mbCoreDataViewItem*> importDataViewItems (const QString &file);
121+
mbCoreDataView *importDataViewXml(const QString &file);
122+
mbCoreDataView *importDataViewCsv(const QString &file);
123+
QList<mbCoreDataViewItem*> importDataViewItems(const QString &file);
120124
QList<mbCoreDataViewItem*> importDataViewItemsXml(const QString &file);
121125
QList<mbCoreDataViewItem*> importDataViewItemsCsv(const QString &file);
122126

123-
mbCorePort *importPort (QIODevice *io);
124-
mbCoreDevice *importDevice (QIODevice *io);
125-
mbCoreDataView *importDataView(QIODevice *io);
127+
mbCorePort *importPort(QIODevice *io);
128+
mbCoreDevice *importDevice(QIODevice *io);
129+
mbCoreDataView *importDataViewXml(QIODevice *io);
130+
mbCoreDataView *importDataViewCsv(QIODevice *io);
126131
QList<mbCoreDataViewItem*> importDataViewItemsXml(QIODevice *io);
127132
QList<mbCoreDataViewItem*> importDataViewItemsCsv(QIODevice *io);
128133

129134
public:
130-
bool exportPort (const QString &file, mbCorePort *cfg);
131-
bool exportDevice (const QString &file, mbCoreDevice *cfg);
132-
bool exportDataView (const QString &file, mbCoreDataView *cfg);
135+
bool exportPort(const QString &file, mbCorePort *cfg);
136+
bool exportDevice(const QString &file, mbCoreDevice *cfg);
137+
bool exportDataView(const QString &file, mbCoreDataView *cfg);
138+
bool exportDataViewXml(const QString &file, mbCoreDataView *cfg);
139+
bool exportDataViewCsv(const QString &file, mbCoreDataView *cfg);
133140
bool exportDataViewItems(const QString &file, const QList<mbCoreDataViewItem*> &cfg);
134141
bool exportDataViewItemsXml(const QString &file, const QList<mbCoreDataViewItem*> &cfg);
135142
bool exportDataViewItemsCsv(const QString &file, const QList<mbCoreDataViewItem*> &cfg);
136143

137-
bool exportPort (QIODevice *io, mbCorePort *cfg);
138-
bool exportDevice (QIODevice *io, mbCoreDevice *cfg);
139-
bool exportDataView (QIODevice *io, mbCoreDataView *cfg);
144+
bool exportPort(QIODevice *io, mbCorePort *cfg);
145+
bool exportDevice(QIODevice *io, mbCoreDevice *cfg);
146+
bool exportDataViewXml(QIODevice *io, mbCoreDataView *cfg);
147+
bool exportDataViewCsv(QIODevice *io, mbCoreDataView *cfg);
140148
bool exportDataViewItemsXml(QIODevice *io, const QList<mbCoreDataViewItem*> &cfg);
141149
bool exportDataViewItemsCsv(QIODevice *io, const QList<mbCoreDataViewItem*> &cfg);
142150

@@ -154,6 +162,8 @@ protected Q_SLOTS:
154162
void setProject(mbCoreProject *project);
155163

156164
protected:
165+
MBSETTINGS parseCsvDataViewSettings(const QString &row);
166+
QString makeCsvDataViewSettings(const QStringList &attrNames, const MBSETTINGS &settings);
157167
MBSETTINGS parseCsvDataViewItem(const QStringList &attrNames, const QString &row);
158168
QString makeCsvDataViewItem(const QStringList &attrNames, const MBSETTINGS &settings);
159169
QStringList parseCsvRow(const QString &row);

0 commit comments

Comments
 (0)