Salome HOME
updated copyright message
[modules/shaper.git] / src / XGUI / XGUI_OperationMgr.cpp
index 6a16390326fd0c6fcd3e8bcaaf05ee32936fab01..5db1d07a7f8f405993ff2c7fca3df30d2eea37fc 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2019  CEA/DEN, EDF R&D
+// Copyright (C) 2014-2023  CEA, EDF
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -29,6 +29,8 @@
 #include "XGUI_Tools.h"
 #include "XGUI_ObjectsBrowser.h"
 #include "XGUI_ContextMenuMgr.h"
+#include "XGUI_Selection.h"
+#include "XGUI_SelectionMgr.h"
 
 #include <ModuleBase_IPropertyPanel.h>
 #include <ModuleBase_ModelWidget.h>
 #include "ModuleBase_OperationFeature.h"
 #include "ModuleBase_Tools.h"
 
-#include "ModelAPI_CompositeFeature.h"
-#include "ModelAPI_Session.h"
+#include <Config_Translator.h>
+
+#include <ModelAPI_CompositeFeature.h>
+#include <ModelAPI_Session.h>
 
 #include <XGUI_PropertyPanel.h>
 #include <QToolButton>
@@ -50,6 +54,7 @@
 #include <QMessageBox>
 #include <QApplication>
 #include <QKeyEvent>
+#include <QWindow>
 
 //#define DEBUG_CURRENT_FEATURE
 
@@ -62,8 +67,8 @@ 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), myIsActive(false)
+  XGUI_ShortCutListener(XGUI_OperationMgr* theOperationMgr)
+    : QObject(theOperationMgr), myOperationMgr(theOperationMgr), myIsActive(false)
   {
     qApp->installEventFilter(this);
   }
@@ -73,54 +78,76 @@ public:
   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 (myIsActive) {
+  virtual bool eventFilter(QObject *theObject, QEvent *theEvent);
+
+private:
+  XGUI_OperationMgr* myOperationMgr; /// processor for key event
+  bool myIsActive; /// boolean state whether the event filter perform own signal processing
+};
+
+bool XGUI_ShortCutListener::eventFilter(QObject *theObject, QEvent *theEvent)
+{
+  bool isAccepted = false;
+
+  if (myIsActive) {
+    // Do not process keys for modal dialogues: all keys has to be processed within the dialog
+    // There is only one exception: ModuleBase_EditorDialog
+    QWindow* aWnd = qApp->modalWindow();
+    QString aName = "NoModal";
+    if (aWnd) {
+      if (!aWnd->objectName().startsWith("ModuleBase_EditorDialog"))
+        aName = aWnd->objectName();
+    }
+    if (aName == "NoModal") {
       if (theEvent->type() == QEvent::KeyRelease) {
         QKeyEvent* aKeyEvent = dynamic_cast<QKeyEvent*>(theEvent);
         if (aKeyEvent) {
           myOperationMgr->setSHIFTPressed(aKeyEvent->modifiers() & Qt::ShiftModifier);
           switch (aKeyEvent->key()) {
-            case Qt::Key_Delete:
-              isAccepted = myOperationMgr->onProcessDelete(theObject);
+          case Qt::Key_Delete:
+            isAccepted = myOperationMgr->onProcessDelete(theObject);
+            break;
+          case Qt::Key_F2:
+          {
+            QObjectPtrList anObjects = myOperationMgr->xworkshop()->selector()->selection()->selectedObjects();
+            if (myOperationMgr->xworkshop()->abortAllOperations())
+            {
+              myOperationMgr->xworkshop()->objectBrowser()->setObjectsSelected(anObjects);
+              myOperationMgr->xworkshop()->objectBrowser()->onEditItem();
+            }
+            isAccepted = true;
+            break;
+          }
+          default:
+            isAccepted = myOperationMgr->onKeyReleased(theObject, aKeyEvent);
             break;
-            default:
-              isAccepted = myOperationMgr->onKeyReleased(theObject, aKeyEvent);
-              break;
           }
         }
       }
       else if (theEvent->type() == QEvent::KeyPress) {
-        QKeyEvent* aKeyEvent = dynamic_cast<QKeyEvent*>(theEvent);
-        myOperationMgr->setSHIFTPressed(aKeyEvent->modifiers() & Qt::ShiftModifier);
-        switch (aKeyEvent->key()) {
-          case Qt::Key_Escape:
-            isAccepted = myOperationMgr->onKeyPressed(theObject, aKeyEvent);
-          break;
-          default:
-            break;
+        if (myOperationMgr->hasOperation()) {
+          QKeyEvent* aKeyEvent = dynamic_cast<QKeyEvent*>(theEvent);
+          myOperationMgr->setSHIFTPressed(aKeyEvent->modifiers() & Qt::ShiftModifier);
+          isAccepted = myOperationMgr->onKeyPressed(theObject, aKeyEvent);
         }
       }
     }
-    if (!isAccepted)
-      isAccepted = QObject::eventFilter(theObject, theEvent);
-    return isAccepted;
   }
+  if (!isAccepted)
+    isAccepted = QObject::eventFilter(theObject, theEvent);
+  return isAccepted;
+}
+
 
-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,
-                                     ModuleBase_IWorkshop* theWorkshop)
-: QObject(theParent), myWorkshop(theWorkshop), mySHIFTPressed(false), myActiveMessageBox(0)
+  ModuleBase_IWorkshop* theWorkshop)
+: QObject(theParent), myWorkshop(theWorkshop), myActiveMessageBox(0), mySHIFTPressed(false)
 {
   /// 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
-  myShortCutListener = new XGUI_ShortCutListener(theParent, this);
+  myShortCutListener = new XGUI_ShortCutListener(this);
 }
 
 XGUI_OperationMgr::~XGUI_OperationMgr()
@@ -342,7 +369,13 @@ bool XGUI_OperationMgr::canStopOperation(ModuleBase_Operation* theOperation,
   if (isGrantedOperation(theOperation->id()))
     return true;
   if (theOperation && theOperation->isModified()) {
-    QString aTitle = theOperation->getDescription()->description();
+    ModuleBase_OperationFeature* aOp = dynamic_cast<ModuleBase_OperationFeature*>(theOperation);
+    std::string aContext;
+    if (aOp && aOp->feature())
+      aContext = aOp->feature()->getKind();
+    QString aTitle = Config_Translator::translate(aContext,
+      theOperation->getDescription()->description().toStdString()).c_str();
+
     if (theMessageKind == XGUI_AbortOperationMessage) {
       QString aMessage = tr("%1 operation will be aborted.").arg(aTitle);
       myActiveMessageBox = createMessageBox(aMessage);
@@ -372,7 +405,6 @@ bool XGUI_OperationMgr::isGrantedOperation(const QString& theId)
 
   QListIterator<ModuleBase_Operation*> anIt(myOperations);
   anIt.toBack();
-  ModuleBase_Operation* aPreviousOperation = 0;
   while (anIt.hasPrevious() && !isGranted) {
     ModuleBase_Operation* anOp = anIt.previous();
     if (anOp)
@@ -444,16 +476,16 @@ void XGUI_OperationMgr::stopOperation(ModuleBase_Operation* theOperation, bool&
 void XGUI_OperationMgr::abortOperation(ModuleBase_Operation* theOperation)
 {
   ModuleBase_Operation* aCurrentOperation = currentOperation();
-  if (theOperation == aCurrentOperation)
+  if (theOperation && (theOperation == aCurrentOperation))
     theOperation->abort();
   else {
     // it is possible to trigger upper operation(e.g. sketch, current is sketch line)
     // all operation from the current to triggered should also be aborted
     // operations over the parameter one are not aborted(e.g. extrusion cut, sketch abort)
     while(hasOperation()) {
-      ModuleBase_Operation* aCurrentOperation = currentOperation();
-      aCurrentOperation->abort();
-      if(theOperation == aCurrentOperation)
+      ModuleBase_Operation* aCurOperation = currentOperation();
+      aCurOperation->abort();
+      if(theOperation == aCurOperation)
         break;
     }
   }
@@ -634,8 +666,8 @@ void XGUI_OperationMgr::onOperationStopped()
     }
   }
   if (aResultOp) {
-    bool isModified = aCurrentOperation->isModified();
-    aResultOp->setIsModified(aResultOp->isModified() || isModified);
+    //bool isModified = aCurrentOperation->isModified();
+    //aResultOp->setIsModified(aResultOp->isModified() || isModified);
     resumeOperation(aResultOp);
     onValidateOperation();
   }
@@ -684,14 +716,17 @@ bool XGUI_OperationMgr::onKeyReleased(QObject *theObject, QKeyEvent* theEvent)
             aContext->HilightNextDetected(aView);
           else if ((theEvent->key() == Qt::Key_P))
             aContext->HilightPreviousDetected(aView);
-          //aViewer->updateHighlight();
+          aViewer->updateHighlight();
           isAccepted = true;
         }
       }
-    }
-    break;
-    break;
-    default:
+      }
+      break;
+   case Qt::Key_H:
+     if ((theEvent->modifiers() == Qt::NoModifier))
+      myWorkshop->viewer()->hideSelectionHighlight();
+     break;
+   default:
       isAccepted = false;
       break;
   }
@@ -704,7 +739,6 @@ bool XGUI_OperationMgr::onKeyReleased(QObject *theObject, QKeyEvent* theEvent)
 bool XGUI_OperationMgr::onKeyPressed(QObject *theObject, QKeyEvent* theEvent)
 {
   // Let the manager decide what to do with the given key combination.
-  ModuleBase_Operation* anOperation = currentOperation();
   bool isAccepted = false;
   switch (theEvent->key()) {
     case Qt::Key_Escape: {
@@ -718,15 +752,17 @@ bool XGUI_OperationMgr::onKeyPressed(QObject *theObject, QKeyEvent* theEvent)
       ModuleBase_Operation* aOperation = currentOperation();
       if (!isAccepted && aOperation) {
         ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
-        ModuleBase_ModelWidget* anActiveWgt = aPanel->activeWidget();
-        if (anActiveWgt)
-        {
-          isAccepted = anActiveWgt && anActiveWgt->processAction(ActionEscape);
-          if (isAccepted) {
-            ModuleBase_OperationFeature* aFOperation =
-              dynamic_cast<ModuleBase_OperationFeature*>(currentOperation());
-            if (aFOperation)
-              aFOperation->setNeedToBeAborted(true);
+        if (aPanel) {
+          ModuleBase_ModelWidget* anActiveWgt = aPanel->activeWidget();
+          if (anActiveWgt)
+          {
+            isAccepted = anActiveWgt && anActiveWgt->processAction(ActionEscape);
+            if (isAccepted) {
+              ModuleBase_OperationFeature* aFOperation =
+                dynamic_cast<ModuleBase_OperationFeature*>(currentOperation());
+              if (aFOperation)
+                aFOperation->setNeedToBeAborted(true);
+            }
           }
         }
       }
@@ -744,6 +780,10 @@ bool XGUI_OperationMgr::onKeyPressed(QObject *theObject, QKeyEvent* theEvent)
       }
     }
     break;
+    case Qt::Key_H:
+      if ((theEvent->modifiers() == Qt::NoModifier))
+        myWorkshop->viewer()->showSelectionHighlight();
+      break;
   }
   return isAccepted;
 }
@@ -907,3 +947,9 @@ QMessageBox* XGUI_OperationMgr::createInformationBox(const QString& theMessage)
 
   return aMessageBox;
 }
+
+XGUI_Workshop* XGUI_OperationMgr::xworkshop() const
+{
+  XGUI_ModuleConnector* aConnector = (XGUI_ModuleConnector*) myWorkshop;
+  return aConnector->workshop();
+}