Browse Source

自定义 nodeeditor

chengxr 1 year ago
parent
commit
947407051b

+ 26 - 10
QFD/shemeFlow/FlowGraphNodeWidget.cpp

@@ -8,7 +8,9 @@
 
 FlowGraphNodeWidget::FlowGraphNodeWidget(NodeWidgetType type, QWidget *parent) : QWidget(parent), m_type(type)
 {
-    setFixedSize(QSize(130, 40));
+    setFixedSize(QSize(130, 30));
+    m_layout = new QVBoxLayout(this);
+    m_layout->setMargin(0);
 }
 
 FlowGraphNodeWidget::NodeWidgetType FlowGraphNodeWidget::type() const
@@ -22,8 +24,8 @@ FlowGraphPlainNodeWidget::FlowGraphPlainNodeWidget(QWidget *parent) : FlowGraphN
     m_label->setText("test");
     m_label->setAlignment(Qt::AlignCenter);
 
-    QBoxLayout *l = new QVBoxLayout(this);
-    l->addWidget(m_label);
+    m_layout->setMargin(0);
+    m_layout->addWidget(m_label);
 }
 
 void FlowGraphPlainNodeWidget::setText(const QString text)
@@ -35,17 +37,32 @@ FlowGraphCheckNodeWidget::FlowGraphCheckNodeWidget(QWidget *parent) : FlowGraphN
 {
     m_checkBox = new QCheckBox("执行", this);
 
-    QBoxLayout *l = new QVBoxLayout(this);
-    l->setAlignment(Qt::AlignCenter);
-    l->addWidget(m_checkBox);
+    m_layout->setMargin(0);
+    m_layout->setAlignment(Qt::AlignCenter);
+    m_layout->addWidget(m_checkBox);
 }
 
 FlowGraphComboNodeWidget::FlowGraphComboNodeWidget(QWidget *parent) : FlowGraphNodeWidget(ComboBox, parent)
 {
     m_combo = new QComboBox(this);
 
-    QBoxLayout *l = new QVBoxLayout(this);
-    l->addWidget(m_combo);
+    setStyleSheet("QComboBox {"
+                  "border: 1px solid gray;"
+                  "border-radius: 3px;"
+                  "padding: 1px 18px 1px 3px;"
+                  "min-width: 6em;"
+                  "}"
+                  "QComboBox:editable {"
+                  "background: white;"
+                  "}"
+
+                  "QComboBox:!editable, QComboBox::drop-down:editable {"
+                  "background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,"
+                  "stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,"
+                  "stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3);"
+                  "}");
+
+    m_layout->addWidget(m_combo);
 }
 
 QList<QString> FlowGraphComboNodeWidget::items() const
@@ -67,6 +84,5 @@ FlowGraphSpinNodeWidget::FlowGraphSpinNodeWidget(QWidget *parent) : FlowGraphNod
     m_spinBox->setMaximum(10);
     m_spinBox->setValue(3);
 
-    QBoxLayout *l = new QVBoxLayout(this);
-    l->addWidget(m_spinBox);
+    m_layout->addWidget(m_spinBox);
 }

+ 3 - 0
QFD/shemeFlow/FlowGraphNodeWidget.h

@@ -8,6 +8,8 @@ class QCheckBox;
 class QComboBox;
 class QSpinBox;
 
+class QVBoxLayout;
+
 class FlowGraphNodeWidget : public QWidget
 {
     Q_OBJECT
@@ -29,6 +31,7 @@ signals:
 
 protected:
     NodeWidgetType m_type = Plain;
+    QVBoxLayout *m_layout = nullptr;
 };
 
 class FlowGraphPlainNodeWidget : public FlowGraphNodeWidget

+ 3 - 3
QFluentWidgets/Navigation/NavigationWidget.cpp

@@ -71,7 +71,7 @@ void NavigationWidget::leaveEvent(QEvent * /*event*/)
 NavigationPushButton::NavigationPushButton(FluentIconBase *ficon, const QString &text, bool selectable, QWidget *parent)
     : NavigationWidget(selectable, parent), m_ficon(ficon), m_text(text)
 {
-    setStyleSheet("NavigationPushButton{font: 16px \"Segoe UI\", \"Microsoft YaHei\"}");
+    setStyleSheet("NavigationPushButton{font: bold 15px }");
 }
 
 QString NavigationPushButton::text() const
@@ -95,9 +95,9 @@ void NavigationPushButton::paintEvent(QPaintEvent * /*event*/)
     int c = QFWIns.isDarkTheme() ? 255 : 0;
     if (isSelected) {
         if (isEnter) {
-            painter.setBrush(QColor(c, c, c, 60));
+            painter.setBrush(QColor(c, c, c, 36));
         } else {
-            painter.setBrush(QColor(c, c, c, 100));
+            painter.setBrush(QColor(c, c, c, 60));
         }
         painter.drawRoundedRect(rect(), 5, 5);
 

+ 4 - 2
QtNodes/src/DataFlowGraphModel.cpp

@@ -177,8 +177,8 @@ QVariant DataFlowGraphModel::nodeData(NodeId nodeId, NodeRole role) const
         break;
 
     case NodeRole::Caption:
-        result = model->caption();
-        //        result = _captionData[nodeId];
+        //        result = model->caption();
+        result = _captionData[nodeId];
         break;
 
     case NodeRole::Style: {
@@ -251,6 +251,8 @@ bool DataFlowGraphModel::setNodeData(NodeId nodeId, NodeRole role, QVariant valu
 
     case NodeRole::Caption:
         _captionData[nodeId] = value.value<QString>();
+        Q_EMIT nodeCreated(nodeId);
+        result = true;
         break;
 
     case NodeRole::Style:

+ 21 - 30
QtNodes/src/DefaultHorizontalNodeGeometry.cpp

@@ -1,4 +1,4 @@
-#include "DefaultHorizontalNodeGeometry.hpp"
+#include "DefaultHorizontalNodeGeometry.hpp"
 
 #include "AbstractGraphModel.hpp"
 #include "NodeData.hpp"
@@ -6,15 +6,16 @@
 #include <QPoint>
 #include <QRect>
 #include <QWidget>
+#include <QDebug>
 
 namespace QtNodes {
 
 DefaultHorizontalNodeGeometry::DefaultHorizontalNodeGeometry(AbstractGraphModel &graphModel)
-    : AbstractNodeGeometry(graphModel)
-    , _portSize(20)
-    , _portSpasing(10)
-    , _fontMetrics(QFont())
-    , _boldFontMetrics(QFont())
+    : AbstractNodeGeometry(graphModel),
+      _portSize(20),
+      _portSpasing(10),
+      _fontMetrics(QFont()),
+      _boldFontMetrics(QFont())
 {
     QFont f;
     f.setBold(true);
@@ -40,10 +41,10 @@ void DefaultHorizontalNodeGeometry::recomputeSize(NodeId const nodeId) const
 
     height += capRect.height();
 
-    height += _portSpasing; // space above caption
-    height += _portSpasing; // space below caption
+    height += _portSpasing;  // space above caption
+    height += _portSpasing;  // space below caption
 
-    unsigned int inPortWidth = maxPortsTextAdvance(nodeId, PortType::In);
+    unsigned int inPortWidth  = maxPortsTextAdvance(nodeId, PortType::In);
     unsigned int outPortWidth = maxPortsTextAdvance(nodeId, PortType::Out);
 
     unsigned int width = inPortWidth + outPortWidth + 4 * _portSpasing;
@@ -59,8 +60,7 @@ void DefaultHorizontalNodeGeometry::recomputeSize(NodeId const nodeId) const
     _graphModel.setNodeData(nodeId, NodeRole::Size, size);
 }
 
-QPointF DefaultHorizontalNodeGeometry::portPosition(NodeId const nodeId,
-                                                    PortType const portType,
+QPointF DefaultHorizontalNodeGeometry::portPosition(NodeId const nodeId, PortType const portType,
                                                     PortIndex const portIndex) const
 {
     unsigned int const step = _portSize + _portSpasing;
@@ -99,8 +99,7 @@ QPointF DefaultHorizontalNodeGeometry::portPosition(NodeId const nodeId,
     return result;
 }
 
-QPointF DefaultHorizontalNodeGeometry::portTextPosition(NodeId const nodeId,
-                                                        PortType const portType,
+QPointF DefaultHorizontalNodeGeometry::portTextPosition(NodeId const nodeId, PortType const portType,
                                                         PortIndex const portIndex) const
 {
     QPointF p = portPosition(nodeId, portType, portIndex);
@@ -154,8 +153,7 @@ QPointF DefaultHorizontalNodeGeometry::widgetPosition(NodeId const nodeId) const
         // If the widget wants to use as much vertical space as possible,
         // place it immediately after the caption.
         if (w->sizePolicy().verticalPolicy() & QSizePolicy::ExpandFlag) {
-            return QPointF(2.0 * _portSpasing + maxPortsTextAdvance(nodeId, PortType::In),
-                           captionHeight);
+            return QPointF(2.0 * _portSpasing + maxPortsTextAdvance(nodeId, PortType::In), captionHeight);
         } else {
             return QPointF(2.0 * _portSpasing + maxPortsTextAdvance(nodeId, PortType::In),
                            (captionHeight + size.height() - w->height()) / 2.0);
@@ -173,8 +171,7 @@ QRect DefaultHorizontalNodeGeometry::resizeHandleRect(NodeId const nodeId) const
     return QRect(size.width() - _portSpasing, size.height() - _portSpasing, rectSize, rectSize);
 }
 
-QRectF DefaultHorizontalNodeGeometry::portTextRect(NodeId const nodeId,
-                                                   PortType const portType,
+QRectF DefaultHorizontalNodeGeometry::portTextRect(NodeId const nodeId, PortType const portType,
                                                    PortIndex const portIndex) const
 {
     QString s;
@@ -196,21 +193,18 @@ unsigned int DefaultHorizontalNodeGeometry::maxVerticalPortsExtent(NodeId const
     PortCount nOutPorts = _graphModel.nodeData<PortCount>(nodeId, NodeRole::OutPortCount);
 
     unsigned int maxNumOfEntries = std::max(nInPorts, nOutPorts);
-    unsigned int step = _portSize + _portSpasing;
+    unsigned int step            = _portSize + _portSpasing;
 
     return step * maxNumOfEntries;
 }
 
-unsigned int DefaultHorizontalNodeGeometry::maxPortsTextAdvance(NodeId const nodeId,
-                                                                PortType const portType) const
+unsigned int DefaultHorizontalNodeGeometry::maxPortsTextAdvance(NodeId const nodeId, PortType const portType) const
 {
     unsigned int width = 0;
 
-    size_t const n = _graphModel
-                         .nodeData(nodeId,
-                                   (portType == PortType::Out) ? NodeRole::OutPortCount
-                                                               : NodeRole::InPortCount)
-                         .toUInt();
+    size_t const n =
+            _graphModel.nodeData(nodeId, (portType == PortType::Out) ? NodeRole::OutPortCount : NodeRole::InPortCount)
+                    .toUInt();
 
     for (PortIndex portIndex = 0ul; portIndex < n; ++portIndex) {
         QString name;
@@ -218,10 +212,7 @@ unsigned int DefaultHorizontalNodeGeometry::maxPortsTextAdvance(NodeId const nod
         if (_graphModel.portData<bool>(nodeId, portType, portIndex, PortRole::CaptionVisible)) {
             name = _graphModel.portData<QString>(nodeId, portType, portIndex, PortRole::Caption);
         } else {
-            NodeDataType portData = _graphModel.portData<NodeDataType>(nodeId,
-                                                                       portType,
-                                                                       portIndex,
-                                                                       PortRole::DataType);
+            NodeDataType portData = _graphModel.portData<NodeDataType>(nodeId, portType, portIndex, PortRole::DataType);
 
             name = portData.name;
         }
@@ -236,4 +227,4 @@ unsigned int DefaultHorizontalNodeGeometry::maxPortsTextAdvance(NodeId const nod
     return width;
 }
 
-} // namespace QtNodes
+}  // namespace QtNodes

+ 2 - 0
QtNodes/src/DefaultNodePainter.cpp

@@ -200,6 +200,8 @@ void DefaultNodePainter::drawNodeCaption(QPainter *painter, NodeGraphicsObject &
 
     QPointF position = geometry.captionPosition(nodeId);
 
+    qDebug() << __FUNCTION__ << __LINE__ << "----" << name << position << endl;
+
     QJsonDocument json = QJsonDocument::fromVariant(model.nodeData(nodeId, NodeRole::Style));
     NodeStyle nodeStyle(json.object());
 

+ 27 - 37
QtNodes/src/DefaultVerticalNodeGeometry.cpp

@@ -1,4 +1,4 @@
-#include "DefaultVerticalNodeGeometry.hpp"
+#include "DefaultVerticalNodeGeometry.hpp"
 
 #include "AbstractGraphModel.hpp"
 #include "NodeData.hpp"
@@ -6,15 +6,16 @@
 #include <QPoint>
 #include <QRect>
 #include <QWidget>
+#include <QDebug>
 
 namespace QtNodes {
 
 DefaultVerticalNodeGeometry::DefaultVerticalNodeGeometry(AbstractGraphModel &graphModel)
-    : AbstractNodeGeometry(graphModel)
-    , _portSize(20)
-    , _portSpasing(10)
-    , _fontMetrics(QFont())
-    , _boldFontMetrics(QFont())
+    : AbstractNodeGeometry(graphModel),
+      _portSize(20),
+      _portSpasing(10),
+      _fontMetrics(QFont()),
+      _boldFontMetrics(QFont())
 {
     QFont f;
     f.setBold(true);
@@ -30,12 +31,14 @@ QSize DefaultVerticalNodeGeometry::size(NodeId const nodeId) const
 
 void DefaultVerticalNodeGeometry::recomputeSize(NodeId const nodeId) const
 {
-    unsigned int height = _portSpasing; // maxHorizontalPortsExtent(nodeId);
+    unsigned int height = _portSpasing;  // maxHorizontalPortsExtent(nodeId);
 
     if (auto w = _graphModel.nodeData<QWidget *>(nodeId, NodeRole::Widget)) {
         height = std::max(height, static_cast<unsigned int>(w->height()));
     }
 
+    height += 20;
+
     QRectF const capRect = captionRect(nodeId);
 
     height += capRect.height();
@@ -43,7 +46,7 @@ void DefaultVerticalNodeGeometry::recomputeSize(NodeId const nodeId) const
     height += _portSpasing;
     height += _portSpasing;
 
-    PortCount nInPorts = _graphModel.nodeData<PortCount>(nodeId, NodeRole::InPortCount);
+    PortCount nInPorts  = _graphModel.nodeData<PortCount>(nodeId, NodeRole::InPortCount);
     PortCount nOutPorts = _graphModel.nodeData<PortCount>(nodeId, NodeRole::OutPortCount);
 
     // Adding double step (top and bottom) to reserve space for port captions.
@@ -51,16 +54,12 @@ void DefaultVerticalNodeGeometry::recomputeSize(NodeId const nodeId) const
     height += portCaptionsHeight(nodeId, PortType::In);
     height += portCaptionsHeight(nodeId, PortType::Out);
 
-    unsigned int inPortWidth = maxPortsTextAdvance(nodeId, PortType::In);
+    unsigned int inPortWidth  = maxPortsTextAdvance(nodeId, PortType::In);
     unsigned int outPortWidth = maxPortsTextAdvance(nodeId, PortType::Out);
 
-    unsigned int totalInPortsWidth = nInPorts > 0
-                                         ? inPortWidth * nInPorts + _portSpasing * (nInPorts - 1)
-                                         : 0;
+    unsigned int totalInPortsWidth = nInPorts > 0 ? inPortWidth * nInPorts + _portSpasing * (nInPorts - 1) : 0;
 
-    unsigned int totalOutPortsWidth = nOutPorts > 0 ? outPortWidth * nOutPorts
-                                                          + _portSpasing * (nOutPorts - 1)
-                                                    : 0;
+    unsigned int totalOutPortsWidth = nOutPorts > 0 ? outPortWidth * nOutPorts + _portSpasing * (nOutPorts - 1) : 0;
 
     unsigned int width = std::max(totalInPortsWidth, totalOutPortsWidth);
 
@@ -78,8 +77,7 @@ void DefaultVerticalNodeGeometry::recomputeSize(NodeId const nodeId) const
     _graphModel.setNodeData(nodeId, NodeRole::Size, size);
 }
 
-QPointF DefaultVerticalNodeGeometry::portPosition(NodeId const nodeId,
-                                                  PortType const portType,
+QPointF DefaultVerticalNodeGeometry::portPosition(NodeId const nodeId, PortType const portType,
                                                   PortIndex const portIndex) const
 {
     QPointF result;
@@ -103,7 +101,7 @@ QPointF DefaultVerticalNodeGeometry::portPosition(NodeId const nodeId,
 
     case PortType::Out: {
         unsigned int outPortWidth = maxPortsTextAdvance(nodeId, PortType::Out) + _portSpasing;
-        PortCount nOutPorts = _graphModel.nodeData<PortCount>(nodeId, NodeRole::OutPortCount);
+        PortCount nOutPorts       = _graphModel.nodeData<PortCount>(nodeId, NodeRole::OutPortCount);
 
         double x = (size.width() - (nOutPorts - 1) * outPortWidth) / 2.0 + portIndex * outPortWidth;
 
@@ -121,8 +119,7 @@ QPointF DefaultVerticalNodeGeometry::portPosition(NodeId const nodeId,
     return result;
 }
 
-QPointF DefaultVerticalNodeGeometry::portTextPosition(NodeId const nodeId,
-                                                      PortType const portType,
+QPointF DefaultVerticalNodeGeometry::portTextPosition(NodeId const nodeId, PortType const portType,
                                                       PortIndex const portIndex) const
 {
     QPointF p = portPosition(nodeId, portType, portIndex);
@@ -155,6 +152,7 @@ QRectF DefaultVerticalNodeGeometry::captionRect(NodeId const nodeId) const
         return QRect();
 
     QString name = _graphModel.nodeData<QString>(nodeId, NodeRole::Caption);
+    qDebug() << __FUNCTION__ << __LINE__ << "----" << name << endl;
 
     return _boldFontMetrics.boundingRect(name);
 }
@@ -199,8 +197,7 @@ QRect DefaultVerticalNodeGeometry::resizeHandleRect(NodeId const nodeId) const
     return QRect(size.width() - rectSize, size.height() - rectSize, rectSize, rectSize);
 }
 
-QRectF DefaultVerticalNodeGeometry::portTextRect(NodeId const nodeId,
-                                                 PortType const portType,
+QRectF DefaultVerticalNodeGeometry::portTextRect(NodeId const nodeId, PortType const portType,
                                                  PortIndex const portIndex) const
 {
     QString s;
@@ -222,21 +219,18 @@ unsigned int DefaultVerticalNodeGeometry::maxHorizontalPortsExtent(NodeId const
     PortCount nOutPorts = _graphModel.nodeData<PortCount>(nodeId, NodeRole::OutPortCount);
 
     unsigned int maxNumOfEntries = std::max(nInPorts, nOutPorts);
-    unsigned int step = _portSize + _portSpasing;
+    unsigned int step            = _portSize + _portSpasing;
 
     return step * maxNumOfEntries;
 }
 
-unsigned int DefaultVerticalNodeGeometry::maxPortsTextAdvance(NodeId const nodeId,
-                                                              PortType const portType) const
+unsigned int DefaultVerticalNodeGeometry::maxPortsTextAdvance(NodeId const nodeId, PortType const portType) const
 {
     unsigned int width = 0;
 
-    size_t const n = _graphModel
-                         .nodeData(nodeId,
-                                   (portType == PortType::Out) ? NodeRole::OutPortCount
-                                                               : NodeRole::InPortCount)
-                         .toUInt();
+    size_t const n =
+            _graphModel.nodeData(nodeId, (portType == PortType::Out) ? NodeRole::OutPortCount : NodeRole::InPortCount)
+                    .toUInt();
 
     for (PortIndex portIndex = 0ul; portIndex < n; ++portIndex) {
         QString name;
@@ -244,10 +238,7 @@ unsigned int DefaultVerticalNodeGeometry::maxPortsTextAdvance(NodeId const nodeI
         if (_graphModel.portData<bool>(nodeId, portType, portIndex, PortRole::CaptionVisible)) {
             name = _graphModel.portData<QString>(nodeId, portType, portIndex, PortRole::Caption);
         } else {
-            NodeDataType portData = _graphModel.portData<NodeDataType>(nodeId,
-                                                                       portType,
-                                                                       portIndex,
-                                                                       PortRole::DataType);
+            NodeDataType portData = _graphModel.portData<NodeDataType>(nodeId, portType, portIndex, PortRole::DataType);
 
             name = portData.name;
         }
@@ -262,8 +253,7 @@ unsigned int DefaultVerticalNodeGeometry::maxPortsTextAdvance(NodeId const nodeI
     return width;
 }
 
-unsigned int DefaultVerticalNodeGeometry::portCaptionsHeight(NodeId const nodeId,
-                                                             PortType const portType) const
+unsigned int DefaultVerticalNodeGeometry::portCaptionsHeight(NodeId const nodeId, PortType const portType) const
 {
     unsigned int h = 0;
 
@@ -297,4 +287,4 @@ unsigned int DefaultVerticalNodeGeometry::portCaptionsHeight(NodeId const nodeId
     return h;
 }
 
-} // namespace QtNodes
+}  // namespace QtNodes