Salome HOME
Task 2.7: Code completion
authorVitaly SMETANNIKOV <vsv@nnov.opencascade.com>
Mon, 28 May 2018 12:35:40 +0000 (15:35 +0300)
committervsv <vsv@opencascade.com>
Mon, 28 May 2018 12:48:47 +0000 (15:48 +0300)
src/ModuleBase/ModuleBase_ParamSpinBox.cpp
src/ModuleBase/ModuleBase_ParamSpinBox.h
src/ModuleBase/ModuleBase_WidgetDoubleValue.cpp
src/ModuleBase/ModuleBase_WidgetDoubleValue.h

index 4438684664dc273d3b71b17d9c12aaaed609cfd8..6c5ce02bb9e7539fce01e833cd9a6a37bbb5dbbf 100644 (file)
 
 #include "ModuleBase_ParamSpinBox.h"
 
-#include <ModelAPI_Session.h>
-#include <ModelAPI_Document.h>
-#include <ModelAPI_Feature.h>
-#include <ModelAPI_ResultParameter.h>
-#include <ModelAPI_AttributeDouble.h>
-#include <ModelAPI_Tools.h>
-
 #include <QKeyEvent>
 #include <QLocale>
 #include <QRegExp>
@@ -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));
 }
 
 
index 16ab6378909e0f320d7fa08f9ee18abe73e62ad2..4e12ffe1eb6834458f69ddd58b70db70a746527c 100644 (file)
@@ -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;
 
index 9a66c6b51e4116689b612c53708c009c7d73400f..ba3ac61d3c11348d86a0fa4ffa0205a86fa8bab9 100644 (file)
 
 #include <Config_Keywords.h>
 #include <Config_WidgetAPI.h>
+#include <Events_Loop.h>
 
 #include <ModelAPI_AttributeDouble.h>
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Object.h>
+#include <ModelAPI_Expression.h>
+#include <ModelAPI_AttributeString.h>
+#include <ModelAPI_Session.h>
+#include <ModelAPI_Document.h>
+#include <ModelAPI_ResultParameter.h>
+#include <ModelAPI_AttributeDouble.h>
+#include <ModelAPI_Tools.h>
+#include <ModelAPI_Events.h>
 
 #include <ModuleBase_ParamSpinBox.h>
 #include <ModuleBase_Tools.h>
@@ -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<ModelAPI_Document> 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<ModelAPI_Document> 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<ModelAPI_Document> 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();
+}
index 347f3ca99700be165d63dccdbc6ddda2602ae558..28d7b4e2e76f1aaf6eb8ab65887e7338195035ce 100644 (file)
@@ -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