Skip to content

Commit 3d7ebd3

Browse files
committed
Added 'Import Project' functionality which unites current project with the imported one
1 parent 45e8309 commit 3d7ebd3

File tree

13 files changed

+198
-93
lines changed

13 files changed

+198
-93
lines changed

changelog.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,3 +162,6 @@ List of changes of new v0.4 version of ModbusTools:
162162
* Fixed when opening the context menu on the Device node in ProjectView may open the wrong Device window
163163
* Added python 'modbus.py' module to work with modbus protocol
164164
* Extended `mbserver.py` script library
165+
* Improved MDI window management
166+
* Improved script text editor
167+
* Added 'Import Project' functionality which unites current project with the imported one

src/client/gui/client_ui.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ mbClientUi::mbClientUi(mbClient *core, QWidget *parent) :
7474
m_ui.actionFileSave = ui->actionFileSave ;
7575
m_ui.actionFileSaveAs = ui->actionFileSaveAs ;
7676
m_ui.actionFileEdit = ui->actionFileEdit ;
77+
m_ui.actionFileImportProject = ui->actionFileImportProject ;
7778
m_ui.actionFileInfo = ui->actionFileInfo ;
7879
m_ui.actionFileQuit = ui->actionFileQuit ;
7980
m_ui.actionEditCut = ui->actionEditCut ;

src/client/gui/client_ui.ui

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
<addaction name="actionFileSave"/>
6464
<addaction name="actionFileSaveAs"/>
6565
<addaction name="actionFileEdit"/>
66+
<addaction name="actionFileImportProject"/>
6667
<addaction name="actionFileInfo"/>
6768
<addaction name="separator"/>
6869
<addaction name="actionFileQuit"/>
@@ -609,6 +610,11 @@
609610
<string>Close All</string>
610611
</property>
611612
</action>
613+
<action name="actionFileImportProject">
614+
<property name="text">
615+
<string>Import Project ...</string>
616+
</property>
617+
</action>
612618
</widget>
613619
<resources>
614620
<include location="client_rsc.qrc"/>

src/client/project/client_builder.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,20 @@ mbCoreDomDataViewItem *mbClientBuilder::toDomDataViewItem(mbCoreDataViewItem *cf
135135
dom->setSettings(s);
136136
return dom;
137137
}
138+
139+
void mbClientBuilder::importDomProject(mbCoreDomProject *dom)
140+
{
141+
Q_FOREACH (mbCoreDomDevice *d, dom->devices())
142+
{
143+
MBSETTINGS s = d->settings();
144+
QString name = s.value(mbClientDevice::Strings::instance().name).toString();
145+
QString portName = s.value(mbClientDevice::Strings::instance().portName).toString();
146+
mbClientPort *port = project()->port(portName);
147+
if (port)
148+
{
149+
mbClientDevice *device = project()->device(name);
150+
if (device)
151+
port->deviceAdd(device);
152+
}
153+
}
154+
}

src/client/project/client_builder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ class mbClientBuilder : public mbCoreBuilder
7676
mbCoreDataViewItem *toDataViewItem (mbCoreDomDataViewItem *dom) override;
7777
mbCoreDomDataViewItem *toDomDataViewItem(mbCoreDataViewItem *cfg) override;
7878

79+
protected:
80+
void importDomProject(mbCoreDomProject *dom) override;
7981
};
8082

8183
#endif // CLIENT_BUILDER_H

src/core/gui/core_ui.cpp

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -141,14 +141,15 @@ void mbCoreUi::initialize()
141141
m_ui.actionFileEdit ->setShortcut (QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_E));
142142
m_ui.actionFileQuit ->setShortcuts(QKeySequence::Quit);
143143

144-
connect(m_ui.actionFileNew , &QAction::triggered, this, &mbCoreUi::menuSlotFileNew );
145-
connect(m_ui.actionFileOpen , &QAction::triggered, this, &mbCoreUi::menuSlotFileOpen );
146-
connect(m_ui.actionFileClose , &QAction::triggered, this, &mbCoreUi::menuSlotFileClose );
147-
connect(m_ui.actionFileSave , &QAction::triggered, this, &mbCoreUi::menuSlotFileSave );
148-
connect(m_ui.actionFileSaveAs, &QAction::triggered, this, &mbCoreUi::menuSlotFileSaveAs);
149-
connect(m_ui.actionFileEdit , &QAction::triggered, this, &mbCoreUi::menuSlotFileEdit );
150-
connect(m_ui.actionFileInfo , &QAction::triggered, this, &mbCoreUi::menuSlotFileInfo );
151-
connect(m_ui.actionFileQuit , &QAction::triggered, this, &mbCoreUi::menuSlotFileQuit );
144+
connect(m_ui.actionFileNew , &QAction::triggered, this, &mbCoreUi::menuSlotFileNew );
145+
connect(m_ui.actionFileOpen , &QAction::triggered, this, &mbCoreUi::menuSlotFileOpen );
146+
connect(m_ui.actionFileClose , &QAction::triggered, this, &mbCoreUi::menuSlotFileClose );
147+
connect(m_ui.actionFileSave , &QAction::triggered, this, &mbCoreUi::menuSlotFileSave );
148+
connect(m_ui.actionFileSaveAs , &QAction::triggered, this, &mbCoreUi::menuSlotFileSaveAs );
149+
connect(m_ui.actionFileEdit , &QAction::triggered, this, &mbCoreUi::menuSlotFileEdit );
150+
connect(m_ui.actionFileImportProject, &QAction::triggered, this, &mbCoreUi::menuSlotFileImportProject);
151+
connect(m_ui.actionFileInfo , &QAction::triggered, this, &mbCoreUi::menuSlotFileInfo );
152+
connect(m_ui.actionFileQuit , &QAction::triggered, this, &mbCoreUi::menuSlotFileQuit );
152153

153154
// Menu Edit
154155
//m_ui.actionEditUndo ->setShortcuts(QKeySequence::Undo );
@@ -452,6 +453,22 @@ void mbCoreUi::menuSlotFileEdit()
452453
}
453454
}
454455

456+
void mbCoreUi::menuSlotFileImportProject()
457+
{
458+
if (m_core->isRunning())
459+
return;
460+
checkProjectModifiedAndSave(QStringLiteral("Import Project"), QStringLiteral("import project"));
461+
QString file = m_dialogs->getOpenFileName(this,
462+
QStringLiteral("Import Project..."),
463+
QString(),
464+
m_dialogs->getFilterString(mbCoreDialogs::Filter_ProjectAll));
465+
if (!file.isEmpty())
466+
{
467+
m_core->builderCore()->importProject(file);
468+
projectCore()->setModifiedFlag(true);
469+
}
470+
}
471+
455472
void mbCoreUi::menuSlotFileInfo()
456473
{
457474
if (m_project)

src/core/gui/core_ui.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,15 @@ protected Q_SLOTS:
105105
// ----------------------------
106106
// ------------FILE------------
107107
// ----------------------------
108-
virtual void menuSlotFileNew ();
109-
virtual void menuSlotFileOpen ();
110-
virtual void menuSlotFileClose ();
111-
virtual void menuSlotFileSave ();
112-
virtual void menuSlotFileSaveAs();
113-
virtual void menuSlotFileEdit ();
114-
virtual void menuSlotFileInfo ();
115-
virtual void menuSlotFileQuit ();
108+
virtual void menuSlotFileNew ();
109+
virtual void menuSlotFileOpen ();
110+
virtual void menuSlotFileClose ();
111+
virtual void menuSlotFileSave ();
112+
virtual void menuSlotFileSaveAs ();
113+
virtual void menuSlotFileEdit ();
114+
virtual void menuSlotFileImportProject();
115+
virtual void menuSlotFileInfo ();
116+
virtual void menuSlotFileQuit ();
116117
// ----------------------------
117118
// ------------EDIT------------
118119
// ----------------------------
@@ -266,6 +267,7 @@ protected Q_SLOTS:
266267
QAction *actionFileSave ;
267268
QAction *actionFileSaveAs ;
268269
QAction *actionFileEdit ;
270+
QAction *actionFileImportProject ;
269271
QAction *actionFileInfo ;
270272
QAction *actionFileQuit ;
271273
QAction *actionEditCut ;

src/core/project/core_builder.cpp

Lines changed: 109 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,38 @@ bool mbCoreBuilder::saveCore(mbCoreProject *project)
8585
return saveXml(project);
8686
}
8787

88+
bool mbCoreBuilder::importProject(const QString &file)
89+
{
90+
mbCoreProject *project = m_project;
91+
if (!project)
92+
return false;
93+
94+
QScopedPointer<mbCoreDomProject> dom(newDomProject());
95+
if (loadXml(file, dom.data()))
96+
{
97+
Q_FOREACH(mbCoreDomDevice *d, dom->devices())
98+
{
99+
mbCoreDevice *v = toDevice(d);
100+
project->deviceAdd(v);
101+
}
102+
103+
Q_FOREACH(mbCoreDomPort *d, dom->ports())
104+
{
105+
mbCorePort *v = toPort(d);
106+
project->portAdd(v);
107+
}
108+
109+
Q_FOREACH(mbCoreDomDataView *d, dom->dataViews())
110+
{
111+
mbCoreDataView *v = toDataView(d);
112+
project->dataViewAdd(v);
113+
}
114+
importDomProject(dom.data());
115+
return true;
116+
}
117+
return false;
118+
}
119+
88120
mbCoreProject *mbCoreBuilder::loadXml(const QString &file)
89121
{
90122
QScopedPointer<mbCoreDomProject> dom(newDomProject());
@@ -132,6 +164,81 @@ void mbCoreBuilder::refreshProjectFileInfo(mbCoreProject *project)
132164
project->setFileModified(fi.lastModified());
133165
}
134166

167+
bool mbCoreBuilder::loadXml(const QString &file, mbCoreDom *dom)
168+
{
169+
QFile qf(file);
170+
if (!qf.open(QIODevice::ReadOnly))
171+
{
172+
setError(qf.errorString());
173+
return false;
174+
}
175+
bool r = loadXml(&qf, dom);
176+
qf.close();
177+
return r;
178+
}
179+
180+
bool mbCoreBuilder::loadXml(QIODevice *io, mbCoreDom *dom)
181+
{
182+
mbCoreXmlStreamReader reader(io);
183+
for (bool finished = false; !finished && !reader.hasError();)
184+
{
185+
switch (reader.readNext())
186+
{
187+
case mbCoreXmlStreamReader::StartElement:
188+
{
189+
const QString tag = reader.name().toString().toLower();
190+
if (tag == dom->tagName())
191+
dom->read(reader);
192+
else
193+
reader.raiseError(QString("<%1>-tag not found").arg(dom->tagName()));
194+
finished = true;
195+
}
196+
break;
197+
case mbCoreXmlStreamReader::EndDocument:
198+
reader.raiseError(QString("<%1>-tag not found").arg(dom->tagName()));
199+
finished = true;
200+
break;
201+
default:
202+
break;
203+
}
204+
}
205+
if (reader.hasError())
206+
{
207+
setError(reader.errorString());
208+
return false;
209+
}
210+
if (reader.hasWarning())
211+
{
212+
Q_FOREACH(const QString text, reader.warnings())
213+
mbCore::LogWarning(QStringLiteral("Builder"), text);
214+
}
215+
return true;
216+
}
217+
218+
bool mbCoreBuilder::saveXml(const QString &file, const mbCoreDom *dom)
219+
{
220+
QFile qf(file);
221+
if (!qf.open(QIODevice::WriteOnly))
222+
{
223+
setError(qf.errorString());
224+
return false;
225+
}
226+
bool r = saveXml(&qf, dom);
227+
qf.close();
228+
return r;
229+
230+
}
231+
232+
bool mbCoreBuilder::saveXml(QIODevice *io, const mbCoreDom *dom)
233+
{
234+
mbCoreXmlStreamWriter writer(io);
235+
writer.setAutoFormatting(true);
236+
writer.writeStartDocument();
237+
dom->write(writer);
238+
writer.writeEndDocument();
239+
return true;
240+
}
241+
135242
QStringList mbCoreBuilder::csvDataViewItemAttributes() const
136243
{
137244
const mbCoreDataViewItem::Strings &s = mbCoreDataViewItem::Strings::instance();
@@ -668,79 +775,9 @@ DomDataViewItems *mbCoreBuilder::toDomDataViewItems(const QList<mbCoreDataViewIt
668775
return dom;
669776
}
670777

671-
bool mbCoreBuilder::loadXml(const QString &file, mbCoreDom *dom)
672-
{
673-
QFile qf(file);
674-
if (!qf.open(QIODevice::ReadOnly))
675-
{
676-
setError(qf.errorString());
677-
return false;
678-
}
679-
bool r = loadXml(&qf, dom);
680-
qf.close();
681-
return r;
682-
}
683-
684-
bool mbCoreBuilder::loadXml(QIODevice *io, mbCoreDom *dom)
685-
{
686-
mbCoreXmlStreamReader reader(io);
687-
for (bool finished = false; !finished && !reader.hasError();)
688-
{
689-
switch (reader.readNext())
690-
{
691-
case mbCoreXmlStreamReader::StartElement:
692-
{
693-
const QString tag = reader.name().toString().toLower();
694-
if (tag == dom->tagName())
695-
dom->read(reader);
696-
else
697-
reader.raiseError(QString("<%1>-tag not found").arg(dom->tagName()));
698-
finished = true;
699-
}
700-
break;
701-
case mbCoreXmlStreamReader::EndDocument:
702-
reader.raiseError(QString("<%1>-tag not found").arg(dom->tagName()));
703-
finished = true;
704-
break;
705-
default:
706-
break;
707-
}
708-
}
709-
if (reader.hasError())
710-
{
711-
setError(reader.errorString());
712-
return false;
713-
}
714-
if (reader.hasWarning())
715-
{
716-
Q_FOREACH(const QString text, reader.warnings())
717-
mbCore::LogWarning(QStringLiteral("Builder"), text);
718-
}
719-
return true;
720-
}
721-
722-
bool mbCoreBuilder::saveXml(const QString &file, const mbCoreDom *dom)
778+
void mbCoreBuilder::importDomProject(mbCoreDomProject * /*dom*/)
723779
{
724-
QFile qf(file);
725-
if (!qf.open(QIODevice::WriteOnly))
726-
{
727-
setError(qf.errorString());
728-
return false;
729-
}
730-
bool r = saveXml(&qf, dom);
731-
qf.close();
732-
return r;
733-
734-
}
735-
736-
bool mbCoreBuilder::saveXml(QIODevice *io, const mbCoreDom *dom)
737-
{
738-
mbCoreXmlStreamWriter writer(io);
739-
writer.setAutoFormatting(true);
740-
writer.writeStartDocument();
741-
dom->write(writer);
742-
writer.writeEndDocument();
743-
return true;
780+
// Note: Base implementation does nothing
744781
}
745782

746783
void mbCoreBuilder::setProject(mbCoreProject *project)

src/core/project/core_builder.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,18 @@ class MB_EXPORT mbCoreBuilder : public QObject
7979
mbCoreProject *loadCore(const QString &file);
8080
bool saveCore(mbCoreProject *project);
8181

82+
public:
83+
virtual bool importProject(const QString &file);
84+
8285
public: // .xml project
8386
virtual mbCoreProject *loadXml(const QString &file);
8487
virtual bool saveXml(mbCoreProject *project);
8588
virtual void beginSaveProject(mbCoreProject *project);
8689
virtual void refreshProjectFileInfo(mbCoreProject *project);
90+
bool loadXml(const QString &file, mbCoreDom *dom);
91+
bool loadXml(QIODevice *io, mbCoreDom *dom);
92+
bool saveXml(const QString &file, const mbCoreDom *dom);
93+
bool saveXml(QIODevice *io, const mbCoreDom *dom);
8794

8895
public:
8996
virtual QStringList csvDataViewItemAttributes() const;
@@ -155,10 +162,7 @@ class MB_EXPORT mbCoreBuilder : public QObject
155162
DomDataViewItems *toDomDataViewItems(const QList<mbCoreDataViewItem *> &cfg);
156163

157164
protected:
158-
bool loadXml(const QString &file, mbCoreDom *dom);
159-
bool loadXml(QIODevice *io, mbCoreDom *dom);
160-
bool saveXml(const QString &file, const mbCoreDom *dom);
161-
bool saveXml(QIODevice *io, const mbCoreDom *dom);
165+
virtual void importDomProject(mbCoreDomProject *dom);
162166

163167
protected Q_SLOTS:
164168
void setProject(mbCoreProject *project);

src/server/gui/server_ui.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ mbServerUi::mbServerUi(mbServer *core, QWidget *parent) :
113113
m_ui.actionFileSave = ui->actionFileSave ;
114114
m_ui.actionFileSaveAs = ui->actionFileSaveAs ;
115115
m_ui.actionFileEdit = ui->actionFileEdit ;
116+
m_ui.actionFileImportProject = ui->actionFileImportProject ;
116117
m_ui.actionFileInfo = ui->actionFileInfo ;
117118
m_ui.actionFileQuit = ui->actionFileQuit ;
118119
m_ui.actionEditCut = ui->actionEditCut ;

0 commit comments

Comments
 (0)