59 #include <QDomDocument>
60 #include <QTextStream>
61 #include <QStandardPaths>
80 : m_pPluginManager(pPluginManager)
81 , m_pPluginSceneManager(pPluginSceneManager)
83 , m_pGraphicsView(Q_NULLPTR)
84 , m_pSensorToolButton(Q_NULLPTR)
85 , m_pAlgorithmToolButton(Q_NULLPTR)
86 , m_pIOToolButton(Q_NULLPTR)
87 , m_pToolBarPlugins(Q_NULLPTR)
88 , m_pPointerButton(Q_NULLPTR)
89 , m_pLinePointerButton(Q_NULLPTR)
90 , m_pToolBarPointer(Q_NULLPTR)
91 , m_pToolBarItem(Q_NULLPTR)
97 m_pPluginScene =
new PluginScene(m_pMenuItem,
this);
98 m_pPluginScene->setSceneRect(QRectF(0, 0, 200, 500));
99 connect(m_pPluginScene, &PluginScene::itemInserted,
100 this, &PluginGui::itemInserted);
102 connect(m_pPluginScene, &PluginScene::selectionChanged,
103 this, &PluginGui::newItemSelected);
105 m_pGraphicsView =
new QGraphicsView(m_pPluginScene);
107 setCentralWidget(m_pGraphicsView);
108 setWindowTitle(tr(
"PluginScene"));
109 setUnifiedTitleAndToolBarOnMac(
true);
113 bool loadingState = settings.value(QString(
"MNE-X/loadingState"),
false).toBool();
117 settings.setValue(QString(
"MNE-X/loadingState"),
false);
118 loadConfig(QStandardPaths::writableLocation(QStandardPaths::DataLocation),
"default.xml");
121 settings.setValue(QString(
"MNE-X/loadingState"),
true);
127 PluginGui::~PluginGui()
132 saveConfig(QStandardPaths::writableLocation(QStandardPaths::DataLocation),
"default.xml");
134 m_pCurrentPlugin.reset();
137 if(m_pSensorToolButton)
138 delete m_pSensorToolButton;
139 if(m_pAlgorithmToolButton)
140 delete m_pAlgorithmToolButton;
142 delete m_pIOToolButton;
143 if(m_pToolBarPlugins)
144 delete m_pToolBarPlugins;
147 delete m_pPointerButton;
148 if(m_pLinePointerButton)
149 delete m_pLinePointerButton;
150 if(m_pToolBarPointer)
151 delete m_pToolBarPointer;
154 delete m_pToolBarItem;
157 delete m_pGraphicsView;
165 foreach (QGraphicsItem *item, m_pPluginScene->items())
167 if(item->type() == PluginItem::Type)
169 if(removePlugin(qgraphicsitem_cast<PluginItem *>(item)->plugin()))
171 qgraphicsitem_cast<
PluginItem *>(item)->removeArrows();
172 m_pPluginScene->removeItem(item);
184 qDebug() <<
"load" << sPath+
"/"+sFileName;
186 QDomDocument doc(
"PluginConfig");
187 QFile file(sPath+
"/"+sFileName);
188 if (!file.open(QIODevice::ReadOnly))
190 if (!doc.setContent(&file)) {
198 QDomElement docElem = doc.documentElement();
199 if(docElem.tagName() !=
"PluginTree")
201 qWarning() << sFileName <<
"not found!";
205 QDomNode nodePluginTree = docElem.firstChild();
206 while(!nodePluginTree.isNull()) {
207 QDomElement elementPluginTree = nodePluginTree.toElement();
211 if(elementPluginTree.tagName() ==
"Plugins") {
212 QDomNode nodePlugins = elementPluginTree.firstChild();
213 while(!nodePlugins.isNull())
215 QDomElement e = nodePlugins.toElement();
216 nodePlugins = nodePlugins.nextSibling();
218 QPointF pos((qreal)e.attribute(
"pos_x").toInt(),(qreal)e.attribute(
"pos_y").toInt());
219 QAction *pCurrentAction = Q_NULLPTR;
221 for(qint32 i = 0; i < m_pActionGroupPlugins->actions().size(); ++i)
223 if(m_pActionGroupPlugins->actions()[i]->text() == e.attribute(
"name"))
225 pCurrentAction = m_pActionGroupPlugins->actions()[i];
233 pCurrentAction->setChecked(
true);
234 m_pPluginScene->setActionPluginItem(pCurrentAction);
235 m_pPluginScene->setMode(PluginScene::InsertPluginItem);
243 if(elementPluginTree.tagName() ==
"Connections") {
244 QDomNode nodeConections = elementPluginTree.firstChild();
245 while(!nodeConections.isNull())
247 QDomElement e = nodeConections.toElement();
248 nodeConections = nodeConections.nextSibling();
250 qDebug() << qPrintable(e.tagName()) << e.attribute(
"receiver") << e.attribute(
"sender");
252 QString sSender = e.attribute(
"sender");
253 QString sReceiver = e.attribute(
"receiver");
260 for(qint32 i = 0; i < m_pPluginScene->items().size(); ++i)
263 if(item->plugin()->getName() == sSender)
266 if(item->plugin()->getName() == sReceiver)
271 if(!startItem || !endItem)
276 if(pConnection->isConnected())
278 Arrow *arrow =
new Arrow(startItem, endItem, pConnection);
279 arrow->setColor(QColor(65,113,156));
280 startItem->addArrow(arrow);
281 endItem->addArrow(arrow);
282 arrow->setZValue(-1000.0);
283 m_pPluginScene->addItem(arrow);
284 arrow->updatePosition();
290 nodePluginTree = nodePluginTree.nextSibling();
299 qDebug() <<
"Save Config" << sPath+
"/"+sFileName;
300 QDomDocument doc(
"PluginConfig");
301 QDomElement root = doc.createElement(
"PluginTree");
302 doc.appendChild(root);
307 QDomElement plugins = doc.createElement(
"Plugins");
308 root.appendChild(plugins);
310 foreach (QGraphicsItem *item, m_pPluginScene->items())
312 if(item->type() == PluginItem::Type)
314 pPlugin = qgraphicsitem_cast<
PluginItem *>(item)->plugin();
316 QDomElement plugin = doc.createElement(
"Plugin");
317 plugin.setAttribute(
"name",pPlugin->getName());
318 plugin.setAttribute(
"pos_x",item->x());
319 plugin.setAttribute(
"pos_y",item->y());
320 plugins.appendChild(plugin);
327 QDomElement connections = doc.createElement(
"Connections");
328 root.appendChild(connections);
330 foreach (QGraphicsItem *item, m_pPluginScene->items())
332 if(item->type() == Arrow::Type)
334 pConnection = qgraphicsitem_cast<
Arrow *>(item)->connection();
336 QDomElement connection = doc.createElement(
"Connection");
337 connection.setAttribute(
"sender",pConnection->getSender()->getName());
338 connection.setAttribute(
"receiver",pConnection->getReceiver()->getName());
339 connections.appendChild(connection);
343 QString xml = doc.toString();
346 if(!dir.exists(sPath))
347 if(!dir.mkpath(sPath))
350 QFile file(sPath+
"/"+sFileName);
351 if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
354 QTextStream out(&file);
362 void PluginGui::uiSetupRunningState(
bool state)
366 m_pToolBarPlugins->setEnabled(
false);
367 m_pButtonGroupPointers->button(1)->setEnabled(
false);
368 deleteAction->setEnabled(
false);
372 m_pToolBarPlugins->setEnabled(
true);
373 m_pButtonGroupPointers->button(1)->setEnabled(
true);
374 deleteAction->setEnabled(
true);
383 bool bRemoved = m_pPluginSceneManager->
removePlugin(pPlugin);
388 if(!pPlugin->multiInstanceAllowed())
390 QString sPluginName = pPlugin->getName();
392 foreach (QAction *action, m_pActionGroupPlugins->actions())
394 if(action->text() == sPluginName)
396 action->setEnabled(
true);
403 if(m_pPluginSceneManager->getPlugins().size() > 0)
404 m_pCurrentPlugin = m_pPluginSceneManager->getPlugins()[m_pPluginSceneManager->getPlugins().size()-1];
406 m_pCurrentPlugin.reset();
408 selectedPluginChanged(m_pCurrentPlugin);
417 void PluginGui::actionGroupTriggered(QAction* action)
419 m_pPluginScene->setActionPluginItem(action);
420 m_pPluginScene->setMode(PluginScene::InsertPluginItem);
426 void PluginGui::itemInserted(
PluginItem *item)
429 m_pButtonGroupPointers->button(
int(PluginScene::MovePluginItem))->setChecked(
true);
430 m_pPluginScene->setMode(PluginScene::Mode(m_pButtonGroupPointers->checkedId()));
436 void PluginGui::newItemSelected()
441 foreach (QGraphicsItem *item, m_pPluginScene->selectedItems())
443 if(item->type() == PluginItem::Type)
444 pPlugin = qgraphicsitem_cast<PluginItem *>(item)->plugin();
445 else if(item->type() == Arrow::Type)
446 pConnection = qgraphicsitem_cast<Arrow *>(item)->connection();
450 if(!pPlugin.isNull() && pPlugin != m_pCurrentPlugin)
452 m_pCurrentPlugin = pPlugin;
454 emit selectedPluginChanged(m_pCurrentPlugin);
456 else if(!pConnection.isNull() && pConnection != m_pCurrentConnection)
458 m_pCurrentConnection = pConnection;
460 emit selectedConnectionChanged(m_pCurrentConnection);
467 void PluginGui::deleteItem()
470 foreach (QGraphicsItem *item, m_pPluginScene->selectedItems())
472 if (item->type() == Arrow::Type)
474 m_pPluginScene->removeItem(item);
475 Arrow *arrow = qgraphicsitem_cast<
Arrow *>(item);
476 arrow->startItem()->removeArrow(arrow);
477 arrow->endItem()->removeArrow(arrow);
483 foreach (QGraphicsItem *item, m_pPluginScene->selectedItems())
485 if (item->type() == PluginItem::Type)
487 if(removePlugin(qgraphicsitem_cast<PluginItem *>(item)->plugin()))
489 qgraphicsitem_cast<
PluginItem *>(item)->removeArrows();
491 m_pPluginScene->removeItem(item);
501 void PluginGui::pointerGroupClicked(
int)
503 m_pPluginScene->setMode(PluginScene::Mode(m_pButtonGroupPointers->checkedId()));
509 void PluginGui::bringToFront()
511 if (m_pPluginScene->selectedItems().isEmpty())
514 QGraphicsItem *selectedItem = m_pPluginScene->selectedItems().first();
515 QList<QGraphicsItem *> overlapItems = selectedItem->collidingItems();
518 foreach (QGraphicsItem *item, overlapItems) {
519 if (item->zValue() >= zValue && item->type() == PluginItem::Type)
520 zValue = item->zValue() + 0.1;
522 selectedItem->setZValue(zValue);
528 void PluginGui::sendToBack()
530 if (m_pPluginScene->selectedItems().isEmpty())
533 QGraphicsItem *selectedItem = m_pPluginScene->selectedItems().first();
534 QList<QGraphicsItem *> overlapItems = selectedItem->collidingItems();
537 foreach (QGraphicsItem *item, overlapItems) {
538 if (item->zValue() <= zValue && item->type() == PluginItem::Type)
539 zValue = item->zValue() - 0.1;
541 selectedItem->setZValue(zValue);
547 void PluginGui::createActions()
549 deleteAction =
new QAction(QIcon(
":/images/delete.png"), tr(
"&Delete"),
this);
550 deleteAction->setShortcut(tr(
"Delete"));
551 deleteAction->setStatusTip(tr(
"Delete item from diagram (Del)"));
552 connect(deleteAction, &QAction::triggered,
this, &PluginGui::deleteItem);
554 toFrontAction =
new QAction(QIcon(
":/images/bringtofront.png"),
555 tr(
"Bring to &Front"),
this);
556 toFrontAction->setShortcut(tr(
"Ctrl+F"));
557 toFrontAction->setStatusTip(tr(
"Bring item to front (Ctrl+F)"));
558 connect(toFrontAction, &QAction::triggered,
this, &PluginGui::bringToFront);
560 sendBackAction =
new QAction(QIcon(
":/images/sendtoback.png"), tr(
"Send to &Back"),
this);
561 sendBackAction->setShortcut(tr(
"Ctrl+B"));
562 sendBackAction->setStatusTip(tr(
"Send item to back (Ctrl+B)"));
563 connect(sendBackAction, &QAction::triggered,
this, &PluginGui::sendToBack);
569 void PluginGui::createMenuItem()
571 m_pMenuItem =
new QMenu;
572 m_pMenuItem->addAction(deleteAction);
573 m_pMenuItem->addSeparator();
574 m_pMenuItem->addAction(toFrontAction);
575 m_pMenuItem->addAction(sendBackAction);
581 void PluginGui::createToolbars()
584 m_pActionGroupPlugins =
new QActionGroup(
this);
585 m_pActionGroupPlugins->setExclusive(
false);
586 connect(m_pActionGroupPlugins, &QActionGroup::triggered,
587 this, &PluginGui::actionGroupTriggered);
590 m_pSensorToolButton =
new QToolButton;
591 QMenu *menuSensors =
new QMenu;
593 createItemAction(m_pPluginManager->
getSensorPlugins()[i]->getName(), menuSensors);
595 m_pSensorToolButton->setMenu(menuSensors);
596 m_pSensorToolButton->setPopupMode(QToolButton::InstantPopup);
597 m_pSensorToolButton->setIcon(QIcon(
":/images/sensor.png"));
598 m_pSensorToolButton->setStatusTip(tr(
"Sensor Plugins"));
599 m_pSensorToolButton->setToolTip(tr(
"Sensor Plugins"));
602 m_pAlgorithmToolButton =
new QToolButton;
603 QMenu *menuAlgorithms =
new QMenu;
607 m_pAlgorithmToolButton->setMenu(menuAlgorithms);
608 m_pAlgorithmToolButton->setPopupMode(QToolButton::InstantPopup);
609 m_pAlgorithmToolButton->setIcon(QIcon(
":/images/algorithm.png"));
610 m_pAlgorithmToolButton->setStatusTip(tr(
"Algorithm Plugins"));
611 m_pAlgorithmToolButton->setToolTip(tr(
"Algorithm Plugins"));
614 m_pIOToolButton =
new QToolButton;
615 QMenu *menuIo =
new QMenu;
616 for(qint32 i = 0; i < m_pPluginManager->
getIOPlugins().size(); ++i)
617 createItemAction(m_pPluginManager->
getIOPlugins()[i]->getName(), menuIo);
619 m_pIOToolButton->setMenu(menuIo);
620 m_pIOToolButton->setPopupMode(QToolButton::InstantPopup);
621 m_pIOToolButton->setIcon(QIcon(
":/images/io.png"));
622 m_pIOToolButton->setStatusTip(tr(
"I/O Plugins"));
623 m_pIOToolButton->setToolTip(tr(
"I/O Plugins"));
625 m_pToolBarPlugins =
new QToolBar(tr(
"Plugins"),
this);
626 m_pToolBarPlugins->addWidget(m_pSensorToolButton);
627 m_pToolBarPlugins->addWidget(m_pAlgorithmToolButton);
628 m_pToolBarPlugins->addWidget(m_pIOToolButton);
630 m_pToolBarPlugins->setAllowedAreas(Qt::LeftToolBarArea);
631 m_pToolBarPlugins->setFloatable(
false);
632 m_pToolBarPlugins->setMovable(
false);
634 addToolBar(Qt::LeftToolBarArea, m_pToolBarPlugins);
637 m_pPointerButton =
new QToolButton;
638 m_pPointerButton->setCheckable(
true);
639 m_pPointerButton->setChecked(
true);
640 m_pPointerButton->setIcon(QIcon(
":/images/pointer.png"));
641 m_pPointerButton->setShortcut(tr(
"Ctrl+P"));
642 m_pPointerButton->setStatusTip(tr(
"Select/Place (Ctrl+P)"));
643 m_pPointerButton->setToolTip(tr(
"Select/Place"));
645 m_pLinePointerButton =
new QToolButton;
646 m_pLinePointerButton->setCheckable(
true);
647 m_pLinePointerButton->setIcon(QIcon(
":/images/linepointer.png"));
648 m_pLinePointerButton->setShortcut(tr(
"Ctrl+L"));
649 m_pLinePointerButton->setStatusTip(tr(
"Connection (Ctrl+L)"));
650 m_pLinePointerButton->setToolTip(tr(
"Connection"));
652 m_pButtonGroupPointers =
new QButtonGroup(
this);
653 m_pButtonGroupPointers->addButton(m_pPointerButton,
int(PluginScene::MovePluginItem));
654 m_pButtonGroupPointers->addButton(m_pLinePointerButton,
int(PluginScene::InsertLine));
656 connect(m_pButtonGroupPointers,
static_cast<void (QButtonGroup::*)(
int)
>(&QButtonGroup::buttonClicked),
657 this, &PluginGui::pointerGroupClicked);
659 m_pToolBarPointer =
new QToolBar(tr(
"Pointer type"),
this);
661 m_pToolBarPointer->addWidget(m_pPointerButton);
662 m_pToolBarPointer->addWidget(m_pLinePointerButton);
664 m_pToolBarPointer->setAllowedAreas(Qt::LeftToolBarArea);
665 m_pToolBarPointer->setFloatable(
false);
666 m_pToolBarPointer->setMovable(
false);
668 addToolBar(Qt::LeftToolBarArea, m_pToolBarPointer);
671 m_pToolBarItem =
new QToolBar(tr(
"Item"),
this);
673 m_pToolBarItem->addAction(deleteAction);
674 m_pToolBarItem->addAction(toFrontAction);
675 m_pToolBarItem->addAction(sendBackAction);
677 m_pToolBarItem->setAllowedAreas(Qt::LeftToolBarArea);
678 m_pToolBarItem->setFloatable(
false);
679 m_pToolBarItem->setMovable(
false);
681 addToolBar(Qt::LeftToolBarArea, m_pToolBarItem);
687 QAction* PluginGui::createItemAction(QString name, QMenu* menu)
689 QAction* action = menu->addAction(name);
690 m_pActionGroupPlugins->addAction(action);
Contains declaration of IIO interface class.
QSharedPointer< PluginConnectorConnection > SPtr
Contains declaration of IPlugin interface class.
void insertItem(const QPointF &pos)
const QVector< IAlgorithm * > & getAlgorithmPlugins()
Contains declaration of IAlgorithm interface class.
PluginGui class declaration.
static QSharedPointer< PluginConnectorConnection > create(IPlugin::SPtr sender, IPlugin::SPtr receiver, QObject *parent=0)
The PluginManager class provides a dynamic plugin loader. As well as the handling of the loaded plugi...
void loadConfig(const QString &sPath, const QString &sFileName)
QSharedPointer< IPlugin > SPtr
PluginScene class declaration.
The PluginSceneManager class manages plugins and connections of a set of plugins. ...
PluginItem class declaration.
void saveConfig(const QString &sPath, const QString &sFileName)
bool removePlugin(const IPlugin::SPtr pPlugin)
const QVector< IIO * > & getIOPlugins()
const QVector< ISensor * > & getSensorPlugins()
Contains declaration of IIinverseAlgorithm interface class.