// Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef NODEVIEW_H #define NODEVIEW_H #include #include #include "nodesmodel.h" #include "arrowsmodel.h" class EffectManager; class NodeView : public QQuickItem { Q_OBJECT Q_PROPERTY(NodesModel *nodesModel READ nodesModel NOTIFY nodesModelChanged) Q_PROPERTY(ArrowsModel *arrowsModel READ arrowsModel NOTIFY arrowsModelChanged) Q_PROPERTY(QPointF activeArrowStartPoint READ activeArrowStartPoint NOTIFY activeArrowStartPointChanged) Q_PROPERTY(QPointF activeArrowEndPoint READ activeArrowEndPoint NOTIFY activeArrowEndPointChanged) Q_PROPERTY(bool activeArrowEnabled READ activeArrowEnabled NOTIFY activeArrowEnabledChanged) Q_PROPERTY(bool nodeGraphComplete READ nodeGraphComplete NOTIFY nodeGraphCompleteChanged) Q_PROPERTY(bool effectNodeSelected READ effectNodeSelected NOTIFY effectNodeSelectedChanged) Q_PROPERTY(bool mainNodeSelected READ mainNodeSelected NOTIFY mainNodeSelectedChanged) Q_PROPERTY(int selectedNodeId READ selectedNodeId NOTIFY selectedNodeIdChanged) Q_PROPERTY(QString selectedNodeName READ selectedNodeName WRITE setSelectedNodeName NOTIFY selectedNodeNameChanged) Q_PROPERTY(QString selectedNodeDescription READ selectedNodeDescription WRITE setSelectedNodeDescription NOTIFY selectedNodeDescriptionChanged) Q_PROPERTY(QString selectedNodeFragmentCode READ selectedNodeFragmentCode WRITE setSelectedNodeFragmentCode NOTIFY selectedNodeFragmentCodeChanged) Q_PROPERTY(QString selectedNodeVertexCode READ selectedNodeVertexCode WRITE setSelectedNodeVertexCode NOTIFY selectedNodeVertexCodeChanged) Q_PROPERTY(QString selectedNodeQmlCode READ selectedNodeQmlCode WRITE setSelectedNodeQmlCode NOTIFY selectedNodeQmlCodeChanged) Q_PROPERTY(QStringList codeSelectorModel READ codeSelectorModel NOTIFY codeSelectorModelChanged) Q_PROPERTY(int codeSelectorIndex READ codeSelectorIndex NOTIFY codeSelectorIndexChanged) QML_NAMED_ELEMENT(NodeViewItem) public: explicit NodeView(QQuickItem *parent = nullptr); NodesModel *nodesModel() const; ArrowsModel *arrowsModel() const; QPointF activeArrowStartPoint() const; QPointF activeArrowEndPoint() const; bool activeArrowEnabled() const; QString selectedNodeName() const; void setSelectedNodeName(const QString &name); QString selectedNodeDescription() const; void setSelectedNodeDescription(const QString &description); QString selectedNodeFragmentCode() const; void setSelectedNodeFragmentCode(const QString &newSelectedNodeFragmentCode); QString selectedNodeVertexCode() const; void setSelectedNodeVertexCode(const QString &newSelectedNodeVertexCode); QString selectedNodeQmlCode() const; void setSelectedNodeQmlCode(const QString &newSelectedNodeQmlCode); bool nodeGraphComplete() const; bool effectNodeSelected() const; bool mainNodeSelected() const; int selectedNodeId() const; QStringList codeSelectorModel() const; int codeSelectorIndex() const; void setSelectedNode(NodesModel::Node *selectedNode); void updateCodeSelectorModel(); public Q_SLOTS: void updateActiveNodesList(); void deleteSelectedNodes(); void layoutNodes(bool distribute); void selectSingleNode(int nodeId); void selectMainNode(); int getNodeIdWithName(const QString &name); void toggleNodeDisabled(); signals: void nodesModelChanged(); void arrowsModelChanged(); void activeArrowStartPointChanged(); void activeArrowEndPointChanged(); void activeArrowEnabledChanged(); void activeNodesListChanged(); void selectedNodeNameChanged(); void selectedNodeDescriptionChanged(); void selectedNodeFragmentCodeChanged(); void selectedNodeVertexCodeChanged(); void selectedNodeQmlCodeChanged(); void nodeGraphCompleteChanged(); void effectNodeSelectedChanged(); void mainNodeSelectedChanged(); void selectedNodeIdChanged(); void codeSelectorModelChanged(); void codeSelectorIndexChanged(); // Other than changed singnals void doubleClickNode(); void openDeleteNodeDialog(); void openNodeContextMenu(); protected: void mouseMoveEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; void hoverMoveEvent(QHoverEvent *event) override; void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; private: friend class EffectManager; void updateArrowsPositions(); void updateCodeSelectorIndex(); int getUniqueNodeId(); void initializeNode(NodesModel::Node &node); void initializeNodeSize(NodesModel::Node &node); QString getUniqueNodeName(const QString &origName, int counter = 0); bool m_mousePressed = false; NodesModel *m_nodesModel = nullptr; ArrowsModel *m_arrowsModel = nullptr; QPointF m_pressPosition; QPointF m_activeArrowStartPoint; QPointF m_activeArrowEndPoint; bool m_activeArrowEnabled; ArrowsModel::Arrow m_activeArrow; bool m_nodeGraphComplete = false; bool m_effectNodeSelected = false; bool m_mainNodeSelected = false; int m_selectedNodeId = -1; bool m_initialized = false; EffectManager *m_effectManager = nullptr; QList m_activeNodesList; // Ids of nodes currently connected and not disabled QList m_activeNodesIds; QStringList m_codeSelectorModel; int m_codeSelectorIndex = 0; }; #endif // NODEVIEW_H