From 817b3c9130d38abb56eda9c9b709d8ed63757214 Mon Sep 17 00:00:00 2001 From: Vasil Vasilev Date: Mon, 25 Feb 2019 01:29:01 +0200 Subject: [PATCH 1/4] Add embed/dembed widget posibility --- include/nodes/internal/FlowScene.hpp | 2 +- include/nodes/internal/NodeDataModel.hpp | 5 ++ include/nodes/internal/NodeGraphicsObject.hpp | 8 +-- src/FlowScene.cpp | 21 ++++++ src/NodeDataModel.cpp | 13 +++- src/NodeGeometry.cpp | 2 + src/NodeGraphicsObject.cpp | 69 +++++++++++++------ 7 files changed, 92 insertions(+), 28 deletions(-) diff --git a/include/nodes/internal/FlowScene.hpp b/include/nodes/internal/FlowScene.hpp index 172360161..a0cc07eff 100644 --- a/include/nodes/internal/FlowScene.hpp +++ b/include/nodes/internal/FlowScene.hpp @@ -147,7 +147,7 @@ private Q_SLOTS: void sendConnectionCreatedToNodes(Connection const& c); void sendConnectionDeletedToNodes(Connection const& c); - + void sceneContextMenuEvent(Node &node, const QPointF &pos); }; Node* diff --git a/include/nodes/internal/NodeDataModel.hpp b/include/nodes/internal/NodeDataModel.hpp index b65b9ecd7..cf0187068 100644 --- a/include/nodes/internal/NodeDataModel.hpp +++ b/include/nodes/internal/NodeDataModel.hpp @@ -124,6 +124,9 @@ class NODE_EDITOR_PUBLIC NodeDataModel virtual NodePainterDelegate* painterDelegate() const { return nullptr; } + bool wembed() const; + void setWembed(bool wembed); + public Q_SLOTS: virtual void @@ -162,6 +165,8 @@ public Q_SLOTS: void embeddedWidgetSizeUpdated(); +protected: + bool m_wembed; private: NodeStyle _nodeStyle; diff --git a/include/nodes/internal/NodeGraphicsObject.hpp b/include/nodes/internal/NodeGraphicsObject.hpp index fe87c6c80..e0014bcd1 100644 --- a/include/nodes/internal/NodeGraphicsObject.hpp +++ b/include/nodes/internal/NodeGraphicsObject.hpp @@ -54,6 +54,9 @@ class NodeGraphicsObject : public QGraphicsObject void lock(bool locked); + void + embedQWidget(bool embed=true); + protected: void paint(QPainter* painter, @@ -87,10 +90,6 @@ class NodeGraphicsObject : public QGraphicsObject void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override; -private: - void - embedQWidget(); - private: FlowScene & _scene; @@ -101,5 +100,6 @@ class NodeGraphicsObject : public QGraphicsObject // either nullptr or owned by parent QGraphicsItem QGraphicsProxyWidget * _proxyWidget; + }; } diff --git a/src/FlowScene.cpp b/src/FlowScene.cpp index 4e76e12fe..5e4d89b51 100644 --- a/src/FlowScene.cpp +++ b/src/FlowScene.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -50,6 +51,8 @@ FlowScene(std::shared_ptr registry, connect(this, &FlowScene::connectionCreated, this, &FlowScene::setupConnectionSignals); connect(this, &FlowScene::connectionCreated, this, &FlowScene::sendConnectionCreatedToNodes); connect(this, &FlowScene::connectionDeleted, this, &FlowScene::sendConnectionDeletedToNodes); + connect(this, &FlowScene::nodeContextMenu , this, &FlowScene::sceneContextMenuEvent); + } FlowScene:: @@ -607,6 +610,24 @@ sendConnectionDeletedToNodes(Connection const& c) to->nodeDataModel()->inputConnectionDeleted(c); } +void +FlowScene:: +sceneContextMenuEvent(Node &node, const QPointF &pos) +{ + QMenu menu; + QAction *embedAction = menu.addAction("Embed"); + QAction *deembedAction = menu.addAction("Deembed"); + QGraphicsView *v = node.nodeGraphicsObject().scene()->views().first(); + QPoint viewP = v->mapFromScene(pos); + QAction *selectedAction = menu.exec( v->viewport()->mapToGlobal(viewP) ); + if( selectedAction == embedAction ){ + node.nodeGraphicsObject().embedQWidget(true); + } + else if(selectedAction == deembedAction){ + node.nodeGraphicsObject().embedQWidget(false); + } +} + //------------------------------------------------------------------------------ namespace QtNodes diff --git a/src/NodeDataModel.cpp b/src/NodeDataModel.cpp index 9737b345d..19af0b368 100644 --- a/src/NodeDataModel.cpp +++ b/src/NodeDataModel.cpp @@ -7,7 +7,8 @@ using QtNodes::NodeStyle; NodeDataModel:: NodeDataModel() - : _nodeStyle(StyleCollection::nodeStyle()) + : m_wembed(false), _nodeStyle(StyleCollection::nodeStyle()) + { // Derived classes can initialize specific style here } @@ -39,3 +40,13 @@ setNodeStyle(NodeStyle const& style) { _nodeStyle = style; } + +bool NodeDataModel::wembed() const +{ + return m_wembed; +} + +void NodeDataModel::setWembed(bool wembed) +{ + m_wembed = wembed; +} diff --git a/src/NodeGeometry.cpp b/src/NodeGeometry.cpp index ded154369..4d4f42b7e 100644 --- a/src/NodeGeometry.cpp +++ b/src/NodeGeometry.cpp @@ -90,6 +90,7 @@ recalculateSize() const _height = step * maxNumOfEntries; } + if(_dataModel->wembed()) if (auto w = _dataModel->embeddedWidget()) { _height = std::max(_height, static_cast(w->height())); @@ -104,6 +105,7 @@ recalculateSize() const _outputPortWidth + 2 * _spacing; + if(_dataModel->wembed()) if (auto w = _dataModel->embeddedWidget()) { _width += w->width(); diff --git a/src/NodeGraphicsObject.cpp b/src/NodeGraphicsObject.cpp index 54872b64c..e0c0d7cea 100644 --- a/src/NodeGraphicsObject.cpp +++ b/src/NodeGraphicsObject.cpp @@ -29,6 +29,7 @@ NodeGraphicsObject(FlowScene &scene, , _node(node) , _locked(false) , _proxyWidget(nullptr) + { _scene.addItem(this); @@ -57,7 +58,7 @@ NodeGraphicsObject(FlowScene &scene, setZValue(0); - embedQWidget(); + embedQWidget( true ); // connect to the move signals to emit the move signals in FlowScene auto onMoveSlot = [this] { @@ -93,27 +94,44 @@ node() const void NodeGraphicsObject:: -embedQWidget() +embedQWidget( bool embed ) { - NodeGeometry & geom = _node.nodeGeometry(); - - if (auto w = _node.nodeDataModel()->embeddedWidget()) - { - _proxyWidget = new QGraphicsProxyWidget(this); - - _proxyWidget->setWidget(w); - - _proxyWidget->setPreferredWidth(5); - - geom.recalculateSize(); - - _proxyWidget->setPos(geom.widgetPosition()); - - update(); - - _proxyWidget->setOpacity(1.0); - _proxyWidget->setFlag(QGraphicsItem::ItemIgnoresParentOpacity); - } + NodeGeometry & geom = _node.nodeGeometry(); + _node.nodeDataModel()->setWembed( embed ); + if (auto w = _node.nodeDataModel()->embeddedWidget()) + { + if ( embed ){ + if ( nullptr == _proxyWidget ) { + _proxyWidget = new QGraphicsProxyWidget(this); + w->setParent(nullptr); + + _proxyWidget->setWidget(w); + + _proxyWidget->setPreferredWidth(5); + geom.recalculateSize(); + + _proxyWidget->setPos(geom.widgetPosition()); + + update(); + + _proxyWidget->setOpacity(1.0); + _proxyWidget->setFlag(QGraphicsItem::ItemIgnoresParentOpacity); + } + + }else{ + if ( nullptr != _proxyWidget ){ + _proxyWidget->setWidget(nullptr); + QPoint pos = QCursor::pos(); + delete _proxyWidget; + _proxyWidget = nullptr; + w->setWindowTitle(_node.nodeDataModel()->caption()); + w->setWindowFlags(Qt::Widget); + w->move(pos.x(),pos.y()); + w->show(); + w->raise(); + } + } + } } @@ -345,6 +363,11 @@ hoverEnterEvent(QGraphicsSceneHoverEvent * event) // bring this node forward setZValue(1.0); + if (auto w = _node.nodeDataModel()->embeddedWidget()) + { + w->raise(); + } + _node.nodeGeometry().setHovered(true); update(); _scene.nodeHovered(node(), event->screenPos()); @@ -398,5 +421,7 @@ void NodeGraphicsObject:: contextMenuEvent(QGraphicsSceneContextMenuEvent* event) { - _scene.nodeContextMenu(node(), mapToScene(event->pos())); + + _scene.nodeContextMenu(node(), mapToScene(event->pos())); + } From 05c61fc7bcd8164c4f08036f0c4488821a234262 Mon Sep 17 00:00:00 2001 From: Vasil Vasilev Date: Thu, 25 Apr 2019 12:55:58 +0300 Subject: [PATCH 2/4] Fix: free deembeded widget --- src/NodeGraphicsObject.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NodeGraphicsObject.cpp b/src/NodeGraphicsObject.cpp index e0c0d7cea..2f2cf3bfe 100644 --- a/src/NodeGraphicsObject.cpp +++ b/src/NodeGraphicsObject.cpp @@ -124,6 +124,7 @@ embedQWidget( bool embed ) QPoint pos = QCursor::pos(); delete _proxyWidget; _proxyWidget = nullptr; + connect(this,SIGNAL(destroyed()), w, SLOT(deleteLater())); w->setWindowTitle(_node.nodeDataModel()->caption()); w->setWindowFlags(Qt::Widget); w->move(pos.x(),pos.y()); From f1c44cf75bcc88fdb6ae72991ed112631e8c3b1e Mon Sep 17 00:00:00 2001 From: samiavasil Date: Sat, 27 Apr 2019 00:50:01 +0300 Subject: [PATCH 3/4] Fix NodeGraphicsObject draw on embed/deembed --- src/NodeGraphicsObject.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/NodeGraphicsObject.cpp b/src/NodeGraphicsObject.cpp index 2f2cf3bfe..b025c6e62 100644 --- a/src/NodeGraphicsObject.cpp +++ b/src/NodeGraphicsObject.cpp @@ -121,18 +121,24 @@ embedQWidget( bool embed ) }else{ if ( nullptr != _proxyWidget ){ _proxyWidget->setWidget(nullptr); - QPoint pos = QCursor::pos(); - delete _proxyWidget; + QPoint pos = QCursor::pos(); + _proxyWidget->deleteLater(); _proxyWidget = nullptr; connect(this,SIGNAL(destroyed()), w, SLOT(deleteLater())); + geom.recalculateSize(); + update(); w->setWindowTitle(_node.nodeDataModel()->caption()); w->setWindowFlags(Qt::Widget); w->move(pos.x(),pos.y()); w->show(); w->raise(); + } } } + + moveConnections(); + scene()->update(); } From aedb4b80a85ce01611e588e72b44ca7ee005d593 Mon Sep 17 00:00:00 2001 From: samiavasil Date: Wed, 27 Aug 2025 12:57:28 +0300 Subject: [PATCH 4/4] Remove already defined in std struct struct hash is already ddefined in new versions of std --- include/nodes/internal/QStringStdHash.hpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/include/nodes/internal/QStringStdHash.hpp b/include/nodes/internal/QStringStdHash.hpp index 3d47a3f84..eda6c3118 100644 --- a/include/nodes/internal/QStringStdHash.hpp +++ b/include/nodes/internal/QStringStdHash.hpp @@ -7,13 +7,13 @@ namespace std { -template<> -struct hash -{ - inline std::size_t - operator()(QString const &s) const - { - return qHash(s); - } -}; +//template<> +//struct hash +//{ +// inline std::size_t +// operator()(QString const &s) const +// { +// return qHash(s); +// } +//}; }