Salome HOME
Bugfix for issue #107 which also works for issue #82
[modules/shaper.git] / src / PartSet / PartSet_OperationFeatureEditMulti.cpp
index d66acf804a2ba1cbe435c259ec1bce70da234afe..cd0de892541cc01ab7374816c9431d9f165cf55a 100644 (file)
 using namespace std;
 
 PartSet_OperationFeatureEditMulti::PartSet_OperationFeatureEditMulti(const QString& theId,
-                                                 QObject* theParent,
-                                              FeaturePtr theFeature)
-: PartSet_OperationSketchBase(theId, theParent), mySketch(theFeature), myIsBlockedSelection(false)
+                                                                     QObject* theParent,
+                                                                     FeaturePtr theFeature)
+    : PartSet_OperationSketchBase(theId, theParent),
+      mySketch(theFeature),
+      myIsBlockedSelection(false)
 {
 }
 
@@ -43,13 +45,10 @@ PartSet_OperationFeatureEditMulti::~PartSet_OperationFeatureEditMulti()
 {
 }
 
-bool PartSet_OperationFeatureEditMulti::isGranted(ModuleBase_IOperation* theOperation) const
-{
-  return theOperation->getDescription()->operationId().toStdString() == PartSet_OperationSketch::Type();
-}
 
-void PartSet_OperationFeatureEditMulti::initSelection(const std::list<ModuleBase_ViewerPrs>& theSelected,
-                                                      const std::list<ModuleBase_ViewerPrs>& theHighlighted)
+void PartSet_OperationFeatureEditMulti::initSelection(
+    const std::list<ModuleBase_ViewerPrs>& theSelected,
+    const std::list<ModuleBase_ViewerPrs>& theHighlighted)
 {
   if (!theHighlighted.empty()) {
     // if there is highlighted object, we check whether it is in the list of selected objects
@@ -57,17 +56,16 @@ void PartSet_OperationFeatureEditMulti::initSelection(const std::list<ModuleBase
     // the hightlighted object should moved and the selection is skipped. The skipped selection will be
     // deselected in the viewer by blockSelection signal in the startOperation method.
     bool isSelected = false;
-    std::list<ModuleBase_ViewerPrs>::const_iterator anIt = theSelected.begin(), aLast = theSelected.end();
-    // TODO
-    /*for (; anIt != aLast && !isSelected; anIt++) {
-      isSelected = (*anIt).feature() == feature();
-    }*/
+    std::list<ModuleBase_ViewerPrs>::const_iterator anIt = theSelected.begin(), aLast = theSelected
+        .end();
+    for (; anIt != aLast && !isSelected; anIt++) {
+      isSelected = ModelAPI_Feature::feature((*anIt).object()) == feature();
+    }
     if (!isSelected)
       myFeatures = theHighlighted;
     else
       myFeatures = theSelected;
-  }
-  else
+  } else
     myFeatures = theSelected;
 }
 
@@ -81,15 +79,16 @@ FeaturePtr PartSet_OperationFeatureEditMulti::sketch() const
   return mySketch;
 }
 
-void PartSet_OperationFeatureEditMulti::mousePressed(QMouseEvent* theEvent, Handle(V3d_View) theView,
-                                             const std::list<ModuleBase_ViewerPrs>& /*theSelected*/,
-                                             const std::list<ModuleBase_ViewerPrs>& theHighlighted)
+void PartSet_OperationFeatureEditMulti::mousePressed(
+    QMouseEvent* theEvent, Handle(V3d_View) theView,
+    const std::list<ModuleBase_ViewerPrs>& /*theSelected*/,
+    const std::list<ModuleBase_ViewerPrs>& theHighlighted)
 {
 }
 
 void PartSet_OperationFeatureEditMulti::mouseMoved(QMouseEvent* theEvent, Handle(V3d_View) theView)
 {
-  if (!(theEvent->buttons() &  Qt::LeftButton))
+  if (!(theEvent->buttons() & Qt::LeftButton))
     return;
 
   gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theView);
@@ -105,39 +104,45 @@ void PartSet_OperationFeatureEditMulti::mouseMoved(QMouseEvent* theEvent, Handle
     double aDeltaX = aX - aCurX;
     double aDeltaY = anY - aCurY;
 
-    boost::shared_ptr<SketchPlugin_Feature> aSketchFeature = 
-                           boost::dynamic_pointer_cast<SketchPlugin_Feature>(feature());
+    boost::shared_ptr<SketchPlugin_Feature> aSketchFeature = boost::dynamic_pointer_cast<
+        SketchPlugin_Feature>(feature());
     aSketchFeature->move(aDeltaX, aDeltaY);
 
-    std::list<ModuleBase_ViewerPrs>::const_iterator anIt = myFeatures.begin(), aLast = myFeatures.end();
-    // TODO
-    /*for (; anIt != aLast; anIt++) {
-      FeaturePtr aFeature = (*anIt).feature();
-      if (!aFeature || aFeature == feature())
+    std::list<ModuleBase_ViewerPrs>::const_iterator anIt = myFeatures.begin(), aLast = myFeatures
+        .end();
+    for (; anIt != aLast; anIt++) {
+      ObjectPtr aObject = (*anIt).object();
+      if (!aObject || aObject == feature())
         continue;
-      aSketchFeature = boost::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
-      aSketchFeature->move(aDeltaX, aDeltaY);
-    }*/
+      FeaturePtr aFeature = ModelAPI_Feature::feature(aObject);
+      if (aFeature) {
+        aSketchFeature = boost::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
+        if (aSketchFeature)
+          aSketchFeature->move(aDeltaX, aDeltaY);
+      }
+    }
   }
   sendFeatures();
 
   myCurPoint.setPoint(aPoint);
 }
 
-void PartSet_OperationFeatureEditMulti::mouseReleased(QMouseEvent* theEvent, Handle(V3d_View) theView,
-                                              const std::list<ModuleBase_ViewerPrs>& /*theSelected*/,
-                                              const std::list<ModuleBase_ViewerPrs>& /*theHighlighted*/)
+void PartSet_OperationFeatureEditMulti::mouseReleased(
+    QMouseEvent* theEvent, Handle(V3d_View) theView,
+    const std::list<ModuleBase_ViewerPrs>& /*theSelected*/,
+    const std::list<ModuleBase_ViewerPrs>& /*theHighlighted*/)
 {
-  std::list<ModuleBase_ViewerPrs> aFeatures = myFeatures;
-  commit();
-  std::list<ModuleBase_ViewerPrs>::const_iterator anIt = aFeatures.begin(), aLast = aFeatures.end();
-  // TODO
-  /*for (; anIt != aLast; anIt++) {
-    FeaturePtr aFeature = (*anIt).feature();
-    if (aFeature) {
-      emit featureConstructed(aFeature, FM_Deactivation);
-       }
-  }*/
+  if (commit()) {
+    std::list<ModuleBase_ViewerPrs> aFeatures = myFeatures;
+    std::list<ModuleBase_ViewerPrs>::const_iterator anIt = aFeatures.begin(), aLast =
+        aFeatures.end();
+    for (; anIt != aLast; anIt++) {
+      ObjectPtr aFeature = (*anIt).object();
+      if (aFeature) {
+        emit featureConstructed(aFeature, FM_Deactivation);
+      }
+    }
+  }
 }
 
 void PartSet_OperationFeatureEditMulti::startOperation()
@@ -159,22 +164,22 @@ void PartSet_OperationFeatureEditMulti::stopOperation()
   myFeatures.clear();
 }
 
-void PartSet_OperationFeatureEditMulti::blockSelection(bool isBlocked, const bool isRestoreSelection)
+void PartSet_OperationFeatureEditMulti::blockSelection(bool isBlocked,
+                                                       const bool isRestoreSelection)
 {
   if (myIsBlockedSelection == isBlocked)
     return;
 
   myIsBlockedSelection = isBlocked;
-  QFeatureList aFeatureList;
-  std::list<ModuleBase_ViewerPrs>::const_iterator anIt = myFeatures.begin(),
-                                            aLast = myFeatures.end();
+  QList<ObjectPtr> aFeatureList;
+  std::list<ModuleBase_ViewerPrs>::const_iterator anIt = myFeatures.begin(), aLast =
+      myFeatures.end();
   /*for(; anIt != aLast; anIt++)
-    aFeatureList.append((*anIt).feature());*/
+   aFeatureList.append((*anIt).feature());*/
   if (isBlocked) {
-    emit setSelection(QFeatureList());
+    emit setSelection(QList<ObjectPtr>());
     emit stopSelection(aFeatureList, true);
-  }
-  else {
+  } else {
     emit stopSelection(aFeatureList, false);
     if (isRestoreSelection) {
       emit setSelection(aFeatureList);
@@ -186,16 +191,16 @@ void PartSet_OperationFeatureEditMulti::sendFeatures()
 {
   static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED);
 
-  std::list<FeaturePtr > aFeatures;
-  std::list<ModuleBase_ViewerPrs>::const_iterator anIt = myFeatures.begin(), aLast = myFeatures.end();
-  // TODO
-  /*for (; anIt != aLast; anIt++) {
-    FeaturePtr aFeature = (*anIt).feature();
+  std::list<FeaturePtr> aFeatures;
+  std::list<ModuleBase_ViewerPrs>::const_iterator anIt = myFeatures.begin(), aLast =
+      myFeatures.end();
+  for (; anIt != aLast; anIt++) {
+    ObjectPtr aFeature = (*anIt).object();
     if (!aFeature)
       continue;
 
     ModelAPI_EventCreator::get()->sendUpdated(aFeature, anEvent);
-  }*/
+  }
   Events_Loop::loop()->flush(anEvent);
   flushUpdated();
 }