#pragma once #include #include #include #include #include class ExpressionBoolData; 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 BoolFunctionModel : public NodeDataModel { Q_OBJECT public: using BoolFunctionPtr = std::function; using NameAndBoolFunction = std::tuple; public: BoolFunctionModel(); virtual ~BoolFunctionModel() {} public: QString caption() const override { return QStringLiteral("Bool Function"); } bool captionVisible() const override { return true; } QString name() const override { return QStringLiteral("Bool 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 convertBoolRangeToText(std::vector const &range) const; std::vector applyFunction(std::vector const &range1, std::vector const &range2) const; void processData(); void createNameAndBoolFunctions(); private slots: void onFunctionIndexChanged(int index); private: std::weak_ptr _input1; std::weak_ptr _input2; std::shared_ptr _expression; QWidget * _widget; QComboBox * _functionComboBox; QLineEdit * _variableLabel; QLineEdit * _rangeLabel; std::vector _nameAndBoolFunctions; };