]> SALOME platform Git repositories - modules/shaper.git/blobdiff - src/XGUI/XGUI_ContextMenuMgr.cpp
Salome HOME
Draft of transparency
[modules/shaper.git] / src / XGUI / XGUI_ContextMenuMgr.cpp
index 101a18722d4b8f400efebdaa4d76b4f8678337f0..1a986b377ff86155065408fccb672b9f0b999a34 100644 (file)
@@ -1,4 +1,22 @@
-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
+// Copyright (C) 2014-2017  CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or
+// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+//
 
 #include "XGUI_ContextMenuMgr.h"
 #include "XGUI_Workshop.h"
@@ -28,6 +46,7 @@
 #include <ModelAPI_ResultConstruction.h>
 #include <ModelAPI_ResultBody.h>
 #include <ModelAPI_Tools.h>
+#include <ModelAPI_ResultField.h>
 
 #include <Config_DataModelReader.h>
 
@@ -44,7 +63,6 @@
 #include <QMainWindow>
 #include <QModelIndex>
 
-
 XGUI_ContextMenuMgr::XGUI_ContextMenuMgr(XGUI_Workshop* theParent)
     : QObject(theParent),
       myWorkshop(theParent),
@@ -64,74 +82,104 @@ void XGUI_ContextMenuMgr::createActions()
   QMainWindow* aDesktop = myWorkshop->mainWindow();
 #endif
 
-  QAction* aAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this);
+  QAction* aAction = ModuleBase_Tools::createAction(QIcon(":pictures/delete.png"), tr("Delete"),
+                                                    aDesktop);
   aDesktop->addAction(aAction);
 
   addAction("DELETE_CMD", aAction);
   aAction->setShortcutContext(Qt::ApplicationShortcut);
 
-  aAction = new QAction(QIcon(":pictures/rename_edit.png"), tr("Rename"), this);
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/rename_edit.png"), tr("Rename"),
+                                           aDesktop, this, SLOT(onRename()));
   addAction("RENAME_CMD", aAction);
-  connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onRename()));
 
-  aAction = new QAction(QIcon(":pictures/move.png"), XGUI_Workshop::MOVE_TO_END_COMMAND, this);
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/move.png"),
+                                           XGUI_Workshop::MOVE_TO_END_COMMAND, this);
   addAction("MOVE_CMD", aAction);
 
-  aAction = new QAction(QIcon(":pictures/clean_history.png"), tr("Clean history"), this);
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/clean_history.png"),
+                                           tr("Clean history"), aDesktop);
   addAction("CLEAN_HISTORY_CMD", aAction);
 
-  aAction = new QAction(QIcon(":pictures/color.png"), tr("Color..."), this);
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/color.png"), tr("Color..."), aDesktop);
   addAction("COLOR_CMD", aAction);
 
-  aAction = new QAction(QIcon(":pictures/eye_pencil.png"), tr("Show"), this);
+  aAction = ModuleBase_Tools::createAction(QIcon(""), tr("Deflection..."), aDesktop);
+  addAction("DEFLECTION_CMD", aAction);
+
+#ifdef USE_TRANSPARENCY
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/transparency.png"),
+                                           tr("Transparency..."), aDesktop);
+  addAction("TRANSPARENCY_CMD", aAction);
+#endif
+
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil.png"), tr("Show"), aDesktop);
   addAction("SHOW_CMD", aAction);
 
-  aAction = new QAction(QIcon(":pictures/eye_pencil.png"), tr("Show only"), this);
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil.png"), tr("Show only"),
+                                           aDesktop);
   addAction("SHOW_ONLY_CMD", aAction);
 
-  aAction = new QAction(QIcon(":pictures/eye_pencil_closed.png"), tr("Hide"), this);
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil_closed.png"), tr("Hide"),
+                                           aDesktop);
   addAction("HIDE_CMD", aAction);
 
-  aAction = new QAction(QIcon(":pictures/eye_pencil_closed.png"), tr("Hide all"), this);
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/eye_pencil_closed.png"), tr("Hide all"),
+                                           aDesktop);
   addAction("HIDEALL_CMD", aAction);
 
-  aAction = new QAction(QIcon(":pictures/shading.png"), tr("Shading"), this);
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/shading.png"), tr("Shading"), aDesktop);
   addAction("SHADING_CMD", aAction);
 
-  aAction = new QAction(QIcon(":pictures/wireframe.png"), tr("Wireframe"), this);
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/wireframe.png"), tr("Wireframe"),
+                                           aDesktop);
   addAction("WIREFRAME_CMD", aAction);
 
-  mySeparator = new QAction(this);
+  mySeparator = ModuleBase_Tools::createAction(QIcon(), "", aDesktop);
   mySeparator->setSeparator(true);
 
-  mySelectActions = new QActionGroup(this);
-  mySelectActions->setExclusive(true);
+  //mySelectActions = new QActionGroup(this);
+  //mySelectActions->setExclusive(true);
 
-  aAction = new QAction(QIcon(":pictures/vertex.png"), tr("Vertices"), this);
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/vertex.png"), tr("Vertices"), aDesktop,
+                                           this, SLOT(onShapeSelection(bool)));
   aAction->setCheckable(true);
   addAction("SELECT_VERTEX_CMD", aAction);
-  mySelectActions->addAction(aAction);
+  //mySelectActions->addAction(aAction);
 
-  aAction = new QAction(QIcon(":pictures/edge.png"), tr("Edges"), this);
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/edge.png"), tr("Edges"), aDesktop,
+                                           this, SLOT(onShapeSelection(bool)));
   aAction->setCheckable(true);
   addAction("SELECT_EDGE_CMD", aAction);
-  mySelectActions->addAction(aAction);
+  //mySelectActions->addAction(aAction);
 
-  aAction = new QAction(QIcon(":pictures/face.png"), tr("Faces"), this);
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/face.png"), tr("Faces"), aDesktop,
+                                           this, SLOT(onShapeSelection(bool)));
   aAction->setCheckable(true);
   addAction("SELECT_FACE_CMD", aAction);
-  mySelectActions->addAction(aAction);
+  //mySelectActions->addAction(aAction);
 
-  aAction = new QAction(QIcon(":pictures/result.png"), tr("Result"), this);
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/result.png"), tr("Results"), aDesktop,
+                                           this, SLOT(onResultSelection(bool)));
   aAction->setCheckable(true);
   addAction("SELECT_RESULT_CMD", aAction);
-  mySelectActions->addAction(aAction);
+  //mySelectActions->addAction(aAction);
 
   aAction->setChecked(true);
 
-  aAction = new QAction(QIcon(":pictures/find_result.png"), tr("Select results"), this);
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/find_result.png"),
+                                           tr("Select results"), aDesktop);
   addAction("SHOW_RESULTS_CMD", aAction);
 
+  aAction = ModuleBase_Tools::createAction(QIcon(":pictures/find_result.png"),
+                                           tr("Select parent feature"), aDesktop);
+  addAction("SHOW_FEATURE_CMD", aAction);
+
+#ifdef TINSPECTOR
+  aAction = ModuleBase_Tools::createAction(QIcon(), tr("TInspector"), aDesktop);
+  addAction("TINSPECTOR_VIEW", aAction);
+#endif
+
   buildObjBrowserMenu();
   buildViewerMenu();
 }
@@ -199,7 +247,7 @@ void XGUI_ContextMenuMgr::onContextMenuRequest(QContextMenuEvent* theEvent)
   }
 }
 
-void XGUI_ContextMenuMgr::updateObjectBrowserMenu() 
+void XGUI_ContextMenuMgr::updateObjectBrowserMenu()
 {
   foreach(QAction* aAction, myActions)
     aAction->setEnabled(false);
@@ -214,8 +262,9 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu()
     bool hasFeature = false;
     bool hasParameter = false;
     bool hasCompositeOwner = false;
+    bool hasResultInHistory = false;
     ModuleBase_Tools::checkObjects(aObjects, hasResult, hasFeature, hasParameter,
-                                   hasCompositeOwner);
+                                   hasCompositeOwner, hasResultInHistory);
     //Process Feature
     if (aSelected == 1) {
       ObjectPtr aObject = aObjects.first();
@@ -282,6 +331,7 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu()
       action("CLEAN_HISTORY_CMD")->setEnabled(true);
 
     action("SHOW_RESULTS_CMD")->setEnabled(hasFeature);
+    action("SHOW_FEATURE_CMD")->setEnabled(hasResult && hasResultInHistory);
   }
 
   // Show/Hide command has to be disabled for objects from non active document
@@ -302,8 +352,17 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu()
     action("SHOW_ONLY_CMD")->setEnabled(false);
   }
 
-  if (myWorkshop->canChangeColor())
-    action("COLOR_CMD")->setEnabled(true);
+  action("COLOR_CMD")->setEnabled(myWorkshop->canChangeProperty("COLOR_CMD"));
+  action("DEFLECTION_CMD")->setEnabled(myWorkshop->canChangeProperty("DEFLECTION_CMD"));
+#ifdef USE_TRANSPARENCY
+  action("TRANSPARENCY_CMD")->setEnabled(myWorkshop->canChangeProperty("TRANSPARENCY_CMD"));
+#endif
+  #ifdef _DEBUG
+    #ifdef TINSPECTOR
+      action("TINSPECTOR_VIEW")->setEnabled(true);
+    #endif
+  #endif
+
 
   ModuleBase_IModule* aModule = myWorkshop->module();
   if (aModule)
@@ -317,7 +376,8 @@ void XGUI_ContextMenuMgr::updateViewerMenu()
 
   XGUI_SelectionMgr* aSelMgr = myWorkshop->selector();
   XGUI_Displayer* aDisplayer = myWorkshop->displayer();
-  QList<ModuleBase_ViewerPrsPtr> aPrsList = aSelMgr->selection()->getSelected(ModuleBase_ISelection::Viewer);
+  QList<ModuleBase_ViewerPrsPtr> aPrsList =
+    aSelMgr->selection()->getSelected(ModuleBase_ISelection::Viewer);
   if (aPrsList.size() > 0) {
     bool isVisible = false;
     bool isShading = false;
@@ -329,7 +389,8 @@ void XGUI_ContextMenuMgr::updateViewerMenu()
       if (aRes && aRes->isDisplayed()) {
         isVisible = true;
         canBeShaded = myWorkshop->displayer()->canBeShaded(aObject);
-        isShading = (myWorkshop->displayer()->displayMode(aObject) == XGUI_Displayer::Shading);      
+        isShading =
+          (myWorkshop->displayer()->displayMode(aObject) == XGUI_Displayer::Shading);
         break;
       }
     }
@@ -349,22 +410,35 @@ void XGUI_ContextMenuMgr::updateViewerMenu()
     } else
       action("SHOW_CMD")->setEnabled(true);
   }
+  //issue #2159 Hide all incomplete behavior
+#ifdef HAVE_SALOME
+    action("HIDEALL_CMD")->setEnabled(true);
+#else
   if (myWorkshop->displayer()->objectsCount() > 0)
     action("HIDEALL_CMD")->setEnabled(true);
+#endif
 
   // Update selection menu
   QIntList aModes = aDisplayer->activeSelectionModes();
-  if (aModes.count() <= 1) {
-    action("SELECT_VERTEX_CMD")->setEnabled(true);
-    action("SELECT_EDGE_CMD")->setEnabled(true);
-    action("SELECT_FACE_CMD")->setEnabled(true);
-    action("SELECT_RESULT_CMD")->setEnabled(true);
-    if (aModes.count() == 1) {
-      switch (aModes.first()) {
-      case TopAbs_VERTEX: 
+  action("SELECT_VERTEX_CMD")->setEnabled(true);
+  action("SELECT_EDGE_CMD")->setEnabled(true);
+  action("SELECT_FACE_CMD")->setEnabled(true);
+  action("SELECT_RESULT_CMD")->setEnabled(true);
+
+  action("SELECT_RESULT_CMD")->setChecked(false);
+  action("SELECT_VERTEX_CMD")->setChecked(false);
+  action("SELECT_EDGE_CMD")->setChecked(false);
+  action("SELECT_FACE_CMD")->setChecked(false);
+  action("SELECT_RESULT_CMD")->setChecked(false);
+  if (aModes.count() == 0) {
+    action("SELECT_RESULT_CMD")->setChecked(true);
+  } else {
+    foreach(int aMode, aModes) {
+      switch (aMode) {
+      case TopAbs_VERTEX:
         action("SELECT_VERTEX_CMD")->setChecked(true);
         break;
-      case TopAbs_EDGE: 
+      case TopAbs_EDGE:
         action("SELECT_EDGE_CMD")->setChecked(true);
         break;
       case TopAbs_FACE:
@@ -373,17 +447,24 @@ void XGUI_ContextMenuMgr::updateViewerMenu()
       default:
         action("SELECT_RESULT_CMD")->setChecked(true);
       }
-    } else 
-      action("SELECT_RESULT_CMD")->setChecked(true);
+    }
   }
 
   ModuleBase_IModule* aModule = myWorkshop->module();
   if (aModule)
     aModule->updateViewerMenu(myActions);
 
-  if (myWorkshop->canChangeColor())
+  if (myWorkshop->canChangeProperty("COLOR_CMD"))
     action("COLOR_CMD")->setEnabled(true);
 
+  if (myWorkshop->canChangeProperty("DEFLECTION_CMD"))
+    action("DEFLECTION_CMD")->setEnabled(true);
+
+#ifdef USE_TRANSPARENCY
+  if (myWorkshop->canChangeProperty("TRANSPARENCY_CMD"))
+    action("TRANSPARENCY_CMD")->setEnabled(true);
+#endif
+
   action("DELETE_CMD")->setEnabled(true);
 }
 
@@ -402,7 +483,7 @@ void XGUI_ContextMenuMgr::connectViewer()
 
 void XGUI_ContextMenuMgr::buildObjBrowserMenu()
 {
-  QAction* aSeparator = new QAction(this);
+  QAction* aSeparator = ModuleBase_Tools::createAction(QIcon(), "", myWorkshop->desktop());
   aSeparator->setSeparator(true);
 
   QActionsList aList;
@@ -414,6 +495,11 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu()
   aList.append(mySeparator);
   aList.append(action("RENAME_CMD"));
   aList.append(action("COLOR_CMD"));
+  aList.append(action("DEFLECTION_CMD"));
+#ifdef USE_TRANSPARENCY
+  aList.append(action("TRANSPARENCY_CMD"));
+#endif
+  aList.append(action("SHOW_FEATURE_CMD"));
   myObjBrowserMenus[ModelAPI_ResultConstruction::group()] = aList;
 
   //-------------------------------------
@@ -429,17 +515,22 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu()
   aList.append(mySeparator);
   aList.append(action("RENAME_CMD"));
   aList.append(action("COLOR_CMD"));
+  aList.append(action("DEFLECTION_CMD"));
+#ifdef USE_TRANSPARENCY
+  aList.append(action("TRANSPARENCY_CMD"));
+#endif
+  aList.append(action("SHOW_FEATURE_CMD"));
   myObjBrowserMenus[ModelAPI_ResultBody::group()] = aList;
   // Group menu
   myObjBrowserMenus[ModelAPI_ResultGroup::group()] = aList;
+  myObjBrowserMenus[ModelAPI_ResultField::group()] = aList;
   // Result part menu
   myObjBrowserMenus[ModelAPI_ResultPart::group()] = aList;
   //-------------------------------------
   // Feature menu
   aList.clear();
-  aList.append(action("SHOW_RESULTS_CMD"));
-  aList.append(mySeparator);
   aList.append(action("RENAME_CMD"));
+  aList.append(action("SHOW_RESULTS_CMD"));
   aList.append(action("MOVE_CMD"));
   aList.append(mySeparator);
   aList.append(action("CLEAN_HISTORY_CMD"));
@@ -463,6 +554,10 @@ void XGUI_ContextMenuMgr::buildViewerMenu()
   aList.append(action("SHOW_ONLY_CMD"));
   aList.append(mySeparator);
   aList.append(action("COLOR_CMD"));
+  aList.append(action("DEFLECTION_CMD"));
+#ifdef USE_TRANSPARENCY
+  aList.append(action("TRANSPARENCY_CMD"));
+#endif
   myViewerMenu[ModelAPI_ResultConstruction::group()] = aList;
   // Result part menu
   myViewerMenu[ModelAPI_ResultPart::group()] = aList;
@@ -476,9 +571,14 @@ void XGUI_ContextMenuMgr::buildViewerMenu()
   aList.append(action("SHOW_ONLY_CMD"));
   aList.append(mySeparator);
   aList.append(action("COLOR_CMD"));
+  aList.append(action("DEFLECTION_CMD"));
+#ifdef USE_TRANSPARENCY
+  aList.append(action("TRANSPARENCY_CMD"));
+#endif
   myViewerMenu[ModelAPI_ResultBody::group()] = aList;
   // Group menu
   myViewerMenu[ModelAPI_ResultGroup::group()] = aList;
+  myViewerMenu[ModelAPI_ResultField::group()] = aList;
   //-------------------------------------
 }
 
@@ -510,9 +610,20 @@ void XGUI_ContextMenuMgr::addObjBrowserMenu(QMenu* theMenu) const
       aActions.append(mySeparator);
       //aActions.append(action("MOVE_CMD"));
       aActions.append(action("COLOR_CMD"));
+      aActions.append(action("DEFLECTION_CMD"));
+#ifdef USE_TRANSPARENCY
+      aActions.append(action("TRANSPARENCY_CMD"));
+#endif
       aActions.append(action("CLEAN_HISTORY_CMD"));
       aActions.append(action("DELETE_CMD"));
   }
+#ifdef _DEBUG
+  if (aSelected == 0) {
+    #ifdef TINSPECTOR
+    aActions.append(action("TINSPECTOR_VIEW"));
+    #endif
+  }
+#endif
   theMenu->addActions(aActions);
   addFeatures(theMenu);
 
@@ -524,7 +635,8 @@ void XGUI_ContextMenuMgr::addObjBrowserMenu(QMenu* theMenu) const
 void XGUI_ContextMenuMgr::addViewerMenu(QMenu* theMenu) const
 {
   XGUI_SelectionMgr* aSelMgr = myWorkshop->selector();
-  QList<ModuleBase_ViewerPrsPtr> aPrsList = aSelMgr->selection()->getSelected(ModuleBase_ISelection::Viewer);
+  QList<ModuleBase_ViewerPrsPtr> aPrsList =
+    aSelMgr->selection()->getSelected(ModuleBase_ISelection::Viewer);
   int aSelected = aPrsList.size();
   QActionsList aActions;
 
@@ -537,6 +649,8 @@ void XGUI_ContextMenuMgr::addViewerMenu(QMenu* theMenu) const
     aSelMenu->addAction(action("SELECT_VERTEX_CMD"));
     aSelMenu->addAction(action("SELECT_EDGE_CMD"));
     aSelMenu->addAction(action("SELECT_FACE_CMD"));
+    //IMP: an attempt to use result selection with other selection modes
+    //aSelMenu->addSeparator();
     aSelMenu->addAction(action("SELECT_RESULT_CMD"));
     theMenu->addMenu(aSelMenu);
     theMenu->addSeparator();
@@ -554,7 +668,10 @@ void XGUI_ContextMenuMgr::addViewerMenu(QMenu* theMenu) const
   // hide all is shown always even if selection in the viewer is empty
   aActions.append(action("HIDEALL_CMD"));
   aActions.append(action("COLOR_CMD"));
-
+  aActions.append(action("DEFLECTION_CMD"));
+#ifdef USE_TRANSPARENCY
+  aActions.append(action("TRANSPARENCY_CMD"));
+#endif
   theMenu->addActions(aActions);
 
   QMap<int, QAction*> aMenuActions;
@@ -612,7 +729,7 @@ void XGUI_ContextMenuMgr::onRename()
 {
   QObjectPtrList anObjects = myWorkshop->selector()->selection()->selectedObjects();
   if (!myWorkshop->abortAllOperations())
-    return; 
+    return;
   // restore selection in case if dialog box was shown
   myWorkshop->objectBrowser()->setObjectsSelected(anObjects);
   myWorkshop->objectBrowser()->onEditItem();
@@ -633,25 +750,25 @@ void XGUI_ContextMenuMgr::addFeatures(QMenu* theMenu) const
   bool aIsRoot = false;
   foreach(QModelIndex aIdx, aSelectedIndexes) {
     // Process only first column
-    if (aIdx.column() == 0) {
+    if (aIdx.column() == 1) {
       aIsRoot = !aIdx.parent().isValid();
       // Exit if the selected index belongs to non active document
       if (aIsRoot && (aActiveDoc != aMgr->moduleDocument()))
         return;
       if ((!aIsRoot) && (aIdx.internalPointer() != aActiveDoc.get()))
         return;
-      
+
       // Get name of the selected index
       aName = aIdx.data().toString();
       aLen = aName.indexOf('(');
       if (aLen != -1) {
         aName = aName.left(--aLen);
       }
-      std::string aFeaturesStr = aIsRoot? 
+      std::string aFeaturesStr = aIsRoot?
         aDataModelXML->rootFolderFeatures(aName.toStdString()) :
         aDataModelXML->subFolderFeatures(aName.toStdString());
         if (aFeaturesStr.length() > 0) {
-          QStringList aFeturesList = 
+          QStringList aFeturesList =
             QString(aFeaturesStr.c_str()).split(",", QString::SkipEmptyParts);
           foreach(QString aFea, aFeturesList) {
             QAction* aAction = aActionMgr->action(aFea);
@@ -662,3 +779,23 @@ void XGUI_ContextMenuMgr::addFeatures(QMenu* theMenu) const
     }
   }
 }
+
+#define UNCHECK_ACTION(NAME) \
+{ QAction* aAction = action(NAME); \
+bool isBlock = aAction->signalsBlocked(); \
+aAction->blockSignals(true); \
+aAction->setChecked(false); \
+  aAction->blockSignals(isBlock); }
+
+
+void XGUI_ContextMenuMgr::onResultSelection(bool theChecked)
+{
+  UNCHECK_ACTION("SELECT_VERTEX_CMD");
+  UNCHECK_ACTION("SELECT_EDGE_CMD");
+  UNCHECK_ACTION("SELECT_FACE_CMD");
+}
+
+void XGUI_ContextMenuMgr::onShapeSelection(bool theChecked)
+{
+  UNCHECK_ACTION("SHOW_RESULTS_CMD");
+}