Salome HOME
#1136 - hidden axis are selected in sketch
[modules/shaper.git] / src / ModuleBase / ModuleBase_WidgetEditor.cpp
index 1c26b11ebf3b0aa43ee8ac060a66976cfa7c160a..aa4cd79b70bdaa0d9af645402e6779dd43788e61 100644 (file)
 #include <QWidgetAction>
 #include <QRegExp>
 #include <QRegExpValidator>
+#include <QDesktopWidget>
+#include <QDialog>
+#include <QLayout>
 
 ModuleBase_WidgetEditor::ModuleBase_WidgetEditor(QWidget* theParent,
                                                  const Config_WidgetAPI* theData,
                                                  const std::string& theParentId)
-    : ModuleBase_WidgetDoubleValue(theParent, theData, theParentId)
+: ModuleBase_WidgetDoubleValue(theParent, theData, theParentId),
+  //myIsEnterPressedEmitted(false),
+  myXPosition(-1), myYPosition(-1)
 {
 }
 
@@ -40,64 +45,102 @@ ModuleBase_WidgetEditor::~ModuleBase_WidgetEditor()
 {
 }
 
-void editedValue(double& outValue, QString& outText)
+void ModuleBase_WidgetEditor::editedValue(double& outValue, QString& outText)
 {
-  QMenu* aPopup = new QMenu();
-
-  QLineEdit* aEditor = new QLineEdit(QString::number(outValue), aPopup);
-  QWidgetAction* aLineEditAction = new QWidgetAction(aPopup);
-  aLineEditAction->setDefaultWidget(aEditor);
-  aPopup->addAction(aLineEditAction);
-
-  aEditor->setFocus();
-  aEditor->selectAll();
-  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();
+  QDialog aDlg(QApplication::desktop(), Qt::FramelessWindowHint);
+  QHBoxLayout* aLay = new QHBoxLayout(&aDlg);
+  aLay->setContentsMargins(2, 2, 2, 2);
+
+  ModuleBase_ParamSpinBox* anEditor = new ModuleBase_ParamSpinBox(&aDlg);
+  anEditor->enableKeyPressEvent(true);
+  //if (!myIsEditing) {
+  //  connect(anEditor, SIGNAL(enterPressed()), this, SLOT(onEnterPressed()));
+  //}
+
+  anEditor->setMinimum(0);
+  anEditor->setMaximum(DBL_MAX);
+  if (outText.isEmpty())
+    anEditor->setValue(outValue);
+  else
+    anEditor->setText(outText);
+
+  aLay->addWidget(anEditor);
+
+  ModuleBase_Tools::setFocus(anEditor, "ModuleBase_WidgetEditor::editedValue");
+  anEditor->selectAll();
+  QObject::connect(anEditor, SIGNAL(enterReleased()), &aDlg, SLOT(accept()));
+
+  QPoint aPoint = QCursor::pos();
+  if (myXPosition >= 0 && myYPosition >= 0)
+    aPoint = QPoint(myXPosition, myYPosition);
+
+  aDlg.move(aPoint);
+  aDlg.exec();
+
+  //if (!myIsEditing) {
+  //  disconnect(anEditor, SIGNAL(keyReleased(QKeyEvent*)), this, SLOT(onEnterPressed()));
+  //}
+
+  outText = anEditor->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
+    outText = ""; // return empty string, if it's can be converted to a double
   }
-  aPopup->deleteLater();
 }
 
 bool ModuleBase_WidgetEditor::focusTo()
 {
-  // nds: it seems, that the timer is not necessary anymore
-
-  // We can not launch here modal process for value editing because 
-  // it can be called on other focusOutWidget event and will block it
-  //QTimer::singleShot(1, this, SLOT(showPopupEditor()));
-
   showPopupEditor();
-
   return true;
 }
 
-void ModuleBase_WidgetEditor::showPopupEditor()
+void ModuleBase_WidgetEditor::showPopupEditor(const bool theSendSignals)
 {
+  //myIsEnterPressedEmitted = false;
+
   // we need to emit the focus in event manually in order to save the widget as an active
   // in the property panel before the mouse leave event happens in the viewer. The module
   // ask an active widget and change the feature visualization if the widget is not the current one.
-  emit focusInWidget(this);
+  if (theSendSignals)
+    emit focusInWidget(this);
 
   // nds: it seems, that the envents processing is not necessary anymore
   // White while all events will be processed
   //QApplication::processEvents();
   double aValue = mySpinBox->value();
   QString aText;
+  if (mySpinBox->hasVariable())
+    aText = mySpinBox->text();
+
   editedValue(aValue, aText);
   if (aText.isEmpty()) {
     ModuleBase_Tools::setSpinValue(mySpinBox, aValue);
   } else {
     ModuleBase_Tools::setSpinText(mySpinBox, aText);
   }
-  emit valuesChanged();
-  emit focusOutWidget(this);
+  if (theSendSignals) {
+    emit valuesChanged();
+    // the focus leaves the control automatically by the Enter/Esc event
+    // it is processed in operation manager
+    //emit focusOutWidget(this);
+
+    //if (myIsEnterPressedEmitted)
+    if (!myIsEditing)
+      emit enterClicked();
+  }
+  else
+    storeValue();
+}
+
+/*void ModuleBase_WidgetEditor::onEnterPressed()
+{
+  myIsEnterPressedEmitted = true;
+}*/
+
+void ModuleBase_WidgetEditor::setCursorPosition(const int theX, const int theY)
+{
+  myXPosition = theX;
+  myYPosition = theY;
 }