feat: connect nodes

This commit is contained in:
parker
2025-06-21 03:00:38 +01:00
parent a6a0bec1c0
commit 38508293ff
6 changed files with 59 additions and 14 deletions

View File

@@ -42,11 +42,15 @@ Network::Network(QWidget* parent)
node2->setPos(50, 50); node2->setPos(50, 50);
scene_->addItem(node2); scene_->addItem(node2);
NodeGraphic* node3 = new NodeGraphic();
node3->setPos(50, 200);
scene_->addItem(node3);
NodeEdgeGraphic* edge1 = new NodeEdgeGraphic(node1->getOutput(0), node2->getInput(0)); NodeEdgeGraphic* edge1 = new NodeEdgeGraphic(node1->getOutput(0), node2->getInput(0));
scene_->addItem(edge1); scene_->addItem(edge1);
node1->addEdge(edge1); // node1->addEdge(edge1);
node2->addEdge(edge1); // node2->addEdge(edge1);
@@ -75,11 +79,19 @@ void Network::socketClicked(SocketGraphic* socket, QMouseEvent *event)
std::cout << "socket clicked\n"; std::cout << "socket clicked\n";
if(!floatingEdge_) if(!floatingEdge_)
{ {
startSocket_=socket;
std::cout << "creating floating edge\n"; std::cout << "creating floating edge\n";
floatingEdge_ = new FloatingEdgeGraphic(socket); floatingEdge_ = new FloatingEdgeGraphic(socket);
scene_->addItem(floatingEdge_); scene_->addItem(floatingEdge_);
floatingEdge_->setFloatPos(view_->mapToScene(event->pos())); floatingEdge_->setFloatPos(view_->mapToScene(event->pos()));
} }
// connect to opposite type
else if (socket->getIO()!=startSocket_->getIO())
{
NodeEdgeGraphic* newEdge = new NodeEdgeGraphic(startSocket_, socket);
scene_->addItem(newEdge);
destroyFloatingEdge();
}
} }
void Network::destroyFloatingEdge() void Network::destroyFloatingEdge()

View File

@@ -17,7 +17,10 @@ private:
QLayout* mainLayout_; QLayout* mainLayout_;
NetworkGraphicsScene* scene_; NetworkGraphicsScene* scene_;
NetworkGraphicsView* view_; NetworkGraphicsView* view_;
FloatingEdgeGraphic* floatingEdge_=nullptr; FloatingEdgeGraphic* floatingEdge_=nullptr;
SocketGraphic* startSocket_=nullptr;
void keyPressEvent(QKeyEvent *event) override; void keyPressEvent(QKeyEvent *event) override;
void destroyFloatingEdge(); void destroyFloatingEdge();

View File

@@ -21,19 +21,30 @@ NodeGraphic::NodeGraphic(QGraphicsItem *parent)
void NodeGraphic::initSockets() void NodeGraphic::initSockets()
{ {
auto* socketInput = new SocketGraphic(this); auto* socketInput = new SocketGraphic(SocketGraphic::SocketType::Input, this);
socketInput->setPos(bodyRect_.center().x(), bodyRect_.top()); socketInput->setPos(bodyRect_.center().x(), bodyRect_.top());
inputs_.push_back(socketInput); inputs_.push_back(socketInput);
auto* socketOutput = new SocketGraphic(this); auto* socketOutput = new SocketGraphic(SocketGraphic::SocketType::Output, this);
socketOutput->setPos(bodyRect_.center().x(), bodyRect_.bottom()); socketOutput->setPos(bodyRect_.center().x(), bodyRect_.bottom());
outputs_.push_back(socketOutput); outputs_.push_back(socketOutput);
} }
void NodeGraphic::addEdge(NodeEdgeGraphic* edge) // void setInputEdge(NodeEdgeGraphic* edge, int indx)
{ // {
edges_.push_back(edge);
} // }
// void setOutputEdge(NodeEdgeGraphic* edge, int indx)
// {
// }
// void NodeGraphic::addEdge(NodeEdgeGraphic* edge)
// {
// edges_.push_back(edge);
// }
SocketGraphic* NodeGraphic::getInput(int indx) const SocketGraphic* NodeGraphic::getInput(int indx) const
{ {

View File

@@ -15,10 +15,13 @@ public:
SocketGraphic* getInput(int indx) const; SocketGraphic* getInput(int indx) const;
SocketGraphic* getOutput(int indx) const; SocketGraphic* getOutput(int indx) const;
void addEdge(NodeEdgeGraphic* edge); // void addEdge(NodeEdgeGraphic* edge);
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
// void setInputEdge(NodeEdgeGraphic* edge, int indx);
// void setOutputEdge(NodeEdgeGraphic* edge, int indx);
@@ -27,7 +30,7 @@ private:
std::vector<SocketGraphic*> inputs_; std::vector<SocketGraphic*> inputs_;
std::vector<SocketGraphic*> outputs_; std::vector<SocketGraphic*> outputs_;
std::vector<NodeEdgeGraphic*> edges_; // std::vector<NodeEdgeGraphic*> edges_;
std::string title_=""; std::string title_="";
int maxTitleLen_=10; int maxTitleLen_=10;

View File

@@ -3,8 +3,8 @@
#include <iostream> #include <iostream>
#include <qgraphicsitem.h> #include <qgraphicsitem.h>
SocketGraphic::SocketGraphic(QGraphicsItem *parent) SocketGraphic::SocketGraphic(SocketGraphic::SocketType type, QGraphicsItem *parent)
: QGraphicsItem(parent) : QGraphicsItem(parent), type_{type}
{ {
brushActive_ = QBrush("white"); brushActive_ = QBrush("white");
brushInactive_ = QBrush("#9f9f9f"); brushInactive_ = QBrush("#9f9f9f");
@@ -15,10 +15,18 @@ SocketGraphic::SocketGraphic(QGraphicsItem *parent)
QRectF SocketGraphic::boundingRect() const QRectF SocketGraphic::boundingRect() const
{ {
float paddingScale = 10; float paddingScale = 10;
auto boundRect = QRect(-socketSize_/2.0f*paddingScale, -socketSize_/2.0f*paddingScale, socketSize_*paddingScale, socketSize_*paddingScale); auto boundRect = QRect(
-socketSize_/2.0f*paddingScale,
type_==SocketType::Input ? -socketSize_/2.0f*paddingScale : 0,
socketSize_*paddingScale,
socketSize_/2.0f*paddingScale
);
return boundRect; return boundRect;
} }
SocketGraphic::SocketType SocketGraphic::getIO() { return type_; }
void SocketGraphic::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) void SocketGraphic::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{ {
painter->setPen(Qt::NoPen); painter->setPen(Qt::NoPen);

View File

@@ -6,16 +6,24 @@ class SocketGraphic
: public QGraphicsItem : public QGraphicsItem
{ {
public: public:
SocketGraphic(QGraphicsItem *parent = nullptr);
QRectF boundingRect() const override; QRectF boundingRect() const override;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
enum class SocketType {
Input,
Output
};
SocketGraphic(SocketGraphic::SocketType type, QGraphicsItem *parent = nullptr);
SocketType getIO();
private: private:
int socketSize_ = 1; int socketSize_ = 1;
QBrush brushInactive_; QBrush brushInactive_;
QBrush brushActive_; QBrush brushActive_;
bool hovered_=false; bool hovered_=false;
SocketType type_;
protected: protected:
void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override; void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override;
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override; void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override;