BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
NodeEditor.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/SampleDesigner/NodeEditor.cpp
6 //! @brief Implements class NodeEditor
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
19 #include <QEvent>
20 #include <QGraphicsScene>
21 #include <QGraphicsSceneMouseEvent>
22 
23 NodeEditor::NodeEditor(QObject* parent) : QObject(parent), m_scene(0), m_conn(0) {}
24 
25 void NodeEditor::install(QGraphicsScene* scene)
26 {
27  scene->installEventFilter(this);
28  m_scene = scene;
29 }
30 
31 QGraphicsItem* NodeEditor::itemAt(const QPointF& pos)
32 {
33  QList<QGraphicsItem*> items = m_scene->items(QRectF(pos - QPointF(1, 1), QSize(3, 3)));
34 
35  for (QGraphicsItem* item : items)
36  if (item->type() > QGraphicsItem::UserType)
37  return item;
38 
39  return nullptr;
40 }
41 
42 bool NodeEditor::eventFilter(QObject* object, QEvent* event)
43 {
44  QGraphicsSceneMouseEvent* mouseEvent = dynamic_cast<QGraphicsSceneMouseEvent*>(event);
45  if (!mouseEvent)
46  return QObject::eventFilter(object, event);
47 
48  bool isProcessedEvent(false);
49 
50  if (event->type() == QEvent::GraphicsSceneMousePress) {
51  isProcessedEvent = processMousePress(mouseEvent);
52  } else if (event->type() == QEvent::GraphicsSceneMouseMove) {
53  isProcessedEvent = processMouseMove(mouseEvent);
54  } else if (event->type() == QEvent::GraphicsSceneMouseRelease) {
55  isProcessedEvent = processMouseRelease(mouseEvent);
56  }
57  return isProcessedEvent ? isProcessedEvent : QObject::eventFilter(object, event);
58 }
59 
60 bool NodeEditor::processMousePress(QGraphicsSceneMouseEvent* event)
61 {
62  bool result(false);
63 
64  if (m_conn == 0 && event->button() == Qt::LeftButton) {
65  QGraphicsItem* item = itemAt(event->scenePos());
66  if (item && item->type() == ViewTypes::NODE_EDITOR_PORT) {
70  m_conn->setPos1(item->scenePos());
71  m_conn->setPos2(event->scenePos());
72  m_conn->updatePath();
73 
74  result = true;
75  }
76  }
77  return result;
78 }
79 
80 bool NodeEditor::processMouseMove(QGraphicsSceneMouseEvent* event)
81 {
82  bool result(false);
83 
84  if (m_conn) {
85  m_conn->setPos2(event->scenePos());
86  m_conn->updatePath();
87  result = true;
88  }
89  return result;
90 }
91 
92 bool NodeEditor::processMouseRelease(QGraphicsSceneMouseEvent* event)
93 {
94  bool result(false);
95 
96  if (m_conn && event->button() == Qt::LeftButton) {
98 
99  QGraphicsItem* item = itemAt(event->scenePos());
100  if (item && item->type() == ViewTypes::NODE_EDITOR_PORT) {
101  NodeEditorPort* port1 = m_conn->port1();
102  NodeEditorPort* port2 = (NodeEditorPort*)item;
103 
104  if (port1->parentItem() != port2->parentItem() && port1->isOutput() != port2->isOutput()
105  && !port1->isConnected(port2) && port1->getPortType() == port2->getPortType()) {
106  m_conn->setPos2(port2->scenePos());
107  m_conn->setPort2(port2);
108  m_conn->updatePath();
110  m_conn = 0;
111  return true;
112  }
113  }
114  delete m_conn;
115  m_conn = 0;
116  result = true;
117  }
118  return result;
119 }
Defines class DesignerView.
Defines class NodeEditorConnection.
Defines class NodeEditorPort.
Defines class NodeEditor.
void setPort2(NodeEditorPort *p)
void setPos1(const QPointF &p)
void setPort1(NodeEditorPort *p)
void setPos2(const QPointF &p)
NodeEditorPort * port1() const
bool isConnected(NodeEditorPort *)
EPortType getPortType() const
QGraphicsItem * itemAt(const QPointF &)
Definition: NodeEditor.cpp:31
bool processMousePress(QGraphicsSceneMouseEvent *event)
Definition: NodeEditor.cpp:60
bool eventFilter(QObject *object, QEvent *event)
Definition: NodeEditor.cpp:42
void connectionIsEstablished(NodeEditorConnection *)
NodeEditorConnection * m_conn
Definition: NodeEditor.h:58
NodeEditor(QObject *parent=0)
Definition: NodeEditor.cpp:23
bool processMouseRelease(QGraphicsSceneMouseEvent *event)
Definition: NodeEditor.cpp:92
void install(QGraphicsScene *scene)
Definition: NodeEditor.cpp:25
QGraphicsScene * m_scene
Definition: NodeEditor.h:57
bool processMouseMove(QGraphicsSceneMouseEvent *event)
Definition: NodeEditor.cpp:80
void selectionModeChangeRequest(int)
@ NODE_EDITOR_PORT
Definition: ViewTypes.h:27