YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
destinationportitem.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-License-Identifier: LGPL-2.1-or-later
4 */
5
7#include <QGraphicsDropShadowEffect>
8#include <QDebug>
9#include <QCursor>
10#include <QGraphicsScene>
11#include <QLineEdit>
12
13
14DestinationPortItem::DestinationPortItem(QString itemName, bool isInApp,
15 bool editOnStart, Application *app, BuilderItem *parent) : BuilderItem(parent)
16{
18 this->itemName = itemName;
19 errorState = false;
20 portAvailable = false;
21 sigHandler = new ItemSignalHandler((QGraphicsItem*)this,DestinationPortItemType,nullptr);
22 pressed = false;
23 moved = false;
24 this->nestedInApp = isInApp;
25 this->parent = parent;
26 this->app = app;
27
28 QFontMetrics fontMetric(font);
29#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
30 int textWidth = fontMetric.horizontalAdvance(itemName);
31#else
32 int textWidth = fontMetric.width(itemName);
33#endif
34
35 prepareGeometryChange();
36 mainRect = QRectF(-((2*PORT_TEXT_WIDTH) + textWidth)/2,-16,(2*PORT_TEXT_WIDTH) + textWidth,32);
37
38 boundingR = QRectF(mainRect);
39
40 setToolTip(itemName);
41
42 setFlag(ItemIsMovable,!isInApp);
43 setFlag(ItemIsSelectable,true);
44 setFlag(ItemSendsGeometryChanges,!isInApp);
45
46 if(!isInApp){
47 auto* effect = new QGraphicsDropShadowEffect();
48 effect->setColor(QColor(80,80,80,80));
49 effect->setBlurRadius(5);
50 setGraphicsEffect(effect);
51 }
52
53 allowInputs = true;
54 allowOutputs= false;
55
56 lineEditWidget = new QGraphicsProxyWidget(this);
57 auto* lineEdit = new QLineEdit();
58 QObject::connect(lineEdit,SIGNAL(editingFinished()),signalHandler(),SLOT(onEditingFinished()));
59 QObject::connect(lineEdit,SIGNAL(returnPressed()),signalHandler(),SLOT(onEditingFinished()));
60 lineEdit->setText(itemName);
61 lineEditWidget->setWidget(lineEdit);
62 if(editOnStart){
63 lineEditWidget->setVisible(true);
64 }else{
65 lineEditWidget->setVisible(false);
66 }
67 QRectF geo = lineEditWidget->geometry();
68 geo.setWidth(textWidth);
69 lineEditWidget->setGeometry(geo);
70 lineEditWidget->setPos(-textWidth/2,-lineEditWidget->geometry().height()/2);
71}
72
74{
75 hide();
77 delete sigHandler;
78 //scene()->removeItem(lineEditWidget);
79 delete lineEditWidget;
80 //scene()->removeItem(this);
81}
82
83
85{
86 return (int)(UserType + (int)itemType);
87}
88void DestinationPortItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
89{
90 //painter->fillRect(boundingRect(),QBrush(Qt::red));
91
92 QBrush availableBrush;
93 if(!portAvailable){
94 availableBrush = QBrush(QColor("#BF0303"));
95 }else{
96 availableBrush = QBrush(QColor("#00E400"));
97 }
98 if(!nestedInApp){
99 painter->setPen(QPen(availableBrush,BORDERWIDTH));
100 }else{
101 painter->setPen(QPen(availableBrush,BORDERWIDTH,Qt::DashLine));
102 }
103 QPainterPath path;
104 path.moveTo(mainRect.x(),mainRect.y());
105 path.lineTo(mainRect.x() + mainRect.width(), mainRect.y());
106 path.lineTo(mainRect.x() + mainRect.width(),mainRect.y() + mainRect.height());
107 path.lineTo(mainRect.x(),mainRect.y() + mainRect.height());
108 path.lineTo(mainRect.x() +10 ,mainRect.y() + mainRect.height()/2);
109 path.lineTo(mainRect.x(),mainRect.y());
110 if (isSelected()) {
111 painter->setBrush(QBrush(QColor(220,220,220)));
112 }else{
113 painter->setBrush(QBrush(QColor(245,245,245)));
114 }
115 painter->drawPath(path);
116
117 //TEXT
118 if(!lineEditWidget->isVisible()){
119 painter->setPen(QPen(QBrush(QColor(Qt::black)),1));
120 painter->drawText(mainRect,Qt::AlignCenter,itemName);
121 }else{
122 if(!isSelected()){
123 painter->setPen(QPen(QBrush(QColor(Qt::black)),1));
124 painter->drawText(mainRect,Qt::AlignCenter,itemName);
125 }
126 }
127
128}
129
131{
132 return errorState;
133}
134
135
137{
138 QString text = ((QLineEdit*)lineEditWidget->widget())->text();
139
140 for (int i=0;i<scene()->items().count();i++){
141 QGraphicsItem *it = scene()->items().at(i);
142 if((it->type() == QGraphicsItem::UserType + DestinationPortItemType || it->type() == QGraphicsItem::UserType + SourcePortItemType) && (it != this)){
143 if(((DestinationPortItem*)it)->getItemName() == text){
144 ((QLineEdit*)lineEditWidget->widget())->setStyleSheet("QLineEdit { background-color: red;}");
145 ((QLineEdit*)lineEditWidget->widget())->setToolTip(tr("Duplicate Entry"));
146 allowOutputs = false;
147 errorState = true;
148 return;
149 }
150 }
151 }
152 errorState = false;
153 allowOutputs = true;
154
155 ((QLineEdit*)lineEditWidget->widget())->setStyleSheet("QLineEdit { background-color: white;}");
156 ((QLineEdit*)lineEditWidget->widget())->setToolTip("");
157
158 this->itemName = text;
159 lineEditWidget->setVisible(false);
160
161 QFontMetrics fontMetric(font);
162#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
163 int textWidth = fontMetric.horizontalAdvance(itemName);
164#else
165 int textWidth = fontMetric.width(itemName);
166#endif
167
168 prepareGeometryChange();
169 mainRect = QRectF(-((2*PORT_TEXT_WIDTH) + textWidth)/2,-15,(2*PORT_TEXT_WIDTH) + textWidth,30);
170 boundingR = QRectF(mainRect);
171 setToolTip(itemName);
172
173 QRectF geo = lineEditWidget->geometry();
174 geo.setWidth(textWidth);
175 lineEditWidget->setGeometry(geo);
176 lineEditWidget->setPos(-textWidth/2,-lineEditWidget->geometry().height()/2);
177 emit signalHandler()->modified();
178
180 updateConnectionsTo(this->itemName);
181 update();
182}
183
184
185void DestinationPortItem::updateConnectionsTo(QString to){
186 foreach (Arrow *arrow, arrows) {
187 if(arrow){
188 arrow->updateConnectionTo(to);
189 }
190 }
191}
192
193
194
195void DestinationPortItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
196{
197 lineEditWidget->setVisible(true);
198 update();
199 //QGraphicsItem::mouseDoubleClickEvent(event);
200}
201
203{
204 QRectF br = QRectF(boundingR.x() - BORDERWIDTH, boundingR.y() - BORDERWIDTH , boundingR.width() + (2*BORDERWIDTH), boundingR.height() + (2*BORDERWIDTH));
205 return br;
206}
207
208
209
210
211void DestinationPortItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
212{
213 moved = true;
214// if(pressed){
215// ((DestinationPortItem*)this)->updateConnections();
216// }
217 QGraphicsItem::mouseMoveEvent(event);
218}
219
220void DestinationPortItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
221{
222 pressed = true;
223 //setZValue(zValue() + 10);
224 QGraphicsItem::mousePressEvent(event);
225}
226
228{
229 QPointF startIngPoint;
230 startIngPoint = QPointF(mainRect.x() +10 ,mainRect.y() + mainRect.height()/2);
231 return startIngPoint;
232}
233
234void DestinationPortItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
235{
236 if(moved && !nestedInApp){
237 emit sigHandler->modified();
238 foreach (Arrow *arrow, arrows) {
239 arrow->updateModel();
240 }
241 }
242 if(!moved && event->modifiers() == Qt::NoModifier && event->button() == Qt::LeftButton){
244 }
245 pressed = false;
246 moved = false;
247 //setZValue(zValue() - 10);
248
249 QGraphicsItem::mouseReleaseEvent(event);
250}
251
252
253
254QVariant DestinationPortItem::itemChange(GraphicsItemChange change, const QVariant &value)
255{
256 if (change == QGraphicsItem::ItemPositionChange) {
257 foreach (Arrow *arrow, arrows) {
258 arrow->updatePosition();
259 }
260 if(snap && !nestedInApp){
261 QPointF newPos = value.toPointF();
262 QPointF closestPoint = computeTopLeftGridPoint(newPos);
263 return closestPoint+=offset;
264 }
265 }
266
267 return value;
268}
269
271{
272 portAvailable = available;
273 update();
274}
int SIGNAL(int pid, int signum)
Definition arrow.h:106
void updateModel()
Definition arrow.cpp:252
void updateConnectionTo(QString to)
Definition arrow.cpp:191
void updatePosition()
Definition arrow.cpp:329
ItemSignalHandler * sigHandler
Definition builderitem.h:90
QPointF computeTopLeftGridPoint(const QPointF &pointP)
QString itemName
Definition builderitem.h:75
QPointF offset
Definition builderitem.h:80
bool allowInputs
Definition builderitem.h:85
bool allowOutputs
Definition builderitem.h:86
QString getItemName()
void removeArrows()
bool nestedInApp
Definition builderitem.h:88
ItemSignalHandler * signalHandler()
QRectF mainRect
Definition builderitem.h:77
QRectF boundingR
Definition builderitem.h:78
QList< Arrow * > arrows
Definition builderitem.h:91
void updateConnections()
ItemType itemType
Definition builderitem.h:74
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *e) override
void mouseMoveEvent(QGraphicsSceneMouseEvent *e) override
int type() const override
QPointF connectionPoint() override
void mouseReleaseEvent(QGraphicsSceneMouseEvent *e) override
QRectF boundingRect() const override
void mousePressEvent(QGraphicsSceneMouseEvent *e) override
DestinationPortItem(QString itemName, bool nestedInApp=false, bool editOnStart=false, Application *app=NULL, BuilderItem *parent=0)
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget=0) override
QVariant itemChange(GraphicsItemChange change, const QVariant &value) override
void newConnectionAdded(QPointF, QGraphicsItem *it)
Class Application.
#define PORT_TEXT_WIDTH
Definition commons.h:10
@ SourcePortItemType
Definition commons.h:17
@ DestinationPortItemType
Definition commons.h:17
#define BORDERWIDTH
Definition commons.h:9