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