Vuo  2.4.0
VuoRendererInputListDrawer.cc
Go to the documentation of this file.
1
11#include "VuoRendererPort.hh"
13
18 : VuoRendererInputDrawer(baseNode, signaler)
19{
20 dragInProgress = false;
21
22 this->dragHandleIsHovered = false;
23 mousePositionAtLastPortCountAdjustment = QPointF(NAN,NAN);
24
25 updateCachedBoundingRect();
26}
27
33void VuoRendererInputListDrawer::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
34{
35 drawBoundingRect(painter);
36 VuoRendererColors::SelectionType selectionType = (isEffectivelySelected()? VuoRendererColors::directSelection : VuoRendererColors::noSelection);
37 qint64 timeOfLastActivity = (getRenderActivity()? timeLastExecutionEnded : VuoRendererItem::notTrackingActivity);
38 VuoRendererColors *drawerColors = new VuoRendererColors(getBase()->getTintColor(),
39 selectionType,
40 false,
41 _eligibilityHighlight,
42 timeOfLastActivity);
43
44 VuoRendererColors *dragHandleColors = new VuoRendererColors(getBase()->getTintColor(),
45 selectionType,
46 dragHandleIsHovered,
47 _eligibilityHighlight,
48 timeOfLastActivity);
49
50 // Drawer frame
51 QPainterPath drawerFrame = getDrawerPath(true);
52 painter->fillPath(drawerFrame, drawerColors->nodeFill());
53
54 // Drag handle
55 if (dragHandleIsHovered)
56 {
57 painter->setClipPath(drawerFrame);
58 painter->fillRect(getDragHandleRect(), dragHandleColors->nodeFill());
59 painter->setClipping(false);
60 }
61 painter->fillPath(getMakeListDragHandlePath(), dragHandleColors->nodeFrame());
62
63 // Child input ports
65
66 delete drawerColors;
67 delete dragHandleColors;
68}
69
73QPainterPath VuoRendererInputListDrawer::getMakeListNodePath() const
74{
75 QPainterPath p;
76 p.addPath(getDrawerPath(true));
77 return p;
78}
79
83QPainterPath VuoRendererInputListDrawer::getMakeListDragHandlePath() const
84{
85 QPainterPath p;
86 QRectF r = getDragHandleRect();
87 QRectF r2(floor(r.center().x()) - 3, r.top()+2, 7, 1);
88 p.addRoundedRect(r2, 1,1);
89 return p;
90}
91
96{
97 return cachedBoundingRect;
98}
99
100void VuoRendererInputListDrawer::updateCachedBoundingRect()
101{
102 cachedBoundingRect = getMakeListNodePath().boundingRect();
103 cachedBoundingRect = cachedBoundingRect.united(getExtendedDragHandleRect());
104
105 // Antialiasing bleed
106 cachedBoundingRect.adjust(-1,-1,1,1);
107
108 cachedBoundingRect = cachedBoundingRect.toAlignedRect();
109}
110
115{
117 updateCachedBoundingRect();
118}
119
125{
126 QPainterPath p;
127 p.addPath(getDrawerPath(true));
128 p.addRect(getExtendedDragHandleRect());
129 p.setFillRule(Qt::WindingFill);
130
131 return p;
132}
133
137QRectF VuoRendererInputListDrawer::getDragHandleRect() const
138{
139 const qreal handleVerticalOffset = 6;
140 const qreal handleHeight = 6;
141 qreal drawerBottomExtensionWidth = getMaxDrawerLabelWidth();
142
143 return QRectF(VuoRendererPort::portRadius - 1,
144 drawerBottomExtensionHeight + handleVerticalOffset,
145 qRound(drawerBottomExtensionWidth) - VuoRendererPort::portRadius + 1,
146 handleHeight);
147}
148
153{
154 return getDragHandleRect().adjusted(-3,-5,3,5);
155}
156
161{
162 bool cursorAboveDragHandle = (getExtendedDragHandleRect().translated(this->scenePos()).contains(scenePos));
163 prepareGeometryChange();
164 dragHandleIsHovered = cursorAboveDragHandle;
165}
166
171{
172 bool cursorAboveDragHandle = (getExtendedDragHandleRect().translated(this->scenePos()).contains(scenePos));
173 prepareGeometryChange();
174 dragHandleIsHovered = cursorAboveDragHandle;
175}
176
181{
182 prepareGeometryChange();
183 dragHandleIsHovered = false;
184}
185
189void VuoRendererInputListDrawer::mousePressEvent(QGraphicsSceneMouseEvent *event)
190{
191 bool leftButtonPressed = (event->button() == Qt::LeftButton);
192 bool pressedOnDragHandle = (getExtendedDragHandleRect().contains(event->pos()));
193 if (leftButtonPressed && pressedOnDragHandle)
194 {
195 setDragInProgress(true);
196 mousePositionAtLastPortCountAdjustment = event->pos();
197 }
198
199 else
200 QGraphicsItem::mousePressEvent(event);
201}
202
206void VuoRendererInputListDrawer::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
207{
208 bool leftMouseButtonPressed = (event->buttons() & Qt::LeftButton);
209
210 if (leftMouseButtonPressed && dragInProgress)
211 {
212 if (isnan(mousePositionAtLastPortCountAdjustment.y()))
213 mousePositionAtLastPortCountAdjustment = event->pos();
214
215 QPointF delta = event->pos() - mousePositionAtLastPortCountAdjustment;
216 double steps = delta.y() / VuoRendererPort::portSpacing;
217
218 // If the user has dragged the drag handle down, add 1 or more input ports.
219 if (steps >= 1.)
220 triggerPortCountAdjustment(round(steps), event);
221
222 // If the user has dragged the drag handle up, remove 1 or more input ports.
223 else if (steps <= -1. && drawerPorts.size() >= 1)
224 triggerPortCountAdjustment(fmax(-(int)drawerPorts.size(), round(steps)), event);
225 }
226
227 else
228 QGraphicsItem::mouseMoveEvent(event);
229}
230
234void VuoRendererInputListDrawer::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
235{
236 if (event->button() == Qt::LeftButton)
237 {
238 if (scene() && (scene()->mouseGrabberItem() == this))
239 ungrabMouse();
240
241 setDragInProgress(false);
242
244 }
245
246 else
247 QGraphicsItem::mouseReleaseEvent(event);
248}
249
254{
256 this->dragInProgress = inProgress;
257
258 if (signaler)
260
261 mousePositionAtLastPortCountAdjustment = QPointF(NAN,NAN);
262}
263
268void VuoRendererInputListDrawer::triggerPortCountAdjustment(int portCountDelta, QGraphicsSceneMouseEvent *event)
269{
270 mousePositionAtLastPortCountAdjustment = event->pos();
271 dragHandleIsHovered = false;
272
273 if (signaler)
274 signaler->signalInputPortCountAdjustmentRequested(this, portCountDelta, true);
275}
276
281{
282 return getDrawerPath(true).boundingRect();
283}