From c8ead6e7b2b4e650b2e4d02a3124c75115b1ac28 Mon Sep 17 00:00:00 2001 From: parker Date: Tue, 24 Jun 2025 01:28:49 +0100 Subject: [PATCH] feat: add delete edge gradient --- src/gui/network/Network.cpp | 7 ++-- src/gui/network/NodeEdgeGraphic.cpp | 62 +++++++++++++++++++++-------- src/gui/network/NodeEdgeGraphic.h | 13 ++++-- 3 files changed, 58 insertions(+), 24 deletions(-) diff --git a/src/gui/network/Network.cpp b/src/gui/network/Network.cpp index c507679..d51a69f 100644 --- a/src/gui/network/Network.cpp +++ b/src/gui/network/Network.cpp @@ -87,7 +87,8 @@ void Network::deleteEdge(QGraphicsItem* edge) // view_->update(); // NOTE: deleting edge kept giving me segmentation faults // I coundn't figure it out so I'm just leaving it for now - delete edge; + // delete edge; + static_cast(edge)->cleanUp(); std::cout << "finished deleting edge\n----\n"; } @@ -268,14 +269,14 @@ void Network::highlightEdge(QGraphicsItem* edge, bool state) if(!edge || !isType(edge)) return; if(state) { - static_cast(edge)->setColor(QColor("red")); + static_cast(edge)->setDeleteHighlight(true); prevHoverItem_=edge; // NOTE: sloppy fix for color not updating view_->update(); } else { - static_cast(edge)->useDefaultColor(); + static_cast(edge)->setDeleteHighlight(false); // NOTE: sloppy fix for color not updating view_->update(); } diff --git a/src/gui/network/NodeEdgeGraphic.cpp b/src/gui/network/NodeEdgeGraphic.cpp index c1ea7ad..ff887bc 100644 --- a/src/gui/network/NodeEdgeGraphic.cpp +++ b/src/gui/network/NodeEdgeGraphic.cpp @@ -6,15 +6,32 @@ #include NodeEdgeGraphic::NodeEdgeGraphic(SocketGraphic* socket1, SocketGraphic* socket2, QGraphicsItem *parent) -: QGraphicsItem(parent), socket1_{socket1}, socket2_{socket2}, defaultColor_{QColor("white")}, pen_{QPen(QColor("white"))} +: QGraphicsItem(parent), socket1_{socket1}, socket2_{socket2}, defaultColor_{QColor("white")} { setZValue(-1); color_=defaultColor_; + defaultPen_=QPen(defaultColor_); + defaultPen_.setCapStyle(Qt::RoundCap); + + deleteHighlightPen_.setCapStyle(Qt::RoundCap); + deleteHighlightPen_.setWidth(1); + updateDeleteHighlightPen(); + socket1_->addEdge(this); socket2_->addEdge(this); } +void NodeEdgeGraphic::updateDeleteHighlightPen() +{ + QLinearGradient gradient(pos1_, pos2_); + gradient.setColorAt(0.0, QColor(255, 0, 0, 200)); + gradient.setColorAt(0.5, QColor(255, 0, 0, 50)); + gradient.setColorAt(1.0, QColor(255, 0, 0, 200)); + + deleteHighlightPen_.setBrush(QBrush(gradient)); +} + NodeEdgeGraphic::~NodeEdgeGraphic() { std::cout << "edge destructor\n"; @@ -28,29 +45,36 @@ void NodeEdgeGraphic::updatePath() path_.clear(); path_.moveTo(pos1_); path_.cubicTo(pos1_-QPoint(0,cubicStrength), pos2_+QPoint(0,cubicStrength), pos2_); + updateDeleteHighlightPen(); update(); } void NodeEdgeGraphic::setPos(QPointF pos1, QPointF pos2) { + prepareGeometryChange(); pos1_ = pos1; pos2_ = pos2; - prepareGeometryChange(); updatePath(); } +void NodeEdgeGraphic::setDeleteHighlight(bool enable) +{ + deleteHighlight_=enable; + update(); +} + void NodeEdgeGraphic::setStartPos(QPointF pos) { - pos1_ = pos; prepareGeometryChange(); + pos1_ = pos; updatePath(); } void NodeEdgeGraphic::setEndPos(QPointF pos) { - pos2_ = pos; prepareGeometryChange(); + pos2_ = pos; updatePath(); } @@ -72,30 +96,34 @@ QPainterPath NodeEdgeGraphic::shape() const{ return stroker.createStroke(path_); } -void NodeEdgeGraphic::setColor(QColor color) -{ - std::cout << "color set to: " << color.name().toStdString() << "\n"; - color_ = color; - pen_.setColor(color_); - update(); -} +// void NodeEdgeGraphic::setColor(QColor color) +// { +// std::cout << "color set to: " << color.name().toStdString() << "\n"; +// color_ = color; +// pen_.setColor(color_); +// update(); +// } -void NodeEdgeGraphic::useDefaultColor() -{ - setColor(defaultColor_); -} +// void NodeEdgeGraphic::useDefaultColor() +// { +// setColor(defaultColor_); +// } void NodeEdgeGraphic::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { // std::cout << "painting\n"; - pen_.setCapStyle(Qt::RoundCap); - painter->setPen(pen_); + painter->setPen(deleteHighlight_ ? deleteHighlightPen_ : defaultPen_); painter->drawPath(path_); } void NodeEdgeGraphic::cleanUp() { + // these probably aren't necessary but i'm trying to fix a bug + prepareGeometryChange(); + update(); + scene()->update(); + scene()->removeItem(this); socket1_->removeEdge(this); socket2_->removeEdge(this); diff --git a/src/gui/network/NodeEdgeGraphic.h b/src/gui/network/NodeEdgeGraphic.h index 6b5f377..e29042b 100644 --- a/src/gui/network/NodeEdgeGraphic.h +++ b/src/gui/network/NodeEdgeGraphic.h @@ -14,18 +14,24 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; QPainterPath shape() const override; - void setColor(QColor color); - void useDefaultColor(); + // void setColor(QColor color); + // void useDefaultColor(); + void updateDeleteHighlightPen(); void setPos(QPointF pos1, QPointF pos2); void setStartPos(QPointF pos); void setEndPos(QPointF pos); + void cleanUp(); + void setDeleteHighlight(bool enable); + QPen deleteHighlightPen_; + QPen defaultPen_; + + bool deleteHighlight_=false; private: SocketGraphic* socket1_; SocketGraphic* socket2_; QColor color_; QColor defaultColor_; - QPen pen_; QPointF pos1_; QPointF pos2_; QPainterPath path_; @@ -33,6 +39,5 @@ private: qreal padding_=40; void updatePath(); - void cleanUp(); };