Revision control

Copy as Markdown

// 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 <QtQuick/qquickitem.h>
#include <QList>
#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<NodesModel::Node *> m_activeNodesList;
// Ids of nodes currently connected and not disabled
QList<int> m_activeNodesIds;
QStringList m_codeSelectorModel;
int m_codeSelectorIndex = 0;
};
#endif // NODEVIEW_H