Salome HOME
updated copyright message
[modules/shaper.git] / src / XGUI / XGUI_ContextMenuMgr.cpp
index 10a1f7f36997aa21374f8a617101de073441b7d9..9550326bd0f1f6b7b0ad1c2db76d066724cd9142 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2021  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
 #include <QMainWindow>
 #include <QModelIndex>
 
+#ifdef WIN32
+#pragma warning(disable : 4456) // for nested foreach
+#endif
+
 XGUI_ContextMenuMgr::XGUI_ContextMenuMgr(XGUI_Workshop* theParent)
     : QObject(theParent),
       myWorkshop(theParent),
@@ -107,6 +111,10 @@ void XGUI_ContextMenuMgr::createActions()
   addAction("MOVE_SPLIT_CMD", anAction);
 #endif
 
+  anAction = ModuleBase_Tools::createAction(QIcon(":pictures/recover.png"),
+    tr("Recover"), this);
+  addAction("RECOVER_CMD", anAction);
+
   anAction = ModuleBase_Tools::createAction(QIcon(":pictures/clean_history.png"),
                                            tr("Clean history"), aDesktop);
   addAction("CLEAN_HISTORY_CMD", anAction);
@@ -149,6 +157,11 @@ void XGUI_ContextMenuMgr::createActions()
                                            aDesktop);
   addAction("WIREFRAME_CMD", anAction);
 
+  anAction = ModuleBase_Tools::createAction(QIcon(":pictures/edges_dir.png"), tr("Show edges direction"),
+                                           aDesktop);
+  anAction->setCheckable(true);
+  addAction("SHOW_EDGES_DIRECTION_CMD", anAction);
+
   anAction = ModuleBase_Tools::createAction(QIcon(":pictures/iso_lines.png"), tr("Define Isos..."),
                                            aDesktop);
   addAction("ISOLINES_CMD", anAction);
@@ -157,6 +170,10 @@ void XGUI_ContextMenuMgr::createActions()
   anAction->setCheckable(true);
   addAction("SHOW_ISOLINES_CMD", anAction);
 
+  anAction = ModuleBase_Tools::createAction(QIcon(), tr("Bring To Front"), aDesktop);
+  anAction->setCheckable(true);
+  addAction("BRING_TO_FRONT_CMD", anAction);
+
   mySeparator1 = ModuleBase_Tools::createAction(QIcon(), "", aDesktop);
   mySeparator1->setSeparator(true);
 
@@ -166,6 +183,9 @@ void XGUI_ContextMenuMgr::createActions()
   mySeparator3 = ModuleBase_Tools::createAction(QIcon(), "", aDesktop);
   mySeparator3->setSeparator(true);
 
+  mySeparator4 = ModuleBase_Tools::createAction(QIcon(), "", aDesktop);
+  mySeparator4->setSeparator(true);
+
   anAction = ModuleBase_Tools::createAction(QIcon(":pictures/vertex.png"), tr("Vertices"), aDesktop,
                                            this, SLOT(onShapeSelection(bool)));
   anAction->setCheckable(true);
@@ -314,8 +334,9 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu()
     bool hasCompositeOwner = false;
     bool hasResultInHistory = false;
     bool hasFolder = false;
+    bool hasGroupsOnly = false;
     ModuleBase_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter,
-                                   hasCompositeOwner, hasResultInHistory, hasFolder);
+                                   hasCompositeOwner, hasResultInHistory, hasFolder, hasGroupsOnly);
     //Process Feature
     if (aSelected == 1) { // single selection
       ObjectPtr aObject = aObjects.first();
@@ -332,6 +353,12 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu()
             action("WIREFRAME_CMD")->setEnabled(true);
             action("SHADING_CMD")->setEnabled(true);
           }
+          action("SHOW_EDGES_DIRECTION_CMD")->setEnabled(true);
+          action("SHOW_EDGES_DIRECTION_CMD")->setChecked(ModelAPI_Tools::isShowEdgesDirection(aResult));
+
+          action("BRING_TO_FRONT_CMD")->setEnabled(hasGroupsOnly);
+          action("BRING_TO_FRONT_CMD")->setChecked(ModelAPI_Tools::isBringToFront(aResult));
+
           action("SHOW_ISOLINES_CMD")->setEnabled(true);
           action("SHOW_ISOLINES_CMD")->setChecked(ModelAPI_Tools::isShownIsoLines(aResult));
           action("ISOLINES_CMD")->setEnabled(true);
@@ -358,6 +385,18 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu()
           action("MOVE_SPLIT_CMD")->setEnabled(true);
         }
 #endif
+        if (hasFeature && aObject->document() != aMgr->moduleDocument() &&
+            aObject->document() == aMgr->activeDocument())
+        {
+          XGUI_OperationMgr* anOperationMgr = myWorkshop->operationMgr();
+          if (!anOperationMgr->hasOperation()) {
+            FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
+            std::list<std::shared_ptr<ModelAPI_Result> > aResults;
+            ModelAPI_Tools::getConcealedResults(aFeature, aResults);
+            if (!aResults.empty()) // check the feature conceals at least one result
+              action("RECOVER_CMD")->setEnabled(true);
+          }
+        }
 
         if( aMgr->activeDocument() == aObject->document() )
         {
@@ -376,6 +415,8 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu()
         action("SHOW_ONLY_CMD")->setEnabled(true);
         action("SHADING_CMD")->setEnabled(true);
         action("WIREFRAME_CMD")->setEnabled(true);
+        action("SHOW_EDGES_DIRECTION_CMD")->setEnabled(true);
+        action("BRING_TO_FRONT_CMD")->setEnabled(hasGroupsOnly);
         action("SHOW_ISOLINES_CMD")->setEnabled(true);
         action("ISOLINES_CMD")->setEnabled(true);
       }
@@ -570,6 +611,15 @@ void XGUI_ContextMenuMgr::updateViewerMenu()
           if (aResult.get()) {
             action("SHOW_ISOLINES_CMD")->setEnabled(true);
             action("SHOW_ISOLINES_CMD")->setChecked(ModelAPI_Tools::isShownIsoLines(aResult));
+
+            action("SHOW_EDGES_DIRECTION_CMD")->setEnabled(true);
+            action("SHOW_EDGES_DIRECTION_CMD")->setChecked(
+              ModelAPI_Tools::isShowEdgesDirection(aResult));
+
+            // Only enable the "Bring To Front" command for Groups
+            ResultGroupPtr aGroup = std::dynamic_pointer_cast<ModelAPI_ResultGroup>(aResult);
+            action("BRING_TO_FRONT_CMD")->setEnabled(aGroup.get() != NULL);
+            action("BRING_TO_FRONT_CMD")->setChecked(ModelAPI_Tools::isBringToFront(aResult));
           }
         }
       }
@@ -657,6 +707,7 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu()
 
   QActionsList aList;
 
+  //-------------------------------------
   // Result construction menu
   aList.append(action("SHOW_CMD"));
   aList.append(action("HIDE_CMD"));
@@ -672,10 +723,11 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu()
   myObjBrowserMenus[ModelAPI_ResultConstruction::group()] = aList;
 
   //-------------------------------------
-  // Result body menu
+  // Result body/field/part menu
   aList.clear();
   aList.append(action("WIREFRAME_CMD"));
   aList.append(action("SHADING_CMD"));
+  aList.append(action("SHOW_EDGES_DIRECTION_CMD"));
   aList.append(mySeparator1); // this separator is not shown as this action is added after show only
   // qt list container contains only one instance of the same action
   aList.append(action("SHOW_CMD"));
@@ -691,21 +743,26 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu()
   aList.append(action("SHOW_FEATURE_CMD"));
   aList.append(mySeparator3);
   aList.append(action("DELETE_CMD"));
+  // Result body menu
   myObjBrowserMenus[ModelAPI_ResultBody::group()] = aList;
-  // Group menu
+  // Field menu
   myObjBrowserMenus[ModelAPI_ResultField::group()] = aList;
   // Result part menu
   myObjBrowserMenus[ModelAPI_ResultPart::group()] = aList;
 
+  //-------------------------------------
+  // Group menu
   aList.clear();
   aList.append(action("WIREFRAME_CMD"));
   aList.append(action("SHADING_CMD"));
-  aList.append(mySeparator1); // this separator is not shown as this action is added after show only
-  // qt list container contains only one instance of the same action
+  aList.append(action("SHOW_EDGES_DIRECTION_CMD"));
+  aList.append(mySeparator1);
+  aList.append(action("BRING_TO_FRONT_CMD"));
+  aList.append(mySeparator2);
   aList.append(action("SHOW_CMD"));
   aList.append(action("HIDE_CMD"));
   aList.append(action("SHOW_ONLY_CMD"));
-  aList.append(mySeparator2);
+  aList.append(mySeparator3);
   aList.append(action("AUTOCOLOR_CMD"));
   aList.append(action("RENAME_CMD"));
   aList.append(action("COLOR_CMD"));
@@ -714,10 +771,10 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu()
   aList.append(action("SHOW_ISOLINES_CMD"));
   aList.append(action("ISOLINES_CMD"));
   aList.append(action("SHOW_FEATURE_CMD"));
-  aList.append(mySeparator3);
+  aList.append(mySeparator4);
   aList.append(action("DELETE_CMD"));
-  // Group menu
   myObjBrowserMenus[ModelAPI_ResultGroup::group()] = aList;
+
   //-------------------------------------
   // Feature menu
   aList.clear();
@@ -725,6 +782,7 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu()
   aList.append(action("SHOW_RESULTS_CMD"));
   aList.append(action("MOVE_CMD"));
   aList.append(action("MOVE_SPLIT_CMD"));
+  aList.append(action("RECOVER_CMD"));
   aList.append(mySeparator1);
   aList.append(action("INSERT_FOLDER_CMD"));
   aList.append(action("ADD_TO_FOLDER_BEFORE_CMD"));
@@ -737,14 +795,17 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu()
   aList.append(action("DELETE_CMD"));
   myObjBrowserMenus[ModelAPI_Feature::group()] = aList;
 
+  //-------------------------------------
+  // Parameter menu
   aList.clear();
   aList.append(action("RENAME_CMD"));
   aList.append(mySeparator1);
   aList.append(action("CLEAN_HISTORY_CMD"));
   aList.append(action("DELETE_CMD"));
   myObjBrowserMenus[ModelAPI_ResultParameter::group()] = aList;
-  //-------------------------------------
 
+  //-------------------------------------
+  // Folder menu
   aList.clear();
   aList.append(action("RENAME_CMD"));
   aList.append(action("DELETE_CMD"));
@@ -762,7 +823,7 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu()
 void XGUI_ContextMenuMgr::buildViewerMenu()
 {
   QActionsList aList;
-  // Result construction menu
+  // Result construction/part menu
   aList.append(action("COLOR_CMD"));
   aList.append(action("DEFLECTION_CMD"));
   aList.append(action("TRANSPARENCY_CMD"));
@@ -773,13 +834,14 @@ void XGUI_ContextMenuMgr::buildViewerMenu()
   aList.append(action("SHOW_ONLY_CMD"));
   aList.append(action("HIDE_CMD"));
   myViewerMenu[ModelAPI_ResultConstruction::group()] = aList;
-  // Result part menu
   myViewerMenu[ModelAPI_ResultPart::group()] = aList;
+
   //-------------------------------------
   // Result body menu
   aList.clear();
   aList.append(action("WIREFRAME_CMD"));
   aList.append(action("SHADING_CMD"));
+  aList.append(action("SHOW_EDGES_DIRECTION_CMD"));
   aList.append(mySeparator2);
   aList.append(action("COLOR_CMD"));
   aList.append(action("DEFLECTION_CMD"));
@@ -793,9 +855,30 @@ void XGUI_ContextMenuMgr::buildViewerMenu()
   aList.append(action("SHOW_ONLY_CMD"));
   aList.append(action("HIDE_CMD"));
   myViewerMenu[ModelAPI_ResultBody::group()] = aList;
+  myViewerMenu[ModelAPI_ResultField::group()] = aList;
+
+  //-------------------------------------
   // Group menu
+  aList.clear();
+  aList.append(action("WIREFRAME_CMD"));
+  aList.append(action("SHADING_CMD"));
+  aList.append(action("SHOW_EDGES_DIRECTION_CMD"));
+  aList.append(mySeparator1);
+  aList.append(action("BRING_TO_FRONT_CMD"));
+  aList.append(mySeparator2);
+  aList.append(action("COLOR_CMD"));
+  aList.append(action("DEFLECTION_CMD"));
+  aList.append(action("TRANSPARENCY_CMD"));
+  aList.append(action("SHOW_ISOLINES_CMD"));
+  aList.append(action("ISOLINES_CMD"));
+  aList.append(mySeparator3);
+  aList.append(action("SET_VIEW_NORMAL_CMD"));
+  aList.append(action("SET_VIEW_INVERTEDNORMAL_CMD"));
+  aList.append(mySeparator4);
+  aList.append(action("SHOW_ONLY_CMD"));
+  aList.append(action("HIDE_CMD"));
   myViewerMenu[ModelAPI_ResultGroup::group()] = aList;
-  myViewerMenu[ModelAPI_ResultField::group()] = aList;
+
   //-------------------------------------
   // Step objects menu
   aList.clear();
@@ -824,16 +907,19 @@ void XGUI_ContextMenuMgr::addObjBrowserMenu(QMenu* theMenu) const
   } else if (aSelected > 1) {
       anActions.append(action("WIREFRAME_CMD"));
       anActions.append(action("SHADING_CMD"));
+      anActions.append(action("SHOW_EDGES_DIRECTION_CMD"));
       anActions.append(mySeparator1);
+      anActions.append(action("BRING_TO_FRONT_CMD"));
+      anActions.append(mySeparator2);
       anActions.append(action("SHOW_CMD"));
       anActions.append(action("HIDE_CMD"));
       anActions.append(action("SHOW_ONLY_CMD"));
-      anActions.append(mySeparator2);
+      anActions.append(mySeparator3);
       anActions.append(action("ADD_TO_FOLDER_BEFORE_CMD"));
       anActions.append(action("ADD_TO_FOLDER_AFTER_CMD"));
       anActions.append(action("ADD_OUT_FOLDER_BEFORE_CMD"));
       anActions.append(action("ADD_OUT_FOLDER_AFTER_CMD"));
-      anActions.append(mySeparator3);
+      anActions.append(mySeparator4);
       anActions.append(action("MOVE_CMD"));
       anActions.append(action("MOVE_SPLIT_CMD"));
       anActions.append(action("COLOR_CMD"));