26 void drawPrimitive(PrimitiveElement element,
const QStyleOption *option, QPainter *painter,
const QWidget *widget)
const
28 if (element == QStyle::PE_IndicatorItemViewItemDrop)
30 QPen pen(QColor(160, 160, 160));
33 if (option->rect.height() == 0)
34 painter->drawLine(option->rect.topLeft(), option->rect.topRight());
36 painter->drawRect(option->rect);
39 QProxyStyle::drawPrimitive(element, option, painter, widget);
54 contextMenuSetPortConstant =
new QAction(tr(
"Edit Value…"), NULL);
55 contextMenuSetPortDetails =
new QAction(tr(
"Edit Details…"), NULL);
56 contextMenuRenamePublishedPort =
new QAction(tr(
"Rename Port…"), NULL);
57 contextMenuUnpublishPort =
new QAction(tr(
"Delete Port"), NULL);
59 connect(contextMenuSetPortConstant, &QAction::triggered,
this,
static_cast<void (
VuoPublishedPortList::*)()
>(&VuoPublishedPortList::editPublishedPortValue));
60 connect(contextMenuSetPortDetails, &QAction::triggered,
this, &VuoPublishedPortList::editPublishedPortDetails);
61 connect(contextMenuRenamePublishedPort, &QAction::triggered,
this,
static_cast<void (
VuoPublishedPortList::*)()
>(&VuoPublishedPortList::renamePublishedPort));
62 connect(contextMenuUnpublishPort, &QAction::triggered,
this, &VuoPublishedPortList::unpublishExternalPort);
64 setDragDropMode(QAbstractItemView::InternalMove);
65 setDefaultDropAction(Qt::MoveAction);
66 setAutoFillBackground(
true);
68 setStyleSheet(QString(
"VuoPublishedPortList {"
74 setMouseTracking(
true);
75 this->fillVerticalSpace =
true;
76 this->forwardingEventsToCanvas =
false;
77 menuSelectionInProgress =
false;
95 this->isInput = isInput;
103 this->composition = composition;
112 QListWidgetItem* activeListItem = itemAt(event->pos());
113 if (! activeListItem)
120 QMenu contextMenu(
this);
121 contextMenu.setSeparatorsCollapsible(
false);
127 if (valueEditableForPublishedPort(port))
128 contextMenu.addAction(contextMenuSetPortConstant);
130 if (detailsEditableForPublishedPort(port))
131 contextMenu.addAction(contextMenuSetPortDetails);
135 contextMenu.addAction(contextMenuRenamePublishedPort);
136 contextMenu.addAction(contextMenuUnpublishPort);
142 contextMenuRenamePublishedPort->setData(qVariantFromValue((
void *)activeListItem));
146 if (!contextMenu.actions().isEmpty())
148 menuSelectionInProgress =
true;
149 contextMenu.exec(event->globalPos());
150 menuSelectionInProgress =
false;
158 bool VuoPublishedPortList::valueEditableForPublishedPort(
VuoPublishedPort *port)
174 if (inputEditorLoadedForPortDataType)
175 inputEditorLoadedForPortDataType->deleteLater();
177 return inputEditorLoadedForPortDataType;
184 bool VuoPublishedPortList::detailsEditableForPublishedPort(
VuoPublishedPort *port)
198 return (dataType && ((dataType->
getModuleKey() ==
"VuoReal")
212 QListWidgetItem* activeListItem = itemAt(event->pos());
218 editPublishedPortValue(port);
222 QListWidget::mouseDoubleClickEvent(event);
230 if (! composition->views().empty())
238 QGraphicsSceneMouseEvent mouseEvent;
239 mouseEvent.setButton(event->button());
240 mouseEvent.setButtons(event->buttons());
241 mouseEvent.setScenePos(composition->views()[0]->mapToScene(composition->views()[0]->mapFromGlobal(
static_cast<QMouseEvent *
>(event)->globalPos())));
244 forwardingEventsToCanvas =
true;
251 QListWidgetItem* activeListItem = itemAt(event->pos());
252 if (activeListItem && (!(activeListItem->flags() & Qt::ItemIsEnabled)))
255 QListWidget::mousePressEvent(event);
263 if (forwardingEventsToCanvas)
265 QMouseEvent mouseEvent(QEvent::MouseMove,
266 composition->views()[0]->mapFromGlobal(event->globalPos()),
272 QApplication::sendEvent(composition->views()[0]->viewport(), &mouseEvent);
280 QListWidget::mouseMoveEvent(event);
288 if (forwardingEventsToCanvas)
290 QMouseEvent mouseEvent(QEvent::MouseButtonRelease,
291 composition->views()[0]->mapFromGlobal(event->globalPos()),
297 QApplication::sendEvent(composition->views()[0]->viewport(), &mouseEvent);
299 forwardingEventsToCanvas =
false;
304 QListWidget::mouseReleaseEvent(event);
313 bool dropWouldFallWithinProtocolPorts =
false;
314 QListWidgetItem* activeListItem = (count()? itemAt(event->pos()+QPoint(0,0.5*sizeHintForRow(0))) : NULL);
319 dropWouldFallWithinProtocolPorts =
true;
322 setDropIndicatorShown(!dropWouldFallWithinProtocolPorts);
323 QListWidget::dragMoveEvent(event);
341 return menuSelectionInProgress;
353 QListWidgetItem* activeListItem = itemAt(event->pos()+QPoint(0,0.5*sizeHintForRow(0)));
360 QDropEvent modifiedEvent(event->pos()+QPoint(0,sizeHintForRow(0)),
363 event->mouseButtons(),
364 event->keyboardModifiers());
371 QListWidget::dropEvent(event);
385 if (forwardingEventsToCanvas)
387 QKeyEvent keyEvent(QEvent::KeyPress, event->key(), event->modifiers());
388 QApplication::sendEvent(composition->views()[0]->viewport(), &keyEvent);
394 if (event->key() == Qt::Key_Return)
396 QList<QListWidgetItem *> selectedPorts = selectedItems();
397 for (QList<QListWidgetItem *>::iterator portItem = selectedPorts.begin(); portItem != selectedPorts.end(); ++portItem)
401 editPublishedPortValue(port);
406 QListWidget::keyPressEvent(event);
414 if (forwardingEventsToCanvas)
416 QKeyEvent keyEvent(QEvent::KeyRelease, event->key(), event->modifiers());
417 QApplication::sendEvent(composition->views()[0]->viewport(), &keyEvent);
423 QListWidget::keyReleaseEvent(event);
429 void VuoPublishedPortList::editPublishedPortValue()
431 QAction *sender =
static_cast<QAction *
>(QObject::sender());
434 editPublishedPortValue(port);
448 void VuoPublishedPortList::editPublishedPortDetails()
450 QAction *sender =
static_cast<QAction *
>(QObject::sender());
460 void VuoPublishedPortList::renamePublishedPort()
462 QAction *sender = (QAction *)QObject::sender();
463 QListWidgetItem * portListItem = (QListWidgetItem *)(sender->data().value<
void *>());
464 renamePublishedPort(portListItem);
470 void VuoPublishedPortList::renamePublishedPort(QListWidgetItem* portListItem)
481 void VuoPublishedPortList::updatePortOrder()
483 vector<VuoPublishedPort *> publishedPorts;
484 int numPorts = count();
485 for (
int portIndex = 0; portIndex < numPorts; ++portIndex)
487 QListWidgetItem *currentPortItem = this->item(portIndex);
499 void VuoPublishedPortList::unpublishExternalPort()
501 QAction *sender = (QAction *)QObject::sender();
513 if (this->fillVerticalSpace)
514 return QSize(QListWidget::sizeHint().width(), QWIDGETSIZE_MAX);
518 int cumulativeListHeight = 0;
519 int numRows = count();
520 for (
int rowIndex = 0; rowIndex < numRows; ++rowIndex)
521 cumulativeListHeight += sizeHintForRow(rowIndex);
523 return QSize(QListWidget::sizeHint().width(), cumulativeListHeight);
533 int numPorts = count();
534 for (
int portIndex = 0; portIndex < numPorts; ++portIndex)
536 QListWidgetItem *currentPortItem = this->item(portIndex);
538 QPoint connectionPoint = QPoint(isInput? viewport()->geometry().right() :
539 viewport()->geometry().left(),
540 viewport()->mapToParent(visualItemRect(currentPortItem).center()).y());
542 QPoint globalPos = viewport()->parentWidget()->mapToGlobal(connectionPoint);
544 if (composition && ! composition->views().empty())
546 QPoint compositionViewportPos = composition->views()[0]->mapFromGlobal(globalPos);
550 currentRenderedPublishedPort->setVisible(isVisible());
570 QPoint localPos = viewport()->parentWidget()->mapFromGlobal(globalPos);
572 int numPorts = count();
573 for (
int portIndex = 0; portIndex < numPorts; ++portIndex)
575 QListWidgetItem *currentPortItem = this->item(portIndex);
576 QRectF currentPortRect = visualItemRect(currentPortItem);
578 if (limitPortCollisionRange)
582 currentPortRect.top(),
584 currentPortRect.height());
586 currentPortRect = QRectF(currentPortRect.left(),
587 currentPortRect.top(),
589 currentPortRect.height());
592 currentPortRect.adjust(-xTolerance, 0, xTolerance, 0);
594 if (currentPortRect.contains(localPos))
606 int numPorts = count();
607 for (
int portIndex = 0; portIndex < numPorts; ++portIndex)
609 QListWidgetItem *currentPortItem = this->item(portIndex);
611 if (currentPort == port)
613 QPoint connectionPoint = QPoint(isInput? viewport()->geometry().right() :
614 viewport()->geometry().left(),
615 viewport()->mapToParent(visualItemRect(currentPortItem).center()).y());
617 return viewport()->parentWidget()->mapToGlobal(connectionPoint);
629 int numPorts = count();
630 for (
int portIndex = 0; portIndex < numPorts; ++portIndex)
632 QListWidgetItem *currentPortItem = this->item(portIndex);
633 currentPortItem->setSelected(
false);
642 this->fillVerticalSpace = fill;
643 setFixedHeight(
sizeHint().height());