From b0fcaefcc0594189771921db84f260b9c0530ace Mon Sep 17 00:00:00 2001 From: Vitaly SMETANNIKOV Date: Mon, 28 May 2018 15:35:40 +0300 Subject: [PATCH] Task 2.7: Code completion --- src/ModuleBase/ModuleBase_ParamSpinBox.cpp | 19 +-- src/ModuleBase/ModuleBase_ParamSpinBox.h | 4 +- .../ModuleBase_WidgetDoubleValue.cpp | 130 +++++++++++++++++- src/ModuleBase/ModuleBase_WidgetDoubleValue.h | 11 ++ 4 files changed, 145 insertions(+), 19 deletions(-) diff --git a/src/ModuleBase/ModuleBase_ParamSpinBox.cpp b/src/ModuleBase/ModuleBase_ParamSpinBox.cpp index 443868466..6c5ce02bb 100644 --- a/src/ModuleBase/ModuleBase_ParamSpinBox.cpp +++ b/src/ModuleBase/ModuleBase_ParamSpinBox.cpp @@ -20,13 +20,6 @@ #include "ModuleBase_ParamSpinBox.h" -#include -#include -#include -#include -#include -#include - #include #include #include @@ -275,20 +268,20 @@ bool ModuleBase_ParamSpinBox::hasVariable(const QString& theText) const // return ModelAPI_Tools::findVariable(FeaturePtr(), theName.toStdString(), outValue, aParam); //} -/*! - \brief This function is called when the spinbox receives key press event. - */ void ModuleBase_ParamSpinBox::keyReleaseEvent(QKeyEvent* e) { switch (e->key()) { case Qt::Key_Return: case Qt::Key_Enter: + case Qt::Key_Tab: + { if (myCompleter->popup()->isVisible()) { myCompleter->popup()->hide(); myIsEquation = true; } emit textChanged(lineEdit()->text()); return; + } case Qt::Key_Space: if (e->modifiers() & Qt::ControlModifier) { myCompletePos = lineEdit()->cursorPosition(); @@ -303,6 +296,7 @@ void ModuleBase_ParamSpinBox::keyReleaseEvent(QKeyEvent* e) } } + QString ModuleBase_ParamSpinBox::getPrefix(int& theStart, int& theEnd) const { QString aPrefix; @@ -354,11 +348,6 @@ void ModuleBase_ParamSpinBox::insertCompletion(const QString& theText) } lineEdit()->setText(aResult); myIsEquation = true; - - qDebug("### aPos=%i", myCompletePos); - qDebug("### text=%s", qPrintable(aText)); - qDebug("### prefix=%s", qPrintable(aPrefix)); - qDebug("### result=%s", qPrintable(aResult)); } diff --git a/src/ModuleBase/ModuleBase_ParamSpinBox.h b/src/ModuleBase/ModuleBase_ParamSpinBox.h index 16ab63789..4e12ffe1e 100644 --- a/src/ModuleBase/ModuleBase_ParamSpinBox.h +++ b/src/ModuleBase/ModuleBase_ParamSpinBox.h @@ -97,6 +97,9 @@ public: void setValueEnabled(bool theEnable); protected: + /*! + \brief This function is called when the spinbox receives key release event. + */ virtual void keyReleaseEvent(QKeyEvent *event); virtual StepEnabled stepEnabled() const { return StepUpEnabled | StepDownEnabled; } @@ -137,7 +140,6 @@ private slots: private: QString getPrefix(int& theStart, int& theEnd) const; - bool myIsEquation; bool myAcceptVariables; diff --git a/src/ModuleBase/ModuleBase_WidgetDoubleValue.cpp b/src/ModuleBase/ModuleBase_WidgetDoubleValue.cpp index 9a66c6b51..ba3ac61d3 100644 --- a/src/ModuleBase/ModuleBase_WidgetDoubleValue.cpp +++ b/src/ModuleBase/ModuleBase_WidgetDoubleValue.cpp @@ -20,10 +20,19 @@ #include #include +#include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -149,8 +158,19 @@ bool ModuleBase_WidgetDoubleValue::storeValueCustom() AttributeDoublePtr aReal = aData->real(attributeID()); if (mySpinBox->hasVariable()) { // Here is a text of a real value or an expression. - std::string aText = mySpinBox->text().toStdString(); - aReal->setText(aText); + QString aText = mySpinBox->text(); + if (aText.contains('=')) { + if (!myParameter.get()) { + myParameter = createParameter(aText); + } else { + editParameter(aText); + } + aText = aText.split('=').at(0) + "="; + } else if (myParameter.get()){ + // Nullyfy the parameter reference without deletion of the created + myParameter = FeaturePtr(); + } + aReal->setText(aText.toStdString()); } else { // it is important to set the empty text value to the attribute before set the value // because setValue tries to calculate the attribute value according to the @@ -168,7 +188,16 @@ bool ModuleBase_WidgetDoubleValue::restoreValueCustom() AttributeDoublePtr aRef = aData->real(attributeID()); std::string aTextRepr = aRef->text(); if (!aTextRepr.empty()) { - ModuleBase_Tools::setSpinText(mySpinBox, QString::fromStdString(aTextRepr)); + QString aText = QString::fromStdString(aTextRepr); + if (aText.endsWith('=')) { + if (!myParameter.get()) { + QString aName = aText.left(aText.length() - aText.indexOf('=')).trimmed(); + myParameter = findParameter(aName); + } + AttributeStringPtr aExprAttr = myParameter->string("expression"); + aText += aExprAttr->value().c_str(); + } + ModuleBase_Tools::setSpinText(mySpinBox, aText); } else { ModuleBase_Tools::setSpinValue(mySpinBox, aRef->isInitialized() ? aRef->value() : 0); } @@ -196,3 +225,98 @@ bool ModuleBase_WidgetDoubleValue::processEnter() } return isModified; } + + +FeaturePtr ModuleBase_WidgetDoubleValue::createParameter(const QString& theText) const +{ + FeaturePtr aParameter; + QStringList aList = theText.split("="); + QString aParamName = aList.at(0).trimmed(); + + if (isNameExist(aParamName)) { + return aParameter; + } + + if (!ModelAPI_Expression::isVariable(aParamName.toStdString())) { + return aParameter; + } + + QString aExpression = aList.at(1).trimmed(); + if (aExpression.isEmpty()) { + return aParameter; + } + + SessionPtr aMgr = ModelAPI_Session::get(); + std::shared_ptr aDoc = aMgr->activeDocument(); + + aParameter = aDoc->addFeature("Parameter"); + if (aParameter.get()) { + AttributeStringPtr aNameAttr = aParameter->string("variable"); + aNameAttr->setValue(aParamName.toStdString()); + + AttributeStringPtr aExprAttr = aParameter->string("expression"); + aExprAttr->setValue(aExpression.toStdString()); + aParameter->execute(); + + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED)); + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); + } + return aParameter; +} + +bool ModuleBase_WidgetDoubleValue::isNameExist(const QString& theName) const +{ + SessionPtr aMgr = ModelAPI_Session::get(); + std::shared_ptr aDoc = aMgr->activeDocument(); + FeaturePtr aParamFeature; + int aNbFeatures = aDoc->numInternalFeatures(); + std::string aName = theName.toStdString(); + for (int i = 0; i < aNbFeatures; i++) { + aParamFeature = aDoc->internalFeature(i); + if (aParamFeature && aParamFeature->getKind() == "Parameter") { + if ((myParameter != aParamFeature) && (aParamFeature->name() == aName)) + return true; + } + } + return false; +} + +void ModuleBase_WidgetDoubleValue::editParameter(const QString& theText) +{ + QStringList aList = theText.split("="); + QString aParamName = aList.at(0).trimmed(); + + QString aExpression = aList.at(1).trimmed(); + if (aExpression.isEmpty()) { + return; + } + + if (isNameExist(aParamName)) { + return; + } + AttributeStringPtr aNameAttr = myParameter->string("variable"); + aNameAttr->setValue(aParamName.toStdString()); + + AttributeStringPtr aExprAttr = myParameter->string("expression"); + aExprAttr->setValue(aExpression.toStdString()); + myParameter->execute(); + + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); +} + +FeaturePtr ModuleBase_WidgetDoubleValue::findParameter(const QString& theName) const +{ + SessionPtr aMgr = ModelAPI_Session::get(); + std::shared_ptr aDoc = aMgr->activeDocument(); + FeaturePtr aParamFeature; + int aNbFeatures = aDoc->numInternalFeatures(); + std::string aName = theName.toStdString(); + for (int i = 0; i < aNbFeatures; i++) { + aParamFeature = aDoc->internalFeature(i); + if (aParamFeature && aParamFeature->getKind() == "Parameter") { + if (aParamFeature->name() == aName) + return aParamFeature; + } + } + return FeaturePtr(); +} diff --git a/src/ModuleBase/ModuleBase_WidgetDoubleValue.h b/src/ModuleBase/ModuleBase_WidgetDoubleValue.h index 347f3ca99..28d7b4e2e 100644 --- a/src/ModuleBase/ModuleBase_WidgetDoubleValue.h +++ b/src/ModuleBase/ModuleBase_WidgetDoubleValue.h @@ -80,12 +80,23 @@ protected: /// \return true if the widget current value is reset virtual bool resetCustom(); +private: + FeaturePtr createParameter(const QString& theText) const; + + void editParameter(const QString& theText); + + bool isNameExist(const QString& theName) const; + + FeaturePtr findParameter(const QString& theName) const; + protected: /// Label of the widget QLabel* myLabel; /// Input value control ModuleBase_ParamSpinBox* mySpinBox; + + FeaturePtr myParameter; }; #endif -- 2.39.2