]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Popup menu for constraints updated: no second window, accepts parameters
authorsbh <sergey.belash@opencascade.com>
Fri, 24 Apr 2015 15:21:20 +0000 (18:21 +0300)
committersbh <sergey.belash@opencascade.com>
Fri, 24 Apr 2015 15:21:20 +0000 (18:21 +0300)
src/ModuleBase/ModuleBase_Tools.cpp
src/ModuleBase/ModuleBase_Tools.h
src/ModuleBase/ModuleBase_WidgetDoubleValue.cpp
src/ModuleBase/ModuleBase_WidgetEditor.cpp
src/ModuleBase/ModuleBase_WidgetEditor.h

index 1d87b4ae22475427772f15b6eefe99eb075f9f67..b42db0d7f5f99623b53f37489a58b0758260f511 100644 (file)
@@ -5,6 +5,7 @@
 // Author:      Vitaly Smetannikov
 
 #include "ModuleBase_Tools.h"
+#include <ModuleBase_ParamSpinBox.h>
 
 #include <ModelAPI_Result.h>
 #include <ModelAPI_Data.h>
@@ -107,6 +108,13 @@ QPixmap lighter(const QString& theIcon, const int theLighterValue)
   return QPixmap::fromImage(aResult);
 }
 
+void setSpinText(ModuleBase_ParamSpinBox* theSpin, const QString& theText)
+{
+  bool isBlocked = theSpin->blockSignals(true);
+  theSpin->setText(theText);
+  theSpin->blockSignals(isBlocked);
+}
+
 void setSpinValue(QDoubleSpinBox* theSpin, double theValue)
 {
   bool isBlocked = theSpin->blockSignals(true);
index 75c6b95fead59ea4ca584d3f93051389952b1304..7bb5ababfee38a43b06c4a38ec70cd9277fe1787 100644 (file)
@@ -17,6 +17,7 @@
 class QWidget;
 class QLayout;
 class QDoubleSpinBox;
+class ModuleBase_ParamSpinBox;
 
 namespace ModuleBase_Tools {
 
@@ -60,6 +61,11 @@ MODULEBASE_EXPORT QPixmap lighter(const QString& theIcon, const int theLighterVa
 /// \param theValue a new value
 MODULEBASE_EXPORT void setSpinValue(QDoubleSpinBox* theSpin, double theValue);
 
+/// Sets programmatically the value to the spin box without emitting any signals(e.g. valueChanged)
+/// \param theSpin an ModuleBase_ParamSpinBox that accepts text
+/// \param theText a new value
+MODULEBASE_EXPORT void setSpinText(ModuleBase_ParamSpinBox* theSpin, const QString& theText);
+
 /// Converts the object to the feature or a result and generate information string
 /// \param theObj an object
 /// \param isUseAttributesInfo a flag whether the attribute values information is used
index 9e222e9869d3d007ef441173dc7b041830977705..b7faf46d67d51fac88ebdc595b7f35379b4df1c3 100644 (file)
@@ -106,7 +106,7 @@ void ModuleBase_WidgetDoubleValue::reset()
     // reset the value just if there is a default value definition in the XML definition
     // if the double value can not be found by the default value, do nothing
     if (isOk) {
-      ModuleBase_Tools::setSpinValue(mySpinBox, isOk ? aDefValue : 0.0);
+      ModuleBase_Tools::setSpinValue(mySpinBox, aDefValue);
       storeValueCustom();
     }
   }
@@ -134,9 +134,7 @@ bool ModuleBase_WidgetDoubleValue::restoreValue()
   AttributeDoublePtr aRef = aData->real(attributeID());
   std::string aTextRepr = aRef->text();
   if (!aTextRepr.empty()) {
-    bool isBlocked = mySpinBox->blockSignals(true);
-    mySpinBox->setText(QString::fromStdString(aTextRepr));
-    mySpinBox->blockSignals(isBlocked);
+    ModuleBase_Tools::setSpinText(mySpinBox, QString::fromStdString(aTextRepr));
   } else {
     ModuleBase_Tools::setSpinValue(mySpinBox, aRef->value());
   }
index aa612eb28329f114451a0d1553d679e36701bc3b..29e07a1f3efb95bb39f6d5c61e9c620b4abc08ac 100644 (file)
 
 #include <GeomDataAPI_Point2D.h>
 
-#include <QWidget>
-#include <QLineEdit>
-//#include <QTimer>
-#include <QDialog>
-#include <QLayout>
 #include <QApplication>
+#include <QLineEdit>
+#include <QMenu>
+#include <QWidget>
+#include <QWidgetAction>
+#include <QRegExp>
+#include <QRegExpValidator>
 
 ModuleBase_WidgetEditor::ModuleBase_WidgetEditor(QWidget* theParent,
                                                  const Config_WidgetAPI* theData,
@@ -39,27 +40,31 @@ ModuleBase_WidgetEditor::~ModuleBase_WidgetEditor()
 {
 }
 
-double editedValue(double theValue, bool& isDone)
+void editedValue(double& outValue, QString& outText)
 {
-  QDialog aDlg;
-  aDlg.setWindowFlags(Qt::FramelessWindowHint);
-  QHBoxLayout* aLay = new QHBoxLayout(&aDlg);
-  ModuleBase_Tools::zeroMargins(aLay);
+  QMenu* aPopup = new QMenu();
+
+  QLineEdit* aEditor = new QLineEdit(QString::number(outValue), aPopup);
+  QWidgetAction* aLineEditAction = new QWidgetAction(aPopup);
+  aLineEditAction->setDefaultWidget(aEditor);
+  aPopup->addAction(aLineEditAction);
 
-  QLineEdit* aEditor = new QLineEdit(QString::number(theValue), &aDlg);
+  aEditor->setFocus();
   aEditor->selectAll();
-  aEditor->setValidator(new QDoubleValidator(aEditor));
-  QObject::connect(aEditor, SIGNAL(returnPressed()), &aDlg, SLOT(accept()));
-  aLay->addWidget(aEditor);
-
-  QPoint aPoint = QCursor::pos();
-  aDlg.move(aPoint);
-
-  isDone = aDlg.exec() == QDialog::Accepted;
-  double aValue = theValue;
-  if (isDone)
-    aValue = aEditor->text().toDouble();
-  return aValue;
+  QString anExpression("([0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?)|([_a-zA-Z][a-zA-Z0-9_]*)");
+  aEditor->setValidator(new QRegExpValidator(QRegExp(anExpression), aEditor));
+  QObject::connect(aEditor, SIGNAL(returnPressed()), aLineEditAction, SIGNAL(triggered()));
+  QObject::connect(aLineEditAction, SIGNAL(triggered()), aPopup, SLOT(hide()));
+
+  QAction* aResult = aPopup->exec(QCursor::pos());
+  outText = aEditor->text();
+  bool isDouble;
+  double aValue = outText.toDouble(&isDouble);
+  if (isDouble) {
+    outValue = aValue;
+    outText = ""; // return empty string, if it's can be converted to a double
+  }
+  aPopup->deleteLater();
 }
 
 bool ModuleBase_WidgetEditor::focusTo()
@@ -86,25 +91,13 @@ void ModuleBase_WidgetEditor::showPopupEditor()
   // White while all events will be processed
   //QApplication::processEvents();
   double aValue = mySpinBox->value();
-  bool isDone;
-  aValue = editedValue(aValue, isDone);
-
-  if (isDone) {
+  QString aText;
+  editedValue(aValue, aText);
+  if (aText.isEmpty()) {
     ModuleBase_Tools::setSpinValue(mySpinBox, aValue);
+  } else {
+    ModuleBase_Tools::setSpinText(mySpinBox, aText);
   }
   emit valuesChanged();
   emit focusOutWidget(this);
 }
-
-void ModuleBase_WidgetEditor::editFeatureValue(FeaturePtr theFeature,
-                                               const std::string theAttribute)
-{
-  DataPtr aData = theFeature->data();
-  AttributeDoublePtr aRef = aData->real(theAttribute);
-  double aValue = aRef->value();
-
-  bool isDone;
-  aValue = editedValue(aValue, isDone);
-  if (isDone)
-    aRef->setValue(aValue);
-}
index c992e60f9c406f9aed6fcb823c9f980c05449abc..8bdf6f9e1d3e43a6acd35f556265b72e22a458ce 100644 (file)
@@ -43,11 +43,6 @@ Q_OBJECT
   /// \return the state whether the widget can accept the focus
   virtual bool focusTo();
 
-  /// Creates an editor for the real value and set the new value to the feature
-  /// \param theFeature the model feature
-  /// \param theAttribute the feature attribute
-  static void editFeatureValue(FeaturePtr theFeature, const std::string theAttribute);
-
  private slots:
    /// Shous popup window under cursor for data editing
    void showPopupEditor();