MNE-CPP  beta 1.0
pluginscene.cpp
Go to the documentation of this file.
1 //=============================================================================================================
36 //*************************************************************************************************************
37 //=============================================================================================================
38 // INCLUDES
39 //=============================================================================================================
40 
41 #include "pluginscene.h"
42 #include "plugingui.h"
43 #include "arrow.h"
44 
45 #include <QTextCursor>
46 #include <QGraphicsSceneMouseEvent>
47 #include <QAction>
48 
49 
50 //*************************************************************************************************************
51 //=============================================================================================================
52 // USED NAMESPACES
53 //=============================================================================================================
54 
55 using namespace MNEX;
56 
57 
58 //*************************************************************************************************************
59 //=============================================================================================================
60 // DEFINE MEMBER METHODS
61 //=============================================================================================================
62 
63 PluginScene::PluginScene(QMenu *pMenuPluginItem, PluginGui *pPluginGui)
64 : QGraphicsScene(pPluginGui)
65 , m_pPluginGui(pPluginGui)
66 {
67  m_pMenuPluginItem = pMenuPluginItem;
68  m_mode = MovePluginItem;
69 // m_itemType = PluginItem::Sensor;
70  line = 0;
71  m_qColorLine = QColor(65,113,156);
72 }
73 
74 
75 //*************************************************************************************************************
76 
77 PluginScene::~PluginScene()
78 {
79  this->clear();
80 }
81 
82 
83 //*************************************************************************************************************
84 
85 void PluginScene::insertItem(const QPointF& pos)
86 {
87  PluginItem *item;
88  IPlugin::SPtr pPlugin;
89  QString name;
90  switch (m_mode) {
91  case InsertPluginItem:
92  if(insertPlugin(m_pActionPluginItem, pPlugin))
93  {
94  name = m_pActionPluginItem->text();
95  item = new PluginItem(pPlugin, m_pMenuPluginItem);
96  addItem(item);
97  item->setPos(pos);
98  emit itemInserted(item);
99  }
100  else
101  {
102  //If insertion failed, disable insert action
103  m_pActionPluginItem->setEnabled(false);
104  }
105  break;
106  case InsertLine:
107  line = new QGraphicsLineItem(QLineF(pos,pos));
108  line->setPen(QPen(m_qColorLine, 1));
109  addItem(line);
110  break;
111  default:
112  ;
113  }
114 }
115 
116 //*************************************************************************************************************
117 
118 bool PluginScene::insertPlugin(QAction* pActionPluginItem, IPlugin::SPtr &pAddedPlugin)
119 {
120  if(pActionPluginItem->isEnabled())
121  {
122  QString name = pActionPluginItem->text();
123  qint32 idx = m_pPluginGui->m_pPluginManager->findByName(name);
124  IPlugin* pPlugin = m_pPluginGui->m_pPluginManager->getPlugins()[idx];
125 
126  if(m_pPluginGui->m_pPluginSceneManager->addPlugin(pPlugin, pAddedPlugin))
127  {
128  //If only single instance -> disable insert action
129  if(!pPlugin->multiInstanceAllowed())
130  pActionPluginItem->setEnabled(false);
131  return true;
132  }
133  }
134  return false;
135 
136 // return true;//DEBUG
137 }
138 
139 
140 //*************************************************************************************************************
141 
142 void PluginScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
143 {
144  if (mouseEvent->button() != Qt::LeftButton)
145  return;
146 
147  insertItem(mouseEvent->scenePos());
148 
149  QGraphicsScene::mousePressEvent(mouseEvent);
150 }
151 
152 
153 //*************************************************************************************************************
154 
155 void PluginScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
156 {
157  if (m_mode == InsertLine && line != 0) {
158  QLineF newLine(line->line().p1(), mouseEvent->scenePos());
159  line->setLine(newLine);
160  } else if (m_mode == MovePluginItem) {
161  QGraphicsScene::mouseMoveEvent(mouseEvent);
162  }
163 }
164 
165 
166 //*************************************************************************************************************
167 
168 void PluginScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
169 {
170  if (line != 0 && m_mode == InsertLine) {
171  QList<QGraphicsItem *> startItems = items(line->line().p1());
172  if (startItems.count() && startItems.first() == line)
173  startItems.removeFirst();
174  QList<QGraphicsItem *> endItems = items(line->line().p2());
175  if (endItems.count() && endItems.first() == line)
176  endItems.removeFirst();
177 
178  removeItem(line);
179  delete line;
180 
181  //Insert Connection
182  if (startItems.count() > 0 && endItems.count() > 0 &&
183  startItems.first()->type() == PluginItem::Type &&
184  endItems.first()->type() == PluginItem::Type &&
185  startItems.first() != endItems.first()) {
186 
187  PluginItem *startItem = qgraphicsitem_cast<PluginItem *>(startItems.first());
188  PluginItem *endItem = qgraphicsitem_cast<PluginItem *>(endItems.first());
189 
190  PluginConnectorConnection::SPtr pConnection = PluginConnectorConnection::create(startItem->plugin(), endItem->plugin());
191 
192  if(pConnection->isConnected())
193  {
194  Arrow *arrow = new Arrow(startItem, endItem, pConnection);
195  arrow->setColor(m_qColorLine);
196  startItem->addArrow(arrow);
197  endItem->addArrow(arrow);
198  arrow->setZValue(-1000.0);
199  addItem(arrow);
200  arrow->updatePosition();
201  }
202 
203 
204  }
205  }
206  line = 0;
207  QGraphicsScene::mouseReleaseEvent(mouseEvent);
208 }
209 
210 
212 
213 //bool PluginScene::isItemChange(int type)
214 //{
215 // foreach (QGraphicsItem *item, selectedItems()) {
216 // if (item->type() == type)
217 // return true;
218 // }
219 // return false;
220 //}
virtual bool multiInstanceAllowed() const =0
Definition: IPlugin.h:233
int findByName(const QString &name)
QSharedPointer< PluginConnectorConnection > SPtr
void insertItem(const QPointF &pos)
Definition: pluginscene.cpp:85
const QVector< IPlugin * > & getPlugins()
PluginGui class declaration.
static QSharedPointer< PluginConnectorConnection > create(IPlugin::SPtr sender, IPlugin::SPtr receiver, QObject *parent=0)
The IPlugin class is the base interface class of all plugins.
Definition: IPlugin.h:92
QSharedPointer< IPlugin > SPtr
Definition: IPlugin.h:108
PluginScene class declaration.
bool insertPlugin(QAction *pActionPluginItem, IPlugin::SPtr &pAddedPlugin)
Definition: arrow.h:75
bool addPlugin(const IPlugin *pPlugin, IPlugin::SPtr &pAddedPlugin)
Arrow class declaration.