diff --git a/CMakeLists.txt b/CMakeLists.txt index cd995a3..e8ffce0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,8 @@ qt_add_executable(${AppExec} src/Engine/Operator/Attribute.cpp src/Engine/Operator/Geometry.cpp + src/Engine/Operator/GeometryOperator.cpp + src/Engine/Network/NetworkManager.cpp ) target_link_libraries(${AppExec} PRIVATE Qt6::Core Qt6::Widgets Qt6::SvgWidgets Qt6::OpenGLWidgets glm::glm Eigen3::Eigen) diff --git a/src/Engine/Network/NetworkManager.cpp b/src/Engine/Network/NetworkManager.cpp index d61400d..015228f 100644 --- a/src/Engine/Network/NetworkManager.cpp +++ b/src/Engine/Network/NetworkManager.cpp @@ -1,14 +1,27 @@ #include "Engine/Network/NetworkManager.h" #include "Engine/Operator/GeometryOperator.h" +#include "Engine/Types.h" #include #include -bool enzo::nt::NetworkManager::addOperator() +enzo::nt::OpId enzo::nt::NetworkManager::addOperator() { gopStore_.emplace(++maxOpId_, std::make_unique()); - std::cout << "adding operator\n"; + std::cout << "adding operator " << maxOpId_ << "\n"; - return true; + return maxOpId_; } + +enzo::nt::NetworkManager* enzo::nt::NetworkManager::getInstance() +{ + if(instancePtr_==nullptr) + { + instancePtr_ = new enzo::nt::NetworkManager(); + } + return instancePtr_; +} + +enzo::nt::NetworkManager* enzo::nt::NetworkManager::instancePtr_ = nullptr; + diff --git a/src/Engine/Network/NetworkManager.h b/src/Engine/Network/NetworkManager.h index 902c9a9..3f9ed77 100644 --- a/src/Engine/Network/NetworkManager.h +++ b/src/Engine/Network/NetworkManager.h @@ -8,8 +8,16 @@ namespace enzo::nt { class NetworkManager { public: - bool addOperator(); + OpId addOperator(); + // delete copy constructor + NetworkManager(const NetworkManager& obj) = delete; + + static NetworkManager* getInstance(); + private: + static NetworkManager* instancePtr_; + NetworkManager() {}; + std::unordered_map> gopStore_; enzo::nt::OpId maxOpId_=0; diff --git a/src/gui/network/Network.cpp b/src/gui/network/Network.cpp index 8d65169..9ae835b 100644 --- a/src/gui/network/Network.cpp +++ b/src/gui/network/Network.cpp @@ -1,4 +1,5 @@ #include "gui/network/Network.h" +#include "Engine/Types.h" #include "gui/network/DisplayFlagButton.h" #include "gui/network/NodeEdgeGraphic.h" #include "gui/network/NetworkGraphicsView.h" @@ -6,6 +7,7 @@ #include "gui/network/NodeGraphic.h" #include "gui/network/FloatingEdgeGraphic.h" #include "gui/network/SocketGraphic.h" +#include "Engine/Network/NetworkManager.h" #include #include #include @@ -13,6 +15,8 @@ #include #include +using namespace enzo; + Network::Network(QWidget* parent) : QWidget(parent) { @@ -29,42 +33,6 @@ Network::Network(QWidget* parent) scene_ = new NetworkGraphicsScene(); view_ = new NetworkGraphicsView(this, this, scene_); - // QPen greenPen = QPen(Qt::green); - // greenPen.setWidth(6); - - // auto* rect1 = scene_->addRect(50, 50, 100, 100, greenPen); - // rect1->setFlag(QGraphicsItem::ItemIsMovable); - - // auto* rect2 = scene_->addRect(80, 120, 100, 100, greenPen); - // rect2->setFlag(QGraphicsItem::ItemIsMovable); - - // auto* rect3 = scene_->addRect(80, -120, 100, 100, greenPen); - // rect3->setFlag(QGraphicsItem::ItemIsMovable); - - NodeGraphic* node1 = new NodeGraphic(); - node1->setPos(-50, -50); - scene_->addItem(node1); - - NodeGraphic* node2 = new NodeGraphic(); - node2->setPos(50, 50); - scene_->addItem(node2); - - NodeGraphic* node3 = new NodeGraphic(); - node3->setPos(50, 200); - scene_->addItem(node3); - - NodeGraphic* node4 = new NodeGraphic(); - node4->setPos(50, -200); - scene_->addItem(node4); - - - - // scene_->addItem(new NodeEdgeGraphic(node1->getOutput(0), node2->getInput(0))); - - // node1->addEdge(edge1); - // node2->addEdge(edge1); - - mainLayout_->addWidget(view_); @@ -247,25 +215,41 @@ void Network::keyPressEvent(QKeyEvent *event) // get pos QPoint globalPos = QCursor::pos(); QPoint widgetPos = mapFromGlobal(globalPos); + QPointF viewPos = view_->mapToScene(widgetPos); + QList hoverItems = view_->items(widgetPos); // edge detection - if( - event->key() == Qt::Key_Control - ) + switch(event->key()) { - QGraphicsItem* hoverItem = itemOfType(hoverItems); - if(hoverItem!=nullptr) + + case( Qt::Key_Control): { - highlightEdge(hoverItem, true); + QGraphicsItem* hoverItem = itemOfType(hoverItems); + if(hoverItem!=nullptr) + { + highlightEdge(hoverItem, true); + } + break; } + case(Qt::Key_Escape): + { + destroyFloatingEdge(); + break; + } + case(Qt::Key_Tab): + { + nt::NetworkManager* nm = nt::NetworkManager::getInstance(); + if(nt::OpId id = nm->addOperator()) + { + NodeGraphic* newNode = new NodeGraphic(id); + newNode->setPos(viewPos); + scene_->addItem(newNode); + } - } - - if(event->key() == Qt::Key_Escape) - { - destroyFloatingEdge(); + break; + } } } diff --git a/src/gui/network/NodeGraphic.cpp b/src/gui/network/NodeGraphic.cpp index a7ab2fc..75851d9 100644 --- a/src/gui/network/NodeGraphic.cpp +++ b/src/gui/network/NodeGraphic.cpp @@ -12,8 +12,8 @@ #include #include "gui/network/NodeIconGraphic.h" -NodeGraphic::NodeGraphic(QGraphicsItem *parent) -: QGraphicsItem(parent) +NodeGraphic::NodeGraphic(enzo::nt::OpId id, QGraphicsItem *parent) +: QGraphicsItem(parent), opId_{id} { socketSize_ = 3; titlePadding_=1; diff --git a/src/gui/network/NodeGraphic.h b/src/gui/network/NodeGraphic.h index ad03e61..f48b0d2 100644 --- a/src/gui/network/NodeGraphic.h +++ b/src/gui/network/NodeGraphic.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include "Engine/Types.h" #include "gui/network/DisplayFlagButton.h" #include "gui/network/SocketGraphic.h" #include "gui/network/NodeIconGraphic.h" @@ -11,7 +12,7 @@ class NodeGraphic : public QGraphicsItem { public: - NodeGraphic(QGraphicsItem *parent = nullptr); + NodeGraphic(enzo::nt::OpId id, QGraphicsItem *parent = nullptr); QRectF boundingRect() const override; SocketGraphic* getInput(int indx) const; @@ -36,6 +37,7 @@ private: void initIcon(); void initFonts(); + enzo::nt::OpId opId_; std::vector inputs_; std::vector outputs_; diff --git a/tests/NetworkTests.cpp b/tests/NetworkTests.cpp index 60f3aa4..bff0ab2 100644 --- a/tests/NetworkTests.cpp +++ b/tests/NetworkTests.cpp @@ -4,7 +4,8 @@ TEST_CASE("network") { - enzo::nt::NetworkManager networkManager; - networkManager.addOperator(); + using namespace enzo; + nt::NetworkManager* nm = nt::NetworkManager::getInstance(); + nm->addOperator(); }