chengxr 1 ano atrás
pai
commit
8beebc41f6

+ 175 - 0
QFD/widgets/SchemeFlowWidget.cpp

@@ -0,0 +1,175 @@
+#include "SchemeFlowWidget.h"
+
+#include <dbService/ClassSet.h>
+
+#include <QGroupBox>
+#include <QCheckBox>
+
+#include <QBoxLayout>
+#include <QDebug>
+
+static std::shared_ptr<NodeDelegateModelRegistry> registerDataModels()
+{
+    auto ret = std::make_shared<NodeDelegateModelRegistry>();
+
+    ret->registerModel<FlowTemplateDataModel>();
+
+    return ret;
+}
+
+static void setStyle_()
+{
+    GraphicsViewStyle::setStyle(
+            R"(
+  {
+    "GraphicsViewStyle": {
+      "BackgroundColor": [255, 255, 255],
+      "FineGridColor": [255, 255, 255],
+      "CoarseGridColor": [255, 255, 255]
+    }
+  }
+  )");
+
+    NodeStyle::setNodeStyle(
+            R"(
+  {
+    "NodeStyle": {
+      "NormalBoundaryColor": "darkgray",
+      "SelectedBoundaryColor": "deepskyblue",
+      "GradientColor0": "mintcream",
+      "GradientColor1": "mintcream",
+      "GradientColor2": "mintcream",
+      "GradientColor3": "mintcream",
+      "ShadowColor": [200, 200, 200],
+      "FontColor": [10, 10, 10],
+      "FontColorFaded": [100, 100, 100],
+      "ConnectionPointColor": "white",
+      "PenWidth": 2.0,
+      "HoveredPenWidth": 2.5,
+      "ConnectionPointDiameter": 10.0,
+      "Opacity": 1.0
+    }
+  }
+  )");
+
+    ConnectionStyle::setConnectionStyle(
+            R"(
+  {
+    "ConnectionStyle": {
+      "ConstructionColor": "gray",
+      "NormalColor": "black",
+      "SelectedColor": "gray",
+      "SelectedHaloColor": "deepskyblue",
+      "HoveredColor": "deepskyblue",
+
+      "LineWidth": 3.0,
+      "ConstructionLineWidth": 2.0,
+      "PointDiameter": 10.0,
+
+      "UseDataDefinedColors": false
+    }
+  }
+  )");
+}
+
+SchemeFlowWidget::SchemeFlowWidget(ProjectInfo *proj, int indexType, QWidget *parent) : QWidget(parent)
+{
+    setStyle_();
+    initWidgets();
+    initLayout();
+}
+
+SchemeFlowWidget::~SchemeFlowWidget()
+{
+    delete graphModel;
+}
+
+void SchemeFlowWidget::initWidgets()
+{
+
+#if 1
+
+    graphModel = new DataFlowModel(registerDataModels());
+
+    // Initialize and connect two nodes.
+    {
+        NodeId id1 = graphModel->addNode(FlowTemplateData().type().id);
+        graphModel->setNodeData(id1, NodeRole::Position, QPointF(0, 0));
+
+        NodeId id2 = graphModel->addNode(FlowTemplateData().type().id);
+        graphModel->setNodeData(id2, NodeRole::Position, QPointF(300, 300));
+
+        graphModel->addConnection(ConnectionId { id1, 0, id2, 0 });
+    }
+
+    auto scene = new DataFlowGraphicsScene(*graphModel);
+
+    QHBoxLayout *l = new QHBoxLayout(this);
+
+    GraphicsView *view = new GraphicsView(scene);
+
+    l->addWidget(view);
+
+    QGroupBox *groupBox = new QGroupBox("Options");
+
+    QCheckBox *cb1 = new QCheckBox("Nodes are locked");
+    QCheckBox *cb2 = new QCheckBox("Connections detachable");
+    cb2->setChecked(true);
+
+    QVBoxLayout *vbl = new QVBoxLayout;
+    vbl->addWidget(cb1);
+    vbl->addWidget(cb2);
+    vbl->addStretch();
+    groupBox->setLayout(vbl);
+
+    QObject::connect(cb1, &QCheckBox::stateChanged,
+                     [this](int state) { graphModel->setNodesLocked(state == Qt::Checked); });
+
+    QObject::connect(cb2, &QCheckBox::stateChanged,
+                     [this](int state) { graphModel->setDetachPossible(state == Qt::Checked); });
+
+    l->addWidget(groupBox);
+
+    this->setWindowTitle("Locked Nodes and Connections");
+    this->resize(800, 600);
+
+#else
+
+    // Initialize and connect two nodes.
+    {
+        NodeId id1 = m_graphModel.addNode();
+        m_graphModel.setNodeData(id1, NodeRole::Position, QPointF(0, 0));
+
+        NodeId id2 = m_graphModel.addNode();
+        m_graphModel.setNodeData(id2, NodeRole::Position, QPointF(300, 300));
+
+        m_graphModel.addConnection(ConnectionId { id1, 0, id2, 0 });
+    }
+
+    auto scene = new BasicGraphicsScene(m_graphModel);
+
+    m_view = new GraphicsView(scene, this);
+
+    //    // Setup context menu for creating new nodes.
+    m_view->setContextMenuPolicy(Qt::ActionsContextMenu);
+    QAction *createNodeAction = new QAction(QStringLiteral("Create Node"), m_view);
+    QObject::connect(createNodeAction, &QAction::triggered, [&]() {
+        // Mouse position in scene coordinates.
+        QPointF posView = m_view->mapToScene(m_view->mapFromGlobal(QCursor::pos()));
+
+        NodeId const newId = m_graphModel.addNode();
+        m_graphModel.setNodeData(newId, NodeRole::Position, posView);
+    });
+    m_view->insertAction(m_view->actions().front(), createNodeAction);
+
+    m_view->setWindowTitle("Simple Node Graph");
+    m_view->resize(800, 600);
+
+#endif
+}
+
+void SchemeFlowWidget::initLayout()
+{
+    m_layout = new QHBoxLayout(this);
+    m_layout->addWidget(m_view);
+}

+ 58 - 0
QFD/widgets/SchemeFlowWidget.h

@@ -0,0 +1,58 @@
+#ifndef SCHEMEFLOWWIDGET_H
+#define SCHEMEFLOWWIDGET_H
+
+#include <QWidget>
+
+#include <shemeFlow/DataFlowModel.h>
+#include <shemeFlow/FlowGraphModel.h>
+#include <shemeFlow/DataFlowModel.h>
+#include <shemeFlow/FlowTemplateDataModel.h>
+
+#include <QtNodes/BasicGraphicsScene>
+#include <QtNodes/ConnectionStyle>
+#include <QtNodes/DataFlowGraphicsScene>
+#include <QtNodes/GraphicsView>
+#include <QtNodes/GraphicsViewStyle>
+#include <QtNodes/NodeDelegateModelRegistry>
+
+using QtNodes::BasicGraphicsScene;
+using QtNodes::ConnectionStyle;
+using QtNodes::DataFlowGraphicsScene;
+using QtNodes::GraphicsView;
+using QtNodes::GraphicsViewStyle;
+using QtNodes::NodeDelegateModelRegistry;
+using QtNodes::NodeRole;
+using QtNodes::NodeStyle;
+
+class ProjectInfo;
+class FlowGraphModel;
+
+class QHBoxLayout;
+
+class SchemeFlowWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit SchemeFlowWidget(ProjectInfo *proj, int indexType, QWidget *parent = nullptr);
+
+    ~SchemeFlowWidget();
+
+    void initWidgets();
+
+    void initLayout();
+
+signals:
+
+private:
+    ProjectInfo *m_proj = nullptr;
+    int m_indexType     = 0;
+
+    GraphicsView *m_view = nullptr;
+    FlowGraphModel m_graphModel;
+
+    DataFlowModel *graphModel = nullptr;
+
+    QHBoxLayout *m_layout = nullptr;
+};
+
+#endif  // SCHEMEFLOWWIDGET_H

+ 19 - 29
QtNodes/src/GraphicsView.cpp

@@ -1,4 +1,4 @@
-#include "GraphicsView.hpp"
+#include "GraphicsView.hpp"
 
 #include "BasicGraphicsScene.hpp"
 #include "ConnectionGraphicsObject.hpp"
@@ -27,12 +27,12 @@ using QtNodes::BasicGraphicsScene;
 using QtNodes::GraphicsView;
 
 GraphicsView::GraphicsView(QWidget *parent)
-    : QGraphicsView(parent)
-    , _clearSelectionAction(Q_NULLPTR)
-    , _deleteSelectionAction(Q_NULLPTR)
-    , _duplicateSelectionAction(Q_NULLPTR)
-    , _copySelectionAction(Q_NULLPTR)
-    , _pasteAction(Q_NULLPTR)
+    : QGraphicsView(parent),
+      _clearSelectionAction(Q_NULLPTR),
+      _deleteSelectionAction(Q_NULLPTR),
+      _duplicateSelectionAction(Q_NULLPTR),
+      _copySelectionAction(Q_NULLPTR),
+      _pasteAction(Q_NULLPTR)
 {
     setDragMode(QGraphicsView::ScrollHandDrag);
     setRenderHint(QPainter::Antialiasing);
@@ -57,8 +57,7 @@ GraphicsView::GraphicsView(QWidget *parent)
     setSceneRect(-maxSize, -maxSize, (maxSize * 2), (maxSize * 2));
 }
 
-GraphicsView::GraphicsView(BasicGraphicsScene *scene, QWidget *parent)
-    : GraphicsView(parent)
+GraphicsView::GraphicsView(BasicGraphicsScene *scene, QWidget *parent) : GraphicsView(parent)
 {
     setScene(scene);
 }
@@ -93,10 +92,7 @@ void GraphicsView::setScene(BasicGraphicsScene *scene)
         _deleteSelectionAction = new QAction(QStringLiteral("Delete Selection"), this);
         _deleteSelectionAction->setShortcutContext(Qt::ShortcutContext::WidgetShortcut);
         _deleteSelectionAction->setShortcut(QKeySequence(QKeySequence::Delete));
-        connect(_deleteSelectionAction,
-                &QAction::triggered,
-                this,
-                &GraphicsView::onDeleteSelectedObjects);
+        connect(_deleteSelectionAction, &QAction::triggered, this, &GraphicsView::onDeleteSelectedObjects);
 
         addAction(_deleteSelectionAction);
     }
@@ -106,10 +102,7 @@ void GraphicsView::setScene(BasicGraphicsScene *scene)
         _duplicateSelectionAction = new QAction(QStringLiteral("Duplicate Selection"), this);
         _duplicateSelectionAction->setShortcutContext(Qt::ShortcutContext::WidgetShortcut);
         _duplicateSelectionAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_D));
-        connect(_duplicateSelectionAction,
-                &QAction::triggered,
-                this,
-                &GraphicsView::onDuplicateSelectedObjects);
+        connect(_duplicateSelectionAction, &QAction::triggered, this, &GraphicsView::onDuplicateSelectedObjects);
 
         addAction(_duplicateSelectionAction);
     }
@@ -119,10 +112,7 @@ void GraphicsView::setScene(BasicGraphicsScene *scene)
         _copySelectionAction = new QAction(QStringLiteral("Copy Selection"), this);
         _copySelectionAction->setShortcutContext(Qt::ShortcutContext::WidgetShortcut);
         _copySelectionAction->setShortcut(QKeySequence(QKeySequence::Copy));
-        connect(_copySelectionAction,
-                &QAction::triggered,
-                this,
-                &GraphicsView::onCopySelectedObjects);
+        connect(_copySelectionAction, &QAction::triggered, this, &GraphicsView::onCopySelectedObjects);
 
         addAction(_copySelectionAction);
     }
@@ -206,7 +196,7 @@ void GraphicsView::setScaleRange(double minimum, double maximum)
     minimum = std::max(0.0, minimum);
     maximum = std::max(0.0, maximum);
 
-    _scaleRange = {minimum, maximum};
+    _scaleRange = { minimum, maximum };
 
     setupScale(transform().m11());
 }
@@ -218,7 +208,7 @@ void GraphicsView::setScaleRange(ScaleRange range)
 
 void GraphicsView::scaleUp()
 {
-    double const step = 1.2;
+    double const step   = 1.2;
     double const factor = std::pow(step, 1.0);
 
     if (_scaleRange.maximum > 0) {
@@ -236,7 +226,7 @@ void GraphicsView::scaleUp()
 
 void GraphicsView::scaleDown()
 {
-    double const step = 1.2;
+    double const step   = 1.2;
     double const factor = std::pow(step, -1.0);
 
     if (_scaleRange.minimum > 0) {
@@ -346,13 +336,13 @@ void GraphicsView::drawBackground(QPainter *painter, const QRectF &r)
 
     auto drawGrid = [&](double gridStep) {
         QRect windowRect = rect();
-        QPointF tl = mapToScene(windowRect.topLeft());
-        QPointF br = mapToScene(windowRect.bottomRight());
+        QPointF tl       = mapToScene(windowRect.topLeft());
+        QPointF br       = mapToScene(windowRect.bottomRight());
 
-        double left = std::floor(tl.x() / gridStep - 0.5);
-        double right = std::floor(br.x() / gridStep + 1.0);
+        double left   = std::floor(tl.x() / gridStep - 0.5);
+        double right  = std::floor(br.x() / gridStep + 1.0);
         double bottom = std::floor(tl.y() / gridStep - 0.5);
-        double top = std::floor(br.y() / gridStep + 1.0);
+        double top    = std::floor(br.y() / gridStep + 1.0);
 
         // vertical lines
         for (int xi = int(left); xi <= int(right); ++xi) {