fix: edge bounding issues
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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_);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user