Vuo  2.3.2
VuoRendererInputListDrawer.cc
Go to the documentation of this file.
1 
11 #include "VuoRendererPort.hh"
12 #include "VuoRendererSignaler.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 
33 void 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
64  layoutPorts();
65 
66  delete drawerColors;
67  delete dragHandleColors;
68 }
69 
73 QPainterPath VuoRendererInputListDrawer::getMakeListNodePath() const
74 {
75  QPainterPath p;
76  p.addPath(getDrawerPath(true));
77  return p;
78 }
79 
83 QPainterPath 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 
100 void 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 
137 QRectF 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 
189 void 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 
206 void 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 
234 void 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 {
255  updateGeometry();
256  this->dragInProgress = inProgress;
257 
258  if (signaler)
260 
261  mousePositionAtLastPortCountAdjustment = QPointF(NAN,NAN);
262 }
263 
268 void 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 }