Salome HOME
Make same planes cannot be used twice in partition tool
[modules/shaper.git] / src / XGUI / XGUI_OperationMgr.cpp
index f8879aa62eddfcff893e0f493d11218a527c1751..3e6c412235cbbcaef8a5b84a0576d08f1632c321 100644 (file)
@@ -48,11 +48,14 @@ public:
   }
   ~XGUI_ShortCutListener() {}
 
+  /// Switch on short cut listener
+  void setActive(const bool theIsActive) { myIsActive = theIsActive; }
+
   /// Redefinition of virtual function to process Delete key release
   virtual bool eventFilter(QObject *theObject, QEvent *theEvent)
   {
     bool isAccepted = false;
-    if (theEvent->type() == QEvent::KeyRelease) {
+    if (myIsActive && theEvent->type() == QEvent::KeyRelease) {
       QKeyEvent* aKeyEvent = dynamic_cast<QKeyEvent*>(theEvent);
       if(aKeyEvent) {
         switch (aKeyEvent->key()) {
@@ -69,6 +72,7 @@ public:
 
 private:
   XGUI_OperationMgr* myOperationMgr; /// processor for key event
+  bool myIsActive; /// boolean state whether the event filter perform own signal processing
 };
 
 XGUI_OperationMgr::XGUI_OperationMgr(QObject* theParent,
@@ -78,13 +82,23 @@ 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
-  XGUI_ShortCutListener* aShortCutListener = new XGUI_ShortCutListener(theParent, this);
+  myShortCutListener = new XGUI_ShortCutListener(theParent, this);
 }
 
 XGUI_OperationMgr::~XGUI_OperationMgr()
 {
 }
 
+void XGUI_OperationMgr::activate()
+{
+  myShortCutListener->setActive(true);
+}
+
+void XGUI_OperationMgr::deactivate()
+{
+  myShortCutListener->setActive(false);
+}
+
 ModuleBase_Operation* XGUI_OperationMgr::currentOperation() const
 {
   return myOperations.count() > 0 ? myOperations.last() : 0;
@@ -631,12 +645,19 @@ bool XGUI_OperationMgr::onProcessDelete(QObject* theObject)
   ModuleBase_ModelWidget* anActiveWgt = 0;
   // firstly the widget should process Delete action
   ModuleBase_IPropertyPanel* aPanel;
+  bool isPPChildObject = false;
   if (aOperation) {
     aPanel = aOperation->propertyPanel();
-    if (aPanel)
-      anActiveWgt = aPanel->activeWidget();
-    if (anActiveWgt) {
-      isAccepted = anActiveWgt->processDelete();
+    if (aPanel) {
+      isPPChildObject = isChildObject(theObject, aPanel);
+      // process delete in active widget only if delete sender is child of property panel
+      // it is necessary for the case when OB is shown, user perform selection and click Delete
+      if (isPPChildObject) {
+        anActiveWgt = aPanel->activeWidget();
+        if (anActiveWgt) {
+          isAccepted = anActiveWgt->processDelete();
+        }
+      }
     }
   }
   if (!isAccepted) {
@@ -645,8 +666,10 @@ bool XGUI_OperationMgr::onProcessDelete(QObject* theObject)
     /// processing delete by workshop
     XGUI_ObjectsBrowser* aBrowser = workshop()->objectBrowser();
     QWidget* aViewPort = myWorkshop->viewer()->activeViewPort();
-    if (isChildObject(theObject, aBrowser) ||
-        isChildObject(theObject, aViewPort))
+    // property panel child object is processed to process delete performed on Apply button of PP
+    if (theObject == aBrowser->treeView() ||
+        isChildObject(theObject, aViewPort) ||
+        isPPChildObject)
       workshop()->deleteObjects();
     isAccepted = true;
   }