From bad65fe398d0ed427d25bbc761c842e0e84e608a Mon Sep 17 00:00:00 2001 From: nds Date: Thu, 25 May 2017 20:35:07 +0300 Subject: [PATCH] Issues #2173, #2169: key release processing in global events listener(processing Tab/Backward Tab) Improvin Widget Editor to correctly process Enter event in global events listener. --- src/ModuleBase/ModuleBase_DoubleSpinBox.cpp | 47 +-------------------- src/ModuleBase/ModuleBase_DoubleSpinBox.h | 14 ------ src/ModuleBase/ModuleBase_WidgetEditor.cpp | 28 ++++++++---- src/ModuleBase/ModuleBase_WidgetEditor.h | 6 +++ src/XGUI/XGUI_OperationMgr.cpp | 32 ++++++-------- src/XGUI/XGUI_OperationMgr.h | 5 --- 6 files changed, 38 insertions(+), 94 deletions(-) diff --git a/src/ModuleBase/ModuleBase_DoubleSpinBox.cpp b/src/ModuleBase/ModuleBase_DoubleSpinBox.cpp index b5af3da54..d1b8efa17 100644 --- a/src/ModuleBase/ModuleBase_DoubleSpinBox.cpp +++ b/src/ModuleBase/ModuleBase_DoubleSpinBox.cpp @@ -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); diff --git a/src/ModuleBase/ModuleBase_DoubleSpinBox.h b/src/ModuleBase/ModuleBase_DoubleSpinBox.h index 982b1088d..237bd704f 100644 --- a/src/ModuleBase/ModuleBase_DoubleSpinBox.h +++ b/src/ModuleBase/ModuleBase_DoubleSpinBox.h @@ -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 diff --git a/src/ModuleBase/ModuleBase_WidgetEditor.cpp b/src/ModuleBase/ModuleBase_WidgetEditor.cpp index 406c6343f..2725012c3 100644 --- a/src/ModuleBase/ModuleBase_WidgetEditor.cpp +++ b/src/ModuleBase/ModuleBase_WidgetEditor.cpp @@ -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(); +} diff --git a/src/ModuleBase/ModuleBase_WidgetEditor.h b/src/ModuleBase/ModuleBase_WidgetEditor.h index 51d7eff60..1232a1dec 100644 --- a/src/ModuleBase/ModuleBase_WidgetEditor.h +++ b/src/ModuleBase/ModuleBase_WidgetEditor.h @@ -14,6 +14,7 @@ #include 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 diff --git a/src/XGUI/XGUI_OperationMgr.cpp b/src/XGUI/XGUI_OperationMgr.cpp index ac052a4d6..17e7ae51f 100644 --- a/src/XGUI/XGUI_OperationMgr.cpp +++ b/src/XGUI/XGUI_OperationMgr.cpp @@ -60,11 +60,15 @@ public: bool isAccepted = false; if (myIsActive && theEvent->type() == QEvent::KeyRelease) { QKeyEvent* aKeyEvent = dynamic_cast(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(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(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; diff --git a/src/XGUI/XGUI_OperationMgr.h b/src/XGUI/XGUI_OperationMgr.h index c8ccf9d08..f1106c342 100755 --- a/src/XGUI/XGUI_OperationMgr.h +++ b/src/XGUI/XGUI_OperationMgr.h @@ -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 -- 2.39.2