]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issues #2173, #2169: key release processing in global events listener(processing...
authornds <nds@opencascade.com>
Thu, 25 May 2017 17:35:07 +0000 (20:35 +0300)
committernds <nds@opencascade.com>
Thu, 25 May 2017 17:35:07 +0000 (20:35 +0300)
Improvin Widget Editor to correctly process Enter event in global events listener.

src/ModuleBase/ModuleBase_DoubleSpinBox.cpp
src/ModuleBase/ModuleBase_DoubleSpinBox.h
src/ModuleBase/ModuleBase_WidgetEditor.cpp
src/ModuleBase/ModuleBase_WidgetEditor.h
src/XGUI/XGUI_OperationMgr.cpp
src/XGUI/XGUI_OperationMgr.h

index b5af3da5403a93398878c9f581c3f389e69242d5..d1b8efa1744000e19d8317ac5613096ead016e97 100644 (file)
@@ -59,8 +59,7 @@ const double PSEUDO_ZERO = 1.e-20;
  */
 ModuleBase_DoubleSpinBox::ModuleBase_DoubleSpinBox(QWidget* theParent, int thePrecision)
     : QDoubleSpinBox(theParent),
-      myCleared(false),
-      myIsEmitKeyPressEvent(false)
+      myCleared(false)
 {
   setLocale(ModuleBase_Tools::doubleLocale());
 
@@ -198,42 +197,6 @@ QString ModuleBase_DoubleSpinBox::removeTrailingZeroes(const QString& src) const
   return res;
 }
 
-void ModuleBase_DoubleSpinBox::keyPressEvent(QKeyEvent* theEvent)
-{
-  switch (theEvent->key()) {
-    case Qt::Key_Enter:
-    case Qt::Key_Return: {
-      // do not react to the Enter key, the property panel processes it
-      if (!myIsEmitKeyPressEvent)
-        return;
-    }
-    break;
-    default:
-      break;
-  }
-  QDoubleSpinBox::keyPressEvent(theEvent);
-}
-
-void ModuleBase_DoubleSpinBox::keyReleaseEvent(QKeyEvent* theEvent)
-{
-  switch (theEvent->key()) {
-    case Qt::Key_Enter:
-    case Qt::Key_Return: {
-      // the enter has already been processed when key is pressed,
-      // key release should not be processed in operation manager
-      if (myIsEmitKeyPressEvent) {
-        theEvent->accept();
-        emit enterReleased();
-        return;
-      }
-    }
-    break;
-    default:
-      break;
-  }
-  QDoubleSpinBox::keyReleaseEvent(theEvent);
-}
-
 /*!
  \brief Perform \a steps increment/decrement steps.
 
@@ -348,14 +311,6 @@ void ModuleBase_DoubleSpinBox::onTextChanged(const QString& )
   myCleared = false;
 }
 
-bool ModuleBase_DoubleSpinBox::enableKeyPressEvent(const bool& theEnable)
-{
-  bool aPreviousValue = myIsEmitKeyPressEvent;
-  myIsEmitKeyPressEvent = theEnable;
-
-  return aPreviousValue;
-}
-
 void ModuleBase_DoubleSpinBox::setValueEnabled(const bool& theEnable)
 {
   setReadOnly(!theEnable);
index 982b1088d264ec4a9d1d5fea2e636ae913e9c164..237bd704f757122fe70501dba8d0e466d0ba0919 100644 (file)
@@ -51,19 +51,10 @@ Q_OBJECT
   /// Validate current value
   virtual QValidator::State validate(QString&, int&) const;
 
-  /// Change enable/disable internal state to emit key press event
-  /// \param theEnable if true, the signal is emitted
-  /// \return the previous value
-  bool enableKeyPressEvent(const bool& theEnable);
-
   /// Imitation of disable control value. If theEnable is false, the control becomes
   /// read only and base color is disabled.
   void setValueEnabled(const bool& theEnable);
 
-signals:
-  /// The signal about key release on the control, that corresponds to the attribute
-  void enterReleased();
-
  protected slots:
    /// Called on text changed
   virtual void onTextChanged(const QString&);
@@ -71,11 +62,6 @@ signals:
  protected:
    /// Removes extra trailing zero symbols
   QString removeTrailingZeroes(const QString&) const;
-  /// Called on key press event
-  virtual void keyReleaseEvent(QKeyEvent* theEvent);
-
-  /// Called on key press event
-  virtual void keyPressEvent(QKeyEvent* theEvent);
 
  private:
   // boolen flag whether the key event is emitted. The default value is false
index 406c6343f28508ccc960785522e2620385d5a63f..2725012c32e1d31c46427612ece7a6951dc79492 100644 (file)
@@ -35,7 +35,7 @@
 ModuleBase_WidgetEditor::ModuleBase_WidgetEditor(QWidget* theParent,
                                                  const Config_WidgetAPI* theData)
 : ModuleBase_WidgetDoubleValue(theParent, theData),
-  myXPosition(-1), myYPosition(-1)
+  myXPosition(-1), myYPosition(-1), myEditorDialog(0)
 {
 }
 
@@ -47,13 +47,12 @@ bool ModuleBase_WidgetEditor::editedValue(double& outValue, QString& outText)
 {
   bool isValueAccepted = false;
 
-  QDialog aDlg(QApplication::desktop(), Qt::FramelessWindowHint);
-  QHBoxLayout* aLay = new QHBoxLayout(&aDlg);
-  aLay->setContentsMargins(2, 2, 2, 2);
+  myEditorDialog = new QDialog(QApplication::desktop(), Qt::FramelessWindowHint);
 
-  ModuleBase_ParamSpinBox* anEditor = new ModuleBase_ParamSpinBox(&aDlg);
-  anEditor->enableKeyPressEvent(true);
+  QHBoxLayout* aLay = new QHBoxLayout(myEditorDialog);
+  aLay->setContentsMargins(2, 2, 2, 2);
 
+  ModuleBase_ParamSpinBox* anEditor = new ModuleBase_ParamSpinBox(myEditorDialog);
   anEditor->setMinimum(0);
   anEditor->setMaximum(DBL_MAX);
   if (outText.isEmpty())
@@ -65,14 +64,13 @@ bool ModuleBase_WidgetEditor::editedValue(double& outValue, QString& outText)
 
   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);
-  isValueAccepted = aDlg.exec() == QDialog::Accepted;
+  myEditorDialog->move(aPoint);
+  isValueAccepted = myEditorDialog->exec() == QDialog::Accepted;
   if (isValueAccepted) {
     outText = anEditor->text();
     bool isDouble;
@@ -82,6 +80,8 @@ bool ModuleBase_WidgetEditor::editedValue(double& outValue, QString& outText)
       outText = ""; // return empty string, if it's can be converted to a double
     }
   }
+  delete myEditorDialog;
+  myEditorDialog = 0;
   return isValueAccepted;
 }
 
@@ -141,3 +141,13 @@ void ModuleBase_WidgetEditor::setCursorPosition(const int theX, const int theY)
   myXPosition = theX;
   myYPosition = theY;
 }
+
+bool ModuleBase_WidgetEditor::processEnter()
+{
+  if (myEditorDialog) {
+    myEditorDialog->accept();
+    return true;
+  }
+
+  return ModuleBase_WidgetDoubleValue::processEnter();
+}
index 51d7eff6095781c08fcc254a43c4fcb298bdf3d6..1232a1dec55eaa5a39d4648ee59140465879307d 100644 (file)
@@ -14,6 +14,7 @@
 #include <QStringList>
 
 class ModelAPI_Feature;
+class QDialog;
 class QLineEdit;
 
 /**\class ModuleBase_WidgetEditor
@@ -53,6 +54,9 @@ Q_OBJECT
   /// \param theY the Y coordinate
   void setCursorPosition(const int theX, const int theY);
 
+  /// Returns true if the event is processed.
+  virtual bool processEnter();
+
 private:
   /// Show editor
   /// \param theOutValue a result value
@@ -68,6 +72,8 @@ private:
    QStringList myFeatureKinds;
 
    int myXPosition, myYPosition;
+
+   QDialog* myEditorDialog;
 };
 
 #endif
index ac052a4d6b894de45a79d009b6dfba244737f02f..17e7ae51f46eb799fc19eca9da2b60e29d46cdfc 100644 (file)
@@ -60,11 +60,15 @@ public:
     bool isAccepted = false;
     if (myIsActive && theEvent->type() == QEvent::KeyRelease) {
       QKeyEvent* aKeyEvent = dynamic_cast<QKeyEvent*>(theEvent);
-      if(aKeyEvent) {
+      if (aKeyEvent) {
         switch (aKeyEvent->key()) {
-          case Qt::Key_Delete: {
+          case Qt::Key_Delete:
             isAccepted = myOperationMgr->onProcessDelete(theObject);
-          }
+          break;
+          default:
+            myOperationMgr->onKeyReleased(theObject, aKeyEvent);
+            isAccepted = true;
+            break;
         }
       }
     }
@@ -171,20 +175,6 @@ ModuleBase_Operation* XGUI_OperationMgr::previousOperation(ModuleBase_Operation*
   return myOperations.at(idx - 1);
 }
 
-bool XGUI_OperationMgr::eventFilter(QObject *theObject, QEvent *theEvent)
-{
-  bool isAccepted = false;
-  if (theEvent->type() == QEvent::KeyRelease) {
-    QKeyEvent* aKeyEvent = dynamic_cast<QKeyEvent*>(theEvent);
-    if(aKeyEvent)
-      isAccepted = onKeyReleased(theObject, aKeyEvent);
-  }
-  if (!isAccepted)
-    isAccepted = QObject::eventFilter(theObject, theEvent);
-
-  return isAccepted;
-}
-
 bool XGUI_OperationMgr::startOperation(ModuleBase_Operation* theOperation)
 {
   if (hasOperation())
@@ -617,6 +607,7 @@ bool XGUI_OperationMgr::onKeyReleased(QObject *theObject, QKeyEvent* theEvent)
         if (aPanel) { // check for case when the operation is started but property panel is not filled
           XGUI_PropertyPanel* aPP = dynamic_cast<XGUI_PropertyPanel*>(aPanel);
           aPP->focusNextPrevChild_(theEvent->key() == Qt::Key_Tab);
+          isAccepted = true;
         }
       }
     }
@@ -661,10 +652,11 @@ bool XGUI_OperationMgr::onProcessEnter(QObject* theObject)
   if (!aOperation)
     return isAccepted;
   ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
+  // the next code is obsolete as we want to process Enter in property panel always
   // only property panel enter is processed in order to do not process enter in application dialogs
-  bool isPPChild = isChildObject(theObject, aPanel);
-  if (!isPPChild)
-    return isAccepted;
+  //bool isPPChild = isChildObject(theObject, aPanel);
+  //if (!isPPChild)
+  //  return isAccepted;
 
   ModuleBase_ModelWidget* anActiveWgt = aPanel->activeWidget();
   bool isAborted = false;
index c8ccf9d08a7b2d1380db13cfe2f550e6f21ca277..f1106c342b4114d61a79e1de890fa382dfd0ac69 100755 (executable)
@@ -88,11 +88,6 @@ Q_OBJECT
   /// else, or if there is no parent - returns NULL
   ModuleBase_Operation* previousOperation(ModuleBase_Operation* theOperation) const;
 
-  /// Redefinition of virtual function
-  /// \param theObject a sender of the event
-  /// \param theEvent the event
-  virtual bool eventFilter(QObject *theObject, QEvent *theEvent);
-
   /// Start the operation and append it to the stack of operations
   /// \param theOperation the started operation
   /// \return the state whether the current operation is started