]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Correction for Delete processing.
authornds <nds@opencascade.com>
Thu, 14 Jan 2016 11:41:05 +0000 (14:41 +0300)
committernds <nds@opencascade.com>
Thu, 14 Jan 2016 11:41:05 +0000 (14:41 +0300)
It should be done in a separate listener. Because when operation manager is an install filter for qApp, it will process, besides Delete key, Enter key release of application. But we need to process Enter key release only for Property Panel.
In previous case there were regressions, such as:
1. OpenParts: dimension constraint, Enter in flyout point do nothing
2. OpenParts: enter in save dialog leads to crash.

src/XGUI/XGUI_OperationMgr.cpp
src/XGUI/XGUI_OperationMgr.h

index 4b6b2257939c0cc975379d3e8c99aacb11a816cb..e46877afa762f5a37717520d80b0f871cd5d812b 100644 (file)
 
 //#define DEBUG_CURRENT_FEATURE
 
+/// Processes "Delete" key event of application. This key is used by several application actions.
+/// There is a logical order of the actions processing. So the key can not be set for actions
+/// as a shortcut. The class listens the key event and call operation manager processor.
+class XGUI_ShortCutListener : public QObject
+{
+public:
+  /// Constructor
+  /// \param theParent the parent to be deleted when the parent is deleted
+  /// \param theOperationMgr the class to perform deletion
+  XGUI_ShortCutListener(QObject* theParent, XGUI_OperationMgr* theOperationMgr)
+    : QObject(theParent), myOperationMgr(theOperationMgr)
+  {
+    qApp->installEventFilter(this);
+  }
+  ~XGUI_ShortCutListener() {}
+
+  /// Redefinition of virtual function to process Delete key release
+  virtual bool eventFilter(QObject *theObject, QEvent *theEvent)
+  {
+    bool isAccepted = false;
+    if (theEvent->type() == QEvent::KeyRelease) {
+      QKeyEvent* aKeyEvent = dynamic_cast<QKeyEvent*>(theEvent);
+      if(aKeyEvent) {
+        switch (aKeyEvent->key()) {
+          case Qt::Key_Delete: {
+            isAccepted = myOperationMgr->onProcessDelete();
+          }
+        }
+      }
+    }
+    if (!isAccepted)
+      isAccepted = QObject::eventFilter(theObject, theEvent);
+    return isAccepted;
+  }
+
+private:
+  XGUI_OperationMgr* myOperationMgr; /// processor for key event
+};
+
 XGUI_OperationMgr::XGUI_OperationMgr(QObject* theParent,
                                      ModuleBase_IWorkshop* theWorkshop)
 : QObject(theParent), myWorkshop(theWorkshop)
@@ -38,7 +77,7 @@ XGUI_OperationMgr::XGUI_OperationMgr(QObject* theParent,
   /// we need to install filter to the application in order to react to 'Delete' key button
   /// this key can not be a short cut for a corresponded action because we need to set
   /// the actions priority
-  //qApp->installEventFilter(this);
+  XGUI_ShortCutListener* aShortCutListener = new XGUI_ShortCutListener(theParent, this);
 }
 
 XGUI_OperationMgr::~XGUI_OperationMgr()
@@ -531,9 +570,6 @@ bool XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent)
         }
       }
     }
-    case Qt::Key_Delete: {
-      isAccepted = onProcessDelete();
-    }
     break;
     break;
     default:
index b87501c4b8066d4a87c64619b1a95e463bb9d92a..fba23b0d4d890673000871f72e4d83371c10017f 100755 (executable)
@@ -162,17 +162,17 @@ protected: // TEMPORARY
   /// \param theEvent the mouse event
   bool onKeyReleased(QKeyEvent* theEvent);
 
- protected slots:
-  /// The functionaly, that should be done by enter click
-  /// Fistly the active widget processes it, then module. If no one does not
-  /// process it, the current operation is committed
-  bool onProcessEnter();
-
   /// The functionaly, that should be done by delete click
   /// Fistly the active widget processes it, then workshop. If no one does not
   /// process it, do nothing
   bool onProcessDelete();
 
+  protected slots:
+  /// The functionaly, that should be done by enter click
+  /// Fistly the active widget processes it, then module. If no one does not
+  /// process it, the current operation is committed
+  bool onProcessEnter();
+
   /// Slot that is called by an operation stop. Removes the stopped operation form the stack.
   /// If there is a suspended operation, restart it.
   void onOperationStopped();