MNE-CPP  beta 1.0
plugingui.cpp
Go to the documentation of this file.
1 //=============================================================================================================
36 //*************************************************************************************************************
37 //=============================================================================================================
38 // INCLUDES
39 //=============================================================================================================
40 
41 #include "plugingui.h"
42 
43 #include "arrow.h"
44 #include "pluginitem.h"
45 #include "pluginscene.h"
46 
50 #include <mne_x/Interfaces/IIO.h>
51 
52 
53 //*************************************************************************************************************
54 //=============================================================================================================
55 // Qt INCLUDES
56 //=============================================================================================================
57 
58 #include <QtWidgets>
59 #include <QDomDocument>
60 #include <QTextStream>
61 #include <QStandardPaths>
62 #include <QDir>
63 #include <QSettings>
64 
65 
66 //*************************************************************************************************************
67 //=============================================================================================================
68 // USED NAMESPACES
69 //=============================================================================================================
70 
71 using namespace MNEX;
72 
73 
74 //*************************************************************************************************************
75 //=============================================================================================================
76 // DEFINE MEMBER METHODS
77 //=============================================================================================================
78 
79 PluginGui::PluginGui(PluginManager *pPluginManager, PluginSceneManager *pPluginSceneManager)
80 : m_pPluginManager(pPluginManager)
81 , m_pPluginSceneManager(pPluginSceneManager)
82 , m_pCurrentPlugin(0)
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)
92 {
93  createActions();
94  createMenuItem();
95  createToolbars();
96 
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);
101 
102  connect(m_pPluginScene, &PluginScene::selectionChanged,
103  this, &PluginGui::newItemSelected);
104 
105  m_pGraphicsView = new QGraphicsView(m_pPluginScene);
106 
107  setCentralWidget(m_pGraphicsView);
108  setWindowTitle(tr("PluginScene"));
109  setUnifiedTitleAndToolBarOnMac(true);
110 
111  //To prevent deadlock on loading with a broken plugin -> save loading state
112  QSettings settings;
113  bool loadingState = settings.value(QString("MNE-X/loadingState"), false).toBool();
114 
115  if(loadingState)
116  {
117  settings.setValue(QString("MNE-X/loadingState"), false);
118  loadConfig(QStandardPaths::writableLocation(QStandardPaths::DataLocation), "default.xml");
119  }
120 
121  settings.setValue(QString("MNE-X/loadingState"), true);
122 }
123 
124 
125 //*************************************************************************************************************
126 
127 PluginGui::~PluginGui()
128 {
129  //
130  // Save current configuration
131  //
132  saveConfig(QStandardPaths::writableLocation(QStandardPaths::DataLocation),"default.xml");
133 
134  m_pCurrentPlugin.reset();
135 
136  //Plugin Toolbar
137  if(m_pSensorToolButton)
138  delete m_pSensorToolButton;
139  if(m_pAlgorithmToolButton)
140  delete m_pAlgorithmToolButton;
141  if(m_pIOToolButton)
142  delete m_pIOToolButton;
143  if(m_pToolBarPlugins)
144  delete m_pToolBarPlugins;
145  //Pointers Toolbar
146  if(m_pPointerButton)
147  delete m_pPointerButton;
148  if(m_pLinePointerButton)
149  delete m_pLinePointerButton;
150  if(m_pToolBarPointer)
151  delete m_pToolBarPointer;
152  //Item
153  if(m_pToolBarItem)
154  delete m_pToolBarItem;
155 
156  if(m_pGraphicsView)
157  delete m_pGraphicsView;
158 }
159 
160 
161 //*************************************************************************************************************
162 
164 {
165  foreach (QGraphicsItem *item, m_pPluginScene->items())
166  {
167  if(item->type() == PluginItem::Type)
168  {
169  if(removePlugin(qgraphicsitem_cast<PluginItem *>(item)->plugin()))
170  {
171  qgraphicsitem_cast<PluginItem *>(item)->removeArrows();
172  m_pPluginScene->removeItem(item);
173  delete item;
174  }
175  }
176  }
177 }
178 
179 
180 //*************************************************************************************************************
181 
182 void PluginGui::loadConfig(const QString& sPath, const QString& sFileName)
183 {
184  qDebug() << "load" << sPath+"/"+sFileName;
185 
186  QDomDocument doc("PluginConfig");
187  QFile file(sPath+"/"+sFileName);
188  if (!file.open(QIODevice::ReadOnly))
189  return;
190  if (!doc.setContent(&file)) {
191  file.close();
192  return;
193  }
194  file.close();
195 
196  clearScene();
197 
198  QDomElement docElem = doc.documentElement();
199  if(docElem.tagName() != "PluginTree")
200  {
201  qWarning() << sFileName << "not found!";
202  return;
203  }
204 
205  QDomNode nodePluginTree = docElem.firstChild();
206  while(!nodePluginTree.isNull()) {
207  QDomElement elementPluginTree = nodePluginTree.toElement();
208  //
209  // Create Plugins
210  //
211  if(elementPluginTree.tagName() == "Plugins") {
212  QDomNode nodePlugins = elementPluginTree.firstChild();
213  while(!nodePlugins.isNull())
214  {
215  QDomElement e = nodePlugins.toElement();
216  nodePlugins = nodePlugins.nextSibling();
217  if(!e.isNull()) {
218  QPointF pos((qreal)e.attribute("pos_x").toInt(),(qreal)e.attribute("pos_y").toInt());
219  QAction *pCurrentAction = Q_NULLPTR;
220 
221  for(qint32 i = 0; i < m_pActionGroupPlugins->actions().size(); ++i)
222  {
223  if(m_pActionGroupPlugins->actions()[i]->text() == e.attribute("name"))
224  {
225  pCurrentAction = m_pActionGroupPlugins->actions()[i];
226  break;
227  }
228  }
229 
230  if(!pCurrentAction)
231  continue;
232 
233  pCurrentAction->setChecked(true);
234  m_pPluginScene->setActionPluginItem(pCurrentAction);
235  m_pPluginScene->setMode(PluginScene::InsertPluginItem);
236  m_pPluginScene->insertItem(pos);
237  }
238  }
239  }
240  //
241  // Create Connections
242  //
243  if(elementPluginTree.tagName() == "Connections") {
244  QDomNode nodeConections = elementPluginTree.firstChild();
245  while(!nodeConections.isNull())
246  {
247  QDomElement e = nodeConections.toElement();
248  nodeConections = nodeConections.nextSibling();
249  if(!e.isNull()) {
250  qDebug() << qPrintable(e.tagName()) << e.attribute("receiver") << e.attribute("sender");
251 
252  QString sSender = e.attribute("sender");
253  QString sReceiver = e.attribute("receiver");
254 
255  //
256  // Start & End
257  //
258  PluginItem* startItem = Q_NULLPTR;
259  PluginItem* endItem = Q_NULLPTR;
260  for(qint32 i = 0; i < m_pPluginScene->items().size(); ++i)
261  {
262  PluginItem* item = qgraphicsitem_cast<PluginItem *>(m_pPluginScene->items()[i]);
263  if(item->plugin()->getName() == sSender)
264  startItem = item;
265 
266  if(item->plugin()->getName() == sReceiver)
267  endItem = item;
268 
269  }
270 
271  if(!startItem || !endItem)
272  continue;
273 
274  PluginConnectorConnection::SPtr pConnection = PluginConnectorConnection::create(startItem->plugin(), endItem->plugin());
275 
276  if(pConnection->isConnected())
277  {
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();
285  }
286 
287  }
288  }
289  }
290  nodePluginTree = nodePluginTree.nextSibling();
291  }
292 }
293 
294 
295 //*************************************************************************************************************
296 
297 void PluginGui::saveConfig(const QString& sPath, const QString& sFileName)
298 {
299  qDebug() << "Save Config" << sPath+"/"+sFileName;
300  QDomDocument doc("PluginConfig");
301  QDomElement root = doc.createElement("PluginTree");
302  doc.appendChild(root);
303 
304  //
305  // Plugins
306  //
307  QDomElement plugins = doc.createElement("Plugins");
308  root.appendChild(plugins);
309  IPlugin::SPtr pPlugin;
310  foreach (QGraphicsItem *item, m_pPluginScene->items())
311  {
312  if(item->type() == PluginItem::Type)
313  {
314  pPlugin = qgraphicsitem_cast<PluginItem *>(item)->plugin();
315 
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);
321  }
322  }
323 
324  //
325  // Connections
326  //
327  QDomElement connections = doc.createElement("Connections");
328  root.appendChild(connections);
330  foreach (QGraphicsItem *item, m_pPluginScene->items())
331  {
332  if(item->type() == Arrow::Type)
333  {
334  pConnection = qgraphicsitem_cast<Arrow *>(item)->connection();
335 
336  QDomElement connection = doc.createElement("Connection");
337  connection.setAttribute("sender",pConnection->getSender()->getName());
338  connection.setAttribute("receiver",pConnection->getReceiver()->getName());
339  connections.appendChild(connection);
340  }
341  }
342 
343  QString xml = doc.toString();
344 
345  QDir dir;
346  if(!dir.exists(sPath))
347  if(!dir.mkpath(sPath))
348  return;
349 
350  QFile file(sPath+"/"+sFileName);
351  if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
352  return;
353 
354  QTextStream out(&file);
355  out << xml;
356 }
357 
358 
359 //*************************************************************************************************************
360 
361 
362 void PluginGui::uiSetupRunningState(bool state)
363 {
364  if(state)
365  {
366  m_pToolBarPlugins->setEnabled(false);
367  m_pButtonGroupPointers->button(1)->setEnabled(false);
368  deleteAction->setEnabled(false);
369  }
370  else
371  {
372  m_pToolBarPlugins->setEnabled(true);
373  m_pButtonGroupPointers->button(1)->setEnabled(true);
374  deleteAction->setEnabled(true);
375  }
376 }
377 
378 
379 //*************************************************************************************************************
380 
381 bool PluginGui::removePlugin(IPlugin::SPtr pPlugin)
382 {
383  bool bRemoved = m_pPluginSceneManager->removePlugin(pPlugin);
384 
385  if(bRemoved)
386  {
387  //If single instance activate menu again
388  if(!pPlugin->multiInstanceAllowed())
389  {
390  QString sPluginName = pPlugin->getName();
391 
392  foreach (QAction *action, m_pActionGroupPlugins->actions())
393  {
394  if(action->text() == sPluginName)
395  {
396  action->setEnabled(true);
397  break;
398  }
399  }
400  }
401 
402  //Select the last added plugin
403  if(m_pPluginSceneManager->getPlugins().size() > 0)
404  m_pCurrentPlugin = m_pPluginSceneManager->getPlugins()[m_pPluginSceneManager->getPlugins().size()-1];
405  else
406  m_pCurrentPlugin.reset();
407 
408  selectedPluginChanged(m_pCurrentPlugin);
409  }
410 
411  return bRemoved;
412 }
413 
414 
415 //*************************************************************************************************************
416 
417 void PluginGui::actionGroupTriggered(QAction* action)
418 {
419  m_pPluginScene->setActionPluginItem(action);
420  m_pPluginScene->setMode(PluginScene::InsertPluginItem);
421 }
422 
423 
424 //*************************************************************************************************************
425 
426 void PluginGui::itemInserted(PluginItem *item)
427 {
428  Q_UNUSED(item);
429  m_pButtonGroupPointers->button(int(PluginScene::MovePluginItem))->setChecked(true);
430  m_pPluginScene->setMode(PluginScene::Mode(m_pButtonGroupPointers->checkedId()));
431 }
432 
433 
434 //*************************************************************************************************************
435 
436 void PluginGui::newItemSelected()
437 {
438  IPlugin::SPtr pPlugin;
440 
441  foreach (QGraphicsItem *item, m_pPluginScene->selectedItems())
442  {
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();
447 
448  }
449 
450  if(!pPlugin.isNull() && pPlugin != m_pCurrentPlugin)
451  {
452  m_pCurrentPlugin = pPlugin;
453  m_pCurrentConnection = PluginConnectorConnection::SPtr();
454  emit selectedPluginChanged(m_pCurrentPlugin);
455  }
456  else if(!pConnection.isNull() && pConnection != m_pCurrentConnection)
457  {
458  m_pCurrentConnection = pConnection;
459  m_pCurrentPlugin = IPlugin::SPtr();
460  emit selectedConnectionChanged(m_pCurrentConnection);
461  }
462 }
463 
464 
465 //*************************************************************************************************************
466 
467 void PluginGui::deleteItem()
468 {
469  //Remove Arrows ToDo Connections
470  foreach (QGraphicsItem *item, m_pPluginScene->selectedItems())
471  {
472  if (item->type() == Arrow::Type)
473  {
474  m_pPluginScene->removeItem(item);
475  Arrow *arrow = qgraphicsitem_cast<Arrow *>(item);
476  arrow->startItem()->removeArrow(arrow);
477  arrow->endItem()->removeArrow(arrow);
478  delete item;
479  }
480  }
481 
482  //Remove Items
483  foreach (QGraphicsItem *item, m_pPluginScene->selectedItems())
484  {
485  if (item->type() == PluginItem::Type)
486  {
487  if(removePlugin(qgraphicsitem_cast<PluginItem *>(item)->plugin()))
488  {
489  qgraphicsitem_cast<PluginItem *>(item)->removeArrows();
490 
491  m_pPluginScene->removeItem(item);
492  delete item;
493  }
494  }
495  }
496 }
497 
498 
499 //*************************************************************************************************************
500 
501 void PluginGui::pointerGroupClicked(int)
502 {
503  m_pPluginScene->setMode(PluginScene::Mode(m_pButtonGroupPointers->checkedId()));
504 }
505 
506 
507 //*************************************************************************************************************
508 
509 void PluginGui::bringToFront()
510 {
511  if (m_pPluginScene->selectedItems().isEmpty())
512  return;
513 
514  QGraphicsItem *selectedItem = m_pPluginScene->selectedItems().first();
515  QList<QGraphicsItem *> overlapItems = selectedItem->collidingItems();
516 
517  qreal zValue = 0;
518  foreach (QGraphicsItem *item, overlapItems) {
519  if (item->zValue() >= zValue && item->type() == PluginItem::Type)
520  zValue = item->zValue() + 0.1;
521  }
522  selectedItem->setZValue(zValue);
523 }
524 
525 
526 //*************************************************************************************************************
527 
528 void PluginGui::sendToBack()
529 {
530  if (m_pPluginScene->selectedItems().isEmpty())
531  return;
532 
533  QGraphicsItem *selectedItem = m_pPluginScene->selectedItems().first();
534  QList<QGraphicsItem *> overlapItems = selectedItem->collidingItems();
535 
536  qreal zValue = 0;
537  foreach (QGraphicsItem *item, overlapItems) {
538  if (item->zValue() <= zValue && item->type() == PluginItem::Type)
539  zValue = item->zValue() - 0.1;
540  }
541  selectedItem->setZValue(zValue);
542 }
543 
544 
545 //*************************************************************************************************************
546 
547 void PluginGui::createActions()
548 {
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);
553 
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);
559 
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);
564 }
565 
566 
567 //*************************************************************************************************************
568 
569 void PluginGui::createMenuItem()
570 {
571  m_pMenuItem = new QMenu;
572  m_pMenuItem->addAction(deleteAction);
573  m_pMenuItem->addSeparator();
574  m_pMenuItem->addAction(toFrontAction);
575  m_pMenuItem->addAction(sendBackAction);
576 }
577 
578 
579 //*************************************************************************************************************
580 
581 void PluginGui::createToolbars()
582 {
583  //Plugins Toolbar
584  m_pActionGroupPlugins = new QActionGroup(this);
585  m_pActionGroupPlugins->setExclusive(false);
586  connect(m_pActionGroupPlugins, &QActionGroup::triggered,
587  this, &PluginGui::actionGroupTriggered);
588 
589  //Sensors
590  m_pSensorToolButton = new QToolButton;
591  QMenu *menuSensors = new QMenu;
592  for(qint32 i = 0; i < m_pPluginManager->getSensorPlugins().size(); ++i)
593  createItemAction(m_pPluginManager->getSensorPlugins()[i]->getName(), menuSensors);
594 
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"));
600 
601  //Algorithms
602  m_pAlgorithmToolButton = new QToolButton;
603  QMenu *menuAlgorithms = new QMenu;
604  for(qint32 i = 0; i < m_pPluginManager->getAlgorithmPlugins().size(); ++i)
605  createItemAction(m_pPluginManager->getAlgorithmPlugins()[i]->getName(), menuAlgorithms);
606 
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"));
612 
613  //IOs
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);
618 
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"));
624 
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);
629 
630  m_pToolBarPlugins->setAllowedAreas(Qt::LeftToolBarArea);
631  m_pToolBarPlugins->setFloatable(false);
632  m_pToolBarPlugins->setMovable(false);
633 
634  addToolBar(Qt::LeftToolBarArea, m_pToolBarPlugins);
635 
636  //Pointers Toolbar
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"));
644 
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"));
651 
652  m_pButtonGroupPointers = new QButtonGroup(this);
653  m_pButtonGroupPointers->addButton(m_pPointerButton, int(PluginScene::MovePluginItem));
654  m_pButtonGroupPointers->addButton(m_pLinePointerButton, int(PluginScene::InsertLine));
655 
656  connect(m_pButtonGroupPointers, static_cast<void (QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
657  this, &PluginGui::pointerGroupClicked);
658 
659  m_pToolBarPointer = new QToolBar(tr("Pointer type"), this);
660 
661  m_pToolBarPointer->addWidget(m_pPointerButton);
662  m_pToolBarPointer->addWidget(m_pLinePointerButton);
663 
664  m_pToolBarPointer->setAllowedAreas(Qt::LeftToolBarArea);
665  m_pToolBarPointer->setFloatable(false);
666  m_pToolBarPointer->setMovable(false);
667 
668  addToolBar(Qt::LeftToolBarArea, m_pToolBarPointer);
669 
670  //Item
671  m_pToolBarItem = new QToolBar(tr("Item"), this);
672 
673  m_pToolBarItem->addAction(deleteAction);
674  m_pToolBarItem->addAction(toFrontAction);
675  m_pToolBarItem->addAction(sendBackAction);
676 
677  m_pToolBarItem->setAllowedAreas(Qt::LeftToolBarArea);
678  m_pToolBarItem->setFloatable(false);
679  m_pToolBarItem->setMovable(false);
680 
681  addToolBar(Qt::LeftToolBarArea, m_pToolBarItem);
682 }
683 
684 
685 //*************************************************************************************************************
686 
687 QAction* PluginGui::createItemAction(QString name, QMenu* menu)
688 {
689  QAction* action = menu->addAction(name);
690  m_pActionGroupPlugins->addAction(action);
691  return action;
692 }
Contains declaration of IIO interface class.
QSharedPointer< PluginConnectorConnection > SPtr
Contains declaration of IPlugin interface class.
void insertItem(const QPointF &pos)
Definition: pluginscene.cpp:85
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...
Definition: pluginmanager.h:82
void loadConfig(const QString &sPath, const QString &sFileName)
Definition: plugingui.cpp:182
QSharedPointer< IPlugin > SPtr
Definition: IPlugin.h:108
PluginScene class declaration.
Definition: arrow.h:75
The PluginSceneManager class manages plugins and connections of a set of plugins. ...
PluginItem class declaration.
Arrow class declaration.
void saveConfig(const QString &sPath, const QString &sFileName)
Definition: plugingui.cpp:297
bool removePlugin(const IPlugin::SPtr pPlugin)
const QVector< IIO * > & getIOPlugins()
const QVector< ISensor * > & getSensorPlugins()
Contains declaration of IIinverseAlgorithm interface class.