Salome HOME
Task "Make the size of the selection area even bigger, especially for points"
[modules/shaper.git] / src / PartSet / PartSet_MenuMgr.cpp
index d2a2f4efec3e7a80509ad230b6df387ae52fbaca..7b60d802cd274cf7027b32a926c5908a1c17f39b 100644 (file)
@@ -24,6 +24,8 @@
 #include <ModuleBase_Operation.h>
 #include <ModuleBase_OperationAction.h>
 #include <ModuleBase_OperationFeature.h>
+#include <ModuleBase_ViewerPrs.h>
+#include <ModuleBase_Tools.h>
 
 #include <XGUI_ModuleConnector.h>
 #include <XGUI_Workshop.h>
@@ -37,6 +39,7 @@
 #include <ModelAPI_ResultPart.h>
 #include <ModelAPI_ResultParameter.h>
 
+#include <QMainWindow>
 #include <QAction>
 #include <QMenu>
 #include <QEvent>
@@ -71,27 +74,23 @@ void PartSet_MenuMgr::createActions()
 {
   QAction* aAction;
 
-  aAction = new QAction(tr("Auxiliary"), this);
+  QWidget* aParent = myModule->workshop()->desktop();
+  aAction = ModuleBase_Tools::createAction(QIcon(), tr("Auxiliary"), aParent);
   aAction->setCheckable(true);
   addAction("AUXILIARY_CMD", aAction);
 
-  aAction = new QAction(QIcon(":icons/activate.png"), tr("Activate"), this);
-  connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onActivatePart(bool)));
+  aAction = ModuleBase_Tools::createAction(QIcon(":icons/activate.png"), tr("Activate"), aParent,
+                                           this, SLOT(onActivatePart(bool)));
   myActions["ACTIVATE_PART_CMD"] = aAction;
 
   // Activate PartSet
-  aAction = new QAction(QIcon(":icons/activate.png"), tr("Activate"), this);
-  connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onActivatePartSet(bool)));
+  aAction = ModuleBase_Tools::createAction(QIcon(":icons/activate.png"), tr("Activate"), aParent,
+                        this, SLOT(onActivatePartSet(bool)));
   myActions["ACTIVATE_PARTSET_CMD"] = aAction;
 
-  aAction = new QAction(QIcon(":icons/edit.png"), tr("Edit..."), this);
-  connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onEdit(bool)));
+  aAction = ModuleBase_Tools::createAction(QIcon(":icons/edit.png"), tr("Edit..."), aParent,
+                         this, SLOT(onEdit(bool)));
   myActions["EDIT_CMD"] = aAction;
-
-  aAction = new QAction(QIcon(), tr("Select parent feature"), this);
-  aAction->setCheckable(false);
-  connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onSelectParentFeature()));
-  myActions["SELECT_PARENT_CMD"] = aAction;
 }
 
 
@@ -105,8 +104,12 @@ void PartSet_MenuMgr::onAction(bool isChecked)
   }
 }
 
-bool PartSet_MenuMgr::addViewerMenu(QMenu* theMenu, const QMap<QString, QAction*>& theStdActions) const
+bool PartSet_MenuMgr::addViewerMenu(const QMap<QString, QAction*>& theStdActions,
+                                    QWidget* theParent,
+                                    QMap<int, QAction*>& theMenuActions) const
 {
+  int anIndex = 0;
+
   ModuleBase_Operation* anOperation = myModule->workshop()->currentOperation();
   if (!PartSet_SketcherMgr::isSketchOperation(anOperation) &&
       !PartSet_SketcherMgr::isNestedSketchOperation(anOperation))
@@ -119,48 +122,52 @@ bool PartSet_MenuMgr::addViewerMenu(QMenu* theMenu, const QMap<QString, QAction*
   bool hasAttribute = false;
   bool hasFeature = false;
 
-  QList<ModuleBase_ViewerPrs> aPrsList = aSelection->getSelected(ModuleBase_ISelection::Viewer);
-  TopoDS_Shape aShape;
-  ResultPtr aResult;
-  FeaturePtr aFeature;
-  foreach(ModuleBase_ViewerPrs aPrs, aPrsList) {
-    aResult = std::dynamic_pointer_cast<ModelAPI_Result>(aPrs.object());
-    if (aResult.get() != NULL) {
-      aShape = aPrs.shape();
-      if (aShape.IsEqual(aResult->shape()->impl<TopoDS_Shape>()))
-        hasFeature = true;
-      else
-        hasAttribute = true;
-    } else {
-      aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aPrs.object());
-      hasFeature = (aFeature.get() != NULL);
+  QList<ModuleBase_ViewerPrsPtr> aPrsList = aSelection->getSelected(ModuleBase_ISelection::Viewer);
+  if (aPrsList.size() > 1) {
+    hasFeature = true;
+  } else if (aPrsList.size() == 1) {
+    ResultPtr aResult;
+    FeaturePtr aFeature;
+    foreach(ModuleBase_ViewerPrsPtr aPrs, aPrsList) {
+      aResult = std::dynamic_pointer_cast<ModelAPI_Result>(aPrs->object());
+      if (aResult.get() != NULL) {
+        const GeomShapePtr& aShape = aPrs->shape();
+        if (aShape.get() && aShape->isEqual(aResult->shape()))
+          hasFeature = true;
+        else
+          hasAttribute = true;
+      } else {
+        aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aPrs->object());
+        hasFeature = (aFeature.get() != NULL);
+      }
     }
-  }
 
-  if (aPrsList.size() == 1) {
-    TopoDS_Shape aShape = aPrsList.first().shape();
-    if ((!aShape.IsNull()) && aShape.ShapeType() == TopAbs_VERTEX) {
+    const GeomShapePtr& aShape = aPrsList.first()->shape();
+    if (aShape.get() && !aShape->isNull() && aShape->shapeType() == GeomAPI_Shape::VERTEX) {
       // Find 2d coordinates
       FeaturePtr aSketchFea = myModule->sketchMgr()->activeSketch();
       if (aSketchFea->getKind() == SketchPlugin_Sketch::ID()) {
-        gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aShape));
+        const TopoDS_Shape& aTDShape = aShape->impl<TopoDS_Shape>();
+        gp_Pnt aPnt = BRep_Tool::Pnt(TopoDS::Vertex(aTDShape));
         std::shared_ptr<GeomAPI_Pnt> aPnt3d(new GeomAPI_Pnt(aPnt.X(), aPnt.Y(), aPnt.Z()));
         std::shared_ptr<GeomAPI_Pnt2d> aSelPnt = PartSet_Tools::convertTo2D(aSketchFea, aPnt3d);
 
         // Find coincident in these coordinates
-        ObjectPtr aObj = aPrsList.first().object();
+        ObjectPtr aObj = aPrsList.first()->object();
         FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
         FeaturePtr aCoincident = PartSet_Tools::findFirstCoincidence(aFeature, aSelPnt);
         // If we have coincidence then add Detach menu
         if (aCoincident.get() != NULL) {
+          QList<FeaturePtr> aCoins;
           mySelectedFeature = aCoincident;
-          PartSet_Tools::findCoincidences(mySelectedFeature, myCoinsideLines,
+          PartSet_Tools::findCoincidences(mySelectedFeature, myCoinsideLines, aCoins,
                                           SketchPlugin_ConstraintCoincidence::ENTITY_A());
-          PartSet_Tools::findCoincidences(mySelectedFeature, myCoinsideLines,
+          PartSet_Tools::findCoincidences(mySelectedFeature, myCoinsideLines, aCoins,
                                           SketchPlugin_ConstraintCoincidence::ENTITY_B());
           if (myCoinsideLines.size() > 0) {
             aIsDetach = true;
-            QMenu* aSubMenu = theMenu->addMenu(tr("Detach"));
+            QMenu* aSubMenu = new QMenu(tr("Detach"), theParent);
+            theMenuActions[anIndex++] = aSubMenu->menuAction();
             QAction* aAction;
             int i = 0;
             foreach (FeaturePtr aCoins, myCoinsideLines) {
@@ -176,17 +183,20 @@ bool PartSet_MenuMgr::addViewerMenu(QMenu* theMenu, const QMap<QString, QAction*
       }
     }
   }
-  if ((!aIsDetach) && hasFeature) {
-    theMenu->addAction(theStdActions["DELETE_CMD"]);
+  if (!hasAttribute) {
+    bool isAuxiliary;
+    if (canSetAuxiliary(isAuxiliary)) {
+      QAction* anAction = action("AUXILIARY_CMD");
+      theMenuActions[anIndex++] = anAction;
+      anAction->setChecked(isAuxiliary);
+    }
   }
-  if (hasAttribute)
-    return true;
-  bool isAuxiliary;
-  if (canSetAuxiliary(isAuxiliary)) {
-    QAction* anAction = action("AUXILIARY_CMD");
-    theMenu->addAction(anAction);
-    anAction->setChecked(isAuxiliary);
+
+  if (!aIsDetach && hasFeature) {
+    // Delete item should be the last in the list of actions
+    theMenuActions[1000] = theStdActions["DELETE_CMD"];
   }
+
   return true;
 }
 
@@ -352,8 +362,6 @@ void PartSet_MenuMgr::setAuxiliary(const bool isChecked)
 
     anOpMgr->startOperation(anOpAction);
   }
-  myModule->sketchMgr()->storeSelection();
-
   if (anObjects.size() > 0) {
     QObjectPtrList::const_iterator anIt = anObjects.begin(), aLast = anObjects.end();
     for (; anIt != aLast; anIt++) {
@@ -376,7 +384,6 @@ void PartSet_MenuMgr::setAuxiliary(const bool isChecked)
     anOpMgr->commitOperation();
 
   Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
-  myModule->sketchMgr()->restoreSelection();
 }
 
 bool PartSet_MenuMgr::canSetAuxiliary(bool& theValue) const
@@ -447,6 +454,7 @@ void PartSet_MenuMgr::onActivatePart(bool)
     }
     if (aPart.get())
       aPart->activate();
+      myModule->workshop()->updateCommandStatus();
   }
 }
 
@@ -465,6 +473,8 @@ void PartSet_MenuMgr::activatePartSet() const
   if (isNewTransaction) aMgr->startOperation("Activation");
   aMgr->setActiveDocument(aMgr->moduleDocument());
   if (isNewTransaction) aMgr->finishOperation();
+
+  myModule->workshop()->updateCommandStatus();
 }
 
 void PartSet_MenuMgr::grantedOperationIds(ModuleBase_Operation* theOperation,
@@ -491,23 +501,6 @@ void PartSet_MenuMgr::onEdit(bool)
     myModule->editFeature(aFeature);
 }
 
-void PartSet_MenuMgr::onSelectParentFeature()
-{
-  QObjectPtrList aObjects = myModule->workshop()->selection()->selectedObjects();
-  if (aObjects.size() != 1)
-    return;
-
-  SessionPtr aMgr = ModelAPI_Session::get();
-  ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>( aObjects.first() );
-  if( !aResult.get() )
-    return;
-
-  FeaturePtr aParentFeature = aResult->document()->feature( aResult );
-  QObjectPtrList aSelection;
-  aSelection.append( aParentFeature );
-  myModule->workshop()->selection()->setSelectedObjects( aSelection );
-}
-
 bool PartSet_MenuMgr::eventFilter(QObject* theObj, QEvent* theEvent)
 {
   if (theEvent->type() == QEvent::MouseButtonDblClick) {