From 183dc8c48ef5392f526f9f300322d0dca20aac79 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Wed, 27 Jul 2022 12:40:27 -0700 Subject: [PATCH] nodeview: better implementation of larger connector hitboxes --- app/widget/nodeview/nodeview.cpp | 18 +----------------- app/widget/nodeview/nodeviewitem.cpp | 4 ++-- app/widget/nodeview/nodeviewitemconnector.cpp | 15 +++++++++++++++ app/widget/nodeview/nodeviewitemconnector.h | 3 +++ 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/app/widget/nodeview/nodeview.cpp b/app/widget/nodeview/nodeview.cpp index c820c902d..e757e6031 100644 --- a/app/widget/nodeview/nodeview.cpp +++ b/app/widget/nodeview/nodeview.cpp @@ -432,23 +432,7 @@ void NodeView::mousePressEvent(QMouseEvent *event) if (HandPress(event)) return; // Get the item that the user clicked on, if any - QGraphicsItem* item = nullptr; - { - // Prioritize connectors. I tried overriding boundingRect() and contains() on the connector - // object, but it ended up not working or causing other issues, so this is my hackier solution - const int radius = fontMetrics().height()/2; - QRect connector_rect(event->pos().x()-radius, event->pos().y()-radius, radius*2, radius*2); - QList items = this->items(connector_rect); - for (QGraphicsItem *i : items) { - if (dynamic_cast(i)) { - item = i; - break; - } - } - } - if (!item) { - item = itemAt(event->pos()); - } + QGraphicsItem* item = itemAt(event->pos()); if (event->button() == Qt::LeftButton) { // Sane defaults diff --git a/app/widget/nodeview/nodeviewitem.cpp b/app/widget/nodeview/nodeviewitem.cpp index 3879df6bd..7c6a78cee 100644 --- a/app/widget/nodeview/nodeviewitem.cpp +++ b/app/widget/nodeview/nodeviewitem.cpp @@ -581,7 +581,7 @@ QPointF NodeViewItem::GetInputPoint() const QPointF NodeViewItem::GetOutputPoint() const { QPointF p = output_connector_->scenePos(); - QRectF r = output_connector_->boundingRect(); + QRectF r = output_connector_->polygon().boundingRect(); switch (flow_dir_) { case NodeViewCommon::kLeftToRight: @@ -628,7 +628,7 @@ void NodeViewItem::UpdateNodePosition() void NodeViewItem::UpdateInputConnectorPosition() { - QRectF output_rect = input_connector_->boundingRect(); + QRectF output_rect = input_connector_->polygon().boundingRect(); NodeViewCommon::FlowDirection using_flow_dir = flow_dir_; diff --git a/app/widget/nodeview/nodeviewitemconnector.cpp b/app/widget/nodeview/nodeviewitemconnector.cpp index de723a36c..d8ad33fbc 100644 --- a/app/widget/nodeview/nodeviewitemconnector.cpp +++ b/app/widget/nodeview/nodeviewitemconnector.cpp @@ -81,4 +81,19 @@ void NodeViewItemConnector::SetFlowDirection(NodeViewCommon::FlowDirection dir) setPolygon(p); } +QPainterPath NodeViewItemConnector::shape() const +{ + // Yes, we skip QGraphicsPolygonItem because it adds the polygon. QGraphicsItem adds the + // boundingRect which we modify below + return QGraphicsItem::shape(); // clazy:exclude=skipped-base-method +} + +QRectF NodeViewItemConnector::boundingRect() const +{ + QRectF b = this->polygon().boundingRect(); + const int radius = QFontMetrics(QFont()).height()/2; + b.adjust(-radius, -radius, radius, radius); + return b; +} + } diff --git a/app/widget/nodeview/nodeviewitemconnector.h b/app/widget/nodeview/nodeviewitemconnector.h index b309f05e0..b207cb536 100644 --- a/app/widget/nodeview/nodeviewitemconnector.h +++ b/app/widget/nodeview/nodeviewitemconnector.h @@ -39,6 +39,9 @@ public: return output_; } + virtual QPainterPath shape() const override; + virtual QRectF boundingRect() const override; + private: bool output_;