#pragma once #include #include #include #include #include class ExpressionRangeData; class QWidget; class QLineEdit; class QComboBox; using QtNodes::PortType; using QtNodes::PortIndex; using QtNodes::NodeData; using QtNodes::NodeDataType; using QtNodes::NodeDataModel; using QtNodes::NodeValidationState; /// The model dictates the number of inputs and outputs for the Node. /// In this example it has no logic. class MathFunctionModel : public NodeDataModel { Q_OBJECT public: using FunctionPtr = std::function; using NameAndFunction = std::tuple; public: MathFunctionModel(); virtual ~MathFunctionModel() {} public: QString caption() const override { return QStringLiteral("Math Function"); } bool captionVisible() const override { return true; } QString name() const override { return QStringLiteral("Math Function"); } std::unique_ptr clone() const override { return std::make_unique(); } public: QJsonObject save() const override; void restore(QJsonObject const &p) override; public: unsigned int nPorts(PortType portType) const override; NodeDataType dataType(PortType portType, PortIndex portIndex) const override; std::shared_ptr outData(PortIndex port) override; void setInData(std::shared_ptr, PortIndex) override; QWidget * embeddedWidget() override; private: QString convertRangeToText(std::vector const &range) const; std::vector applyFunction(std::vector const &range) const; void processData(); void createNameAndFunctions(); private slots: void onFunctionIndexChanged(int index); void onTextChanged(QString); private: std::weak_ptr _inputExpression; std::shared_ptr _expression; QWidget * _widget; QComboBox * _functionComboBox; QLineEdit * _secondOperandEdit; QLineEdit * _variableLabel; QLineEdit * _rangeLabel; std::vector _nameAndFunctions; };