fix: edge bounding issues

This commit is contained in:
parker
2025-06-22 15:11:55 +01:00
parent 05f6674a70
commit 1f1250c076
5 changed files with 76 additions and 23 deletions

View File

@@ -54,8 +54,7 @@ Network::Network(QWidget* parent)
node4->setPos(50, -200); node4->setPos(50, -200);
scene_->addItem(node4); scene_->addItem(node4);
NodeEdgeGraphic* edge1 = new NodeEdgeGraphic(node1->getOutput(0), node2->getInput(0)); // scene_->addItem(new NodeEdgeGraphic(node1->getOutput(0), node2->getInput(0)));
scene_->addItem(edge1);
// node1->addEdge(edge1); // node1->addEdge(edge1);
// node2->addEdge(edge1); // node2->addEdge(edge1);
@@ -74,6 +73,16 @@ void Network::resizeEvent(QResizeEvent *event)
this->setMask(region); this->setMask(region);
} }
void Network::deleteEdge(QGraphicsItem* edge)
{
if(prevHoverItem_==edge)
{
prevHoverItem_=nullptr;
}
scene_->removeItem(edge);
delete edge;
}
void Network::leftMousePress(QMouseEvent *event) void Network::leftMousePress(QMouseEvent *event)
{ {
Qt::KeyboardModifiers mods = event->modifiers(); Qt::KeyboardModifiers mods = event->modifiers();
@@ -87,12 +96,7 @@ void Network::leftMousePress(QMouseEvent *event)
// delete edges // delete edges
if(mods & Qt::ControlModifier && clickedEdge) if(mods & Qt::ControlModifier && clickedEdge)
{ {
scene_->removeItem(clickedEdge); deleteEdge(clickedEdge);
if(prevHoverItem_==clickedEdge)
{
prevHoverItem_=nullptr;
}
delete clickedEdge;
} }
else if(clickedSocket) else if(clickedSocket)
{ {
@@ -125,6 +129,7 @@ void Network::socketClicked(SocketGraphic* socket, QMouseEvent *event)
else if (socket->getIO()!=startSocket_->getIO()) else if (socket->getIO()!=startSocket_->getIO())
{ {
NodeEdgeGraphic* newEdge = new NodeEdgeGraphic(startSocket_, socket); NodeEdgeGraphic* newEdge = new NodeEdgeGraphic(startSocket_, socket);
newEdge->setPos(startSocket_->scenePos(), socket->scenePos());
scene_->addItem(newEdge); scene_->addItem(newEdge);
destroyFloatingEdge(); destroyFloatingEdge();
} }
@@ -219,10 +224,14 @@ void Network::highlightEdge(QGraphicsItem* edge, bool state)
{ {
static_cast<NodeEdgeGraphic*>(edge)->setColor(QColor("red")); static_cast<NodeEdgeGraphic*>(edge)->setColor(QColor("red"));
prevHoverItem_=edge; prevHoverItem_=edge;
// NOTE: sloppy fix for color not updating
view_->update();
} }
else else
{ {
static_cast<NodeEdgeGraphic*>(edge)->useDefaultColor(); static_cast<NodeEdgeGraphic*>(edge)->useDefaultColor();
// NOTE: sloppy fix for color not updating
view_->update();
} }
} }
@@ -230,6 +239,7 @@ void Network::highlightEdge(QGraphicsItem* edge, bool state)
void Network::keyReleaseEvent(QKeyEvent *event) void Network::keyReleaseEvent(QKeyEvent *event)
{ {
std::cout << "released\n";
// modifiers // modifiers
Qt::KeyboardModifiers mods = event->modifiers(); Qt::KeyboardModifiers mods = event->modifiers();
bool ctrlMod = mods & Qt::ControlModifier; bool ctrlMod = mods & Qt::ControlModifier;

View File

@@ -1,5 +1,6 @@
#pragma once #pragma once
#include <QWidget> #include <QWidget>
#include <memory>
#include <qgraphicsitem.h> #include <qgraphicsitem.h>
#include <typeinfo> #include <typeinfo>
#include "gui/network/NetworkGraphicsView.h" #include "gui/network/NetworkGraphicsView.h"
@@ -8,6 +9,7 @@
#include "gui/network/SocketGraphic.h" #include "gui/network/SocketGraphic.h"
#include "gui/network/FloatingEdgeGraphic.h" #include "gui/network/FloatingEdgeGraphic.h"
#include <iostream> #include <iostream>
#include <QPointer>
class Network class Network
: public QWidget : public QWidget
@@ -26,11 +28,14 @@ private:
SocketGraphic* startSocket_=nullptr; SocketGraphic* startSocket_=nullptr;
QGraphicsItem* prevHoverItem_=nullptr; QGraphicsItem* prevHoverItem_=nullptr;
QList<QGraphicsItem*> prevHoverItems_; // QPointer<QGraphicsItem> prevHoverItem_=nullptr;
// std::shared_ptr<QGraphicsItem> prevHoverItem_=nullptr;
// QList<QGraphicsItem*> prevHoverItems_;
void keyPressEvent(QKeyEvent *event) override; void keyPressEvent(QKeyEvent *event) override;
void keyReleaseEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override;
void destroyFloatingEdge(); void destroyFloatingEdge();
void deleteEdge(QGraphicsItem* edge);
void highlightEdge(QGraphicsItem* edge, bool state); void highlightEdge(QGraphicsItem* edge, bool state);

View File

@@ -21,24 +21,50 @@ NodeEdgeGraphic::~NodeEdgeGraphic()
socket2_->removeEdge(this); socket2_->removeEdge(this);
} }
void NodeEdgeGraphic::updatePath()
{
path_.clear();
path_.moveTo(pos1_);
path_.lineTo(pos2_);
}
void NodeEdgeGraphic::setPos(QPointF pos1, QPointF pos2)
{
pos1_ = pos1;
pos2_ = pos2;
updatePath();
// prepareGeometryChange();
}
void NodeEdgeGraphic::setStartPos(QPointF pos)
{
pos1_ = pos;
updatePath();
// prepareGeometryChange();
}
void NodeEdgeGraphic::setEndPos(QPointF pos)
{
pos2_ = pos;
updatePath();
// prepareGeometryChange();
}
QRectF NodeEdgeGraphic::boundingRect() const QRectF NodeEdgeGraphic::boundingRect() const
{ {
// std::cout << "bounds set" << socket1_->scenePos().x() << " " << socket1_->scenePos().y() << " " << socket2_->scenePos().x() << " " << socket2_->scenePos().y() << "\n"; // std::cout << "bounds set" << socket1_->scenePos().x() << " " << socket1_->scenePos().y() << " " << socket2_->scenePos().x() << " " << socket2_->scenePos().y() << "\n";
auto boundRect = QRectF(socket1_->scenePos(), socket2_->scenePos()); QRectF boundRect_ = QRectF(pos1_, pos2_).normalized();
return boundRect; return boundRect_;
} }
QPainterPath NodeEdgeGraphic::shape() const{ QPainterPath NodeEdgeGraphic::shape() const{
// FIX: shape not changing with node position // FIX: shape not changing with node position
QPainterPath path; std::cout << "setting shape to: " << socket1_->scenePos().x() << " " << socket2_->scenePos().x() <<"\n";
// std::cout << "setting shape to: " << socket1_->scenePos().x() << " " << socket2_->scenePos().x() <<"\n";
path.moveTo(socket1_->scenePos());
path.lineTo(socket2_->scenePos());
QPainterPathStroker stroker; QPainterPathStroker stroker;
stroker.setWidth(10); stroker.setWidth(40);
return stroker.createStroke(path); return stroker.createStroke(path_);
} }
void NodeEdgeGraphic::setColor(QColor color) void NodeEdgeGraphic::setColor(QColor color)
@@ -59,7 +85,7 @@ void NodeEdgeGraphic::paint(QPainter *painter, const QStyleOptionGraphicsItem *o
std::cout << "painting\n"; std::cout << "painting\n";
pen_.setCapStyle(Qt::RoundCap); pen_.setCapStyle(Qt::RoundCap);
painter->setPen(pen_); painter->setPen(pen_);
painter->drawLine(socket1_->scenePos(),socket2_->scenePos()); painter->drawPath(path_);
} }

View File

@@ -16,6 +16,9 @@ public:
QPainterPath shape() const override; QPainterPath shape() const override;
void setColor(QColor color); void setColor(QColor color);
void useDefaultColor(); void useDefaultColor();
void setPos(QPointF pos1, QPointF pos2);
void setStartPos(QPointF pos);
void setEndPos(QPointF pos);
private: private:
SocketGraphic* socket1_; SocketGraphic* socket1_;
@@ -23,5 +26,11 @@ private:
QColor color_; QColor color_;
QColor defaultColor_; QColor defaultColor_;
QPen pen_; QPen pen_;
QPointF pos1_;
QPointF pos2_;
QPainterPath path_;
QRectF boundRect_;
void updatePath();
}; };

View File

@@ -21,8 +21,10 @@ void SocketGraphic::addEdge(NodeEdgeGraphic* edge)
void SocketGraphic::removeEdge(NodeEdgeGraphic* edge) void SocketGraphic::removeEdge(NodeEdgeGraphic* edge)
{ {
edges_.erase(edge);
std::cout << "removing edge\n"; std::cout << "removing edge\n";
std::cout << "before size: " << edges_.size() << "\n";
edges_.erase(edge);
std::cout << "after size: " << edges_.size() << "\n";
// auto it = find(edges_.begin(), edges_.end(), edge); // auto it = find(edges_.begin(), edges_.end(), edge);
// if(it!=edges_.end()) // if(it!=edges_.end())
// { // {
@@ -35,10 +37,11 @@ void SocketGraphic::posChanged(QPointF pos)
{ {
std::cout << "socket pos changed\n"; std::cout << "socket pos changed\n";
// //
// for(auto* edge : edges_) for(auto* edge : edges_)
// { {
// edge->prepareGeometryChange(); // edge->setPos(startSocket_->scenePos(), socket->scenePos());
// } edge->setStartPos(this->scenePos());
}
} }