Salome HOME
3.9 Clean the history
[modules/shaper.git] / src / XGUI / XGUI_ContextMenuMgr.cpp
index c65481a0879e1cc85c89837a6d71c4cba9873445..648abd6cc7ebe1435ce65bf49e46ae7effc68bab 100644 (file)
@@ -9,8 +9,12 @@
 #include "XGUI_Selection.h"
 #include "XGUI_SalomeConnector.h"
 #include "XGUI_DataModel.h"
+#include "XGUI_OperationMgr.h"
+#include "XGUI_Tools.h"
 
+#ifndef HAVE_SALOME
 #include <AppElements_MainWindow.h>
+#endif
 
 //#include "PartSetPlugin_Part.h"
 
 
 #include <ModuleBase_IModule.h>
 #include <ModuleBase_Tools.h>
+#include <ModuleBase_OperationAction.h>
 
 #include <QAction>
 #include <QContextMenuEvent>
 #include <QMenu>
 #include <QMdiArea>
+#include <QMainWindow>
 
 
 XGUI_ContextMenuMgr::XGUI_ContextMenuMgr(XGUI_Workshop* theParent)
@@ -46,23 +52,28 @@ XGUI_ContextMenuMgr::~XGUI_ContextMenuMgr()
 
 void XGUI_ContextMenuMgr::createActions()
 {
-  QAction* aAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this);
+#ifdef HAVE_SALOME
+  QMainWindow* aDesktop = myWorkshop->salomeConnector()->desktop();
+#else
   QMainWindow* aDesktop = myWorkshop->mainWindow();
-  if (!aDesktop)
-    aDesktop = myWorkshop->salomeConnector()->desktop();
+#endif
+
+  QAction* aAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this);
   aDesktop->addAction(aAction);
 
   addAction("DELETE_CMD", aAction);
-  aAction->setShortcut(Qt::Key_Delete);
   aAction->setShortcutContext(Qt::ApplicationShortcut);
 
   aAction = new QAction(QIcon(":pictures/rename_edit.png"), tr("Rename"), this);
   addAction("RENAME_CMD", aAction);
   connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onRename()));
 
-  aAction = new QAction(QIcon(":pictures/move.png"), tr("Move to the end"), this);
+  aAction = new QAction(QIcon(":pictures/move.png"), XGUI_Workshop::MOVE_TO_END_COMMAND, this);
   addAction("MOVE_CMD", aAction);
 
+  aAction = new QAction(QIcon(":pictures/delete.png"), tr("Clean history"), this);
+  addAction("CLEAN_HISTORY_CMD", aAction);
+
   aAction = new QAction(QIcon(":pictures/color.png"), tr("Color..."), this);
   addAction("COLOR_CMD", aAction);
 
@@ -177,8 +188,14 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu()
       ObjectPtr aObject = aObjects.first();
       if (aObject) {
         if (hasResult && myWorkshop->canBeShaded(aObject)) {
-          action("WIREFRAME_CMD")->setEnabled(true);
-          action("SHADING_CMD")->setEnabled(true);
+          XGUI_Displayer::DisplayMode aMode = aDisplayer->displayMode(aObject);
+          if (aMode != XGUI_Displayer::NoMode) {
+            action("WIREFRAME_CMD")->setEnabled(aMode == XGUI_Displayer::Shading);
+            action("SHADING_CMD")->setEnabled(aMode == XGUI_Displayer::Wireframe);
+          } else {
+            action("WIREFRAME_CMD")->setEnabled(true);
+            action("SHADING_CMD")->setEnabled(true);
+          }
         }
         if (!hasFeature) {
           bool aHasSubResults = ModelAPI_Tools::hasSubResults(
@@ -200,10 +217,13 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu()
         else if (hasFeature && myWorkshop->canMoveFeature())
           action("MOVE_CMD")->setEnabled(true);
 
+        else if (hasFeature)
+          action("CLEAN_HISTORY_CMD")->setEnabled(true);
+
         if( aMgr->activeDocument() == aObject->document() )
         {
           action("RENAME_CMD")->setEnabled(true);
-          action("DELETE_CMD")->setEnabled(true);
+          action("DELETE_CMD")->setEnabled(!hasSubFeature);
         }
       }
     } else {
@@ -226,6 +246,8 @@ void XGUI_ContextMenuMgr::updateObjectBrowserMenu()
       if (hasFeature || hasParameter)
         action("DELETE_CMD")->setEnabled(true);
     }
+    if (allActive && hasFeature)
+      action("CLEAN_HISTORY_CMD")->setEnabled(true);
   }
 
   // Show/Hide command has to be disabled for objects from non active document
@@ -278,8 +300,15 @@ void XGUI_ContextMenuMgr::updateViewerMenu()
     }
     if (isVisible) {
       if (canBeShaded) {
-        action("WIREFRAME_CMD")->setEnabled(true);
-        action("SHADING_CMD")->setEnabled(true);
+        XGUI_Displayer* aDisplayer = myWorkshop->displayer();
+        XGUI_Displayer::DisplayMode aMode = aDisplayer->displayMode(aObject);
+        if (aMode != XGUI_Displayer::NoMode) {
+          action("WIREFRAME_CMD")->setEnabled(aMode == XGUI_Displayer::Shading);
+          action("SHADING_CMD")->setEnabled(aMode == XGUI_Displayer::Wireframe);
+        } else {
+          action("WIREFRAME_CMD")->setEnabled(true);
+          action("SHADING_CMD")->setEnabled(true);
+        }
       }
       action("SHOW_ONLY_CMD")->setEnabled(true);
       action("HIDE_CMD")->setEnabled(true);
@@ -348,6 +377,7 @@ void XGUI_ContextMenuMgr::buildObjBrowserMenu()
   aList.clear();
   aList.append(action("DELETE_CMD"));
   aList.append(action("MOVE_CMD"));
+  aList.append(action("CLEAN_HISTORY_CMD"));
   aList.append(mySeparator);
   aList.append(action("RENAME_CMD"));
   myObjBrowserMenus[ModelAPI_Feature::group()] = aList;
@@ -366,7 +396,6 @@ void XGUI_ContextMenuMgr::buildViewerMenu()
   // Result construction menu
   aList.append(action("HIDE_CMD"));
   aList.append(action("SHOW_ONLY_CMD"));
-  aList.append(action("HIDEALL_CMD"));
   aList.append(action("COLOR_CMD"));
   myViewerMenu[ModelAPI_ResultConstruction::group()] = aList;
   // Result part menu
@@ -380,7 +409,6 @@ void XGUI_ContextMenuMgr::buildViewerMenu()
   aList.append(mySeparator);
   aList.append(action("HIDE_CMD"));
   aList.append(action("SHOW_ONLY_CMD"));
-  aList.append(action("HIDEALL_CMD"));
   myViewerMenu[ModelAPI_ResultBody::group()] = aList;
   // Group menu
   myViewerMenu[ModelAPI_ResultGroup::group()] = aList;
@@ -410,6 +438,7 @@ void XGUI_ContextMenuMgr::addObjBrowserMenu(QMenu* theMenu) const
       aActions.append(mySeparator);
       aActions.append(action("DELETE_CMD"));
       //aActions.append(action("MOVE_CMD"));
+      aActions.append(action("CLEAN_HISTORY_CMD"));
       aActions.append(action("COLOR_CMD"));
   }
   theMenu->addActions(aActions);
@@ -436,24 +465,28 @@ void XGUI_ContextMenuMgr::addViewerMenu(QMenu* theMenu) const
   QActionsList aActions;
   if (aSelected == 1) {
     ObjectPtr aObject = aPrsList.first().object();
-    std::string aName = aObject->groupName();
-    if (myViewerMenu.contains(aName))
-      aActions = myViewerMenu[aName];
+    if (aObject.get() != NULL) {
+      std::string aName = aObject->groupName();
+      if (myViewerMenu.contains(aName))
+        aActions = myViewerMenu[aName];
+    }
     aActions.append(action("COLOR_CMD"));
   } else if (aSelected > 1) {
     aActions.append(action("HIDE_CMD"));
     aActions.append(action("COLOR_CMD"));
   }
+  // hide all is shown always even if selection in the viewer is empty
+  aActions.append(action("HIDEALL_CMD"));
   theMenu->addActions(aActions);
 
-  if (!myWorkshop->isSalomeMode()) {
-    theMenu->addSeparator();
-    QMdiArea* aMDI = myWorkshop->mainWindow()->mdiArea();
-    if (aMDI->actions().size() > 0) {
-      QMenu* aSubMenu = theMenu->addMenu(tr("Windows"));
-      aSubMenu->addActions(aMDI->actions());
-    }
+#ifndef HAVE_SALOME
+  theMenu->addSeparator();
+  QMdiArea* aMDI = myWorkshop->mainWindow()->mdiArea();
+  if (aMDI->actions().size() > 0) {
+    QMenu* aSubMenu = theMenu->addMenu(tr("Windows"));
+    aSubMenu->addActions(aMDI->actions());
   }
+#endif
 }
 
 QStringList XGUI_ContextMenuMgr::actionObjectGroups(const QString& theName)
@@ -479,5 +512,10 @@ QStringList XGUI_ContextMenuMgr::actionObjectGroups(const QString& theName)
 
 void XGUI_ContextMenuMgr::onRename()
 {
+  QObjectPtrList anObjects = myWorkshop->selector()->selection()->selectedObjects();
+  if (!myWorkshop->abortAllOperations())
+    return; 
+  // restore selection in case if dialog box was shown
+  myWorkshop->objectBrowser()->setObjectsSelected(anObjects);
   myWorkshop->objectBrowser()->onEditItem();
 }