Salome HOME
Issue #905 Update of invalid feature representation in property panel
[modules/shaper.git] / src / XGUI / XGUI_Selection.cpp
index ea99308aa7a2cabdc93d9082c86d382db1b6a5f7..a8cd9cc3b35e678388857a52ee9eafbbada053ef 100644 (file)
@@ -24,18 +24,51 @@ XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop)
 {
 }
 
-QList<ModuleBase_ViewerPrs> XGUI_Selection::getSelected() const
+QList<ModuleBase_ViewerPrs> XGUI_Selection::getSelected(const SelectionPlace& thePlace) const
 {
-  QList<long> aSelectedIds; // Remember of selected address in order to avoid duplicates
-
   QList<ModuleBase_ViewerPrs> aPresentations;
-  XGUI_Displayer* aDisplayer = myWorkshop->displayer();
 
+  switch (thePlace) {
+    case Browser:
+      getSelectedInBrowser(aPresentations);
+    break;
+    case Viewer:
+      getSelectedInViewer(aPresentations);
+    break;
+  case AllControls:
+      getSelectedInViewer(aPresentations);
+      getSelectedInBrowser(aPresentations);
+    break;
+  }
+  return aPresentations;
+}
+
+Handle(AIS_InteractiveObject) XGUI_Selection::getIO(const ModuleBase_ViewerPrs& thePrs)
+{
+  Handle(AIS_InteractiveObject) anIO = thePrs.interactive();
+  if (anIO.IsNull()) {
+    Handle(SelectMgr_EntityOwner) anOwner = thePrs.owner();
+    if (!anOwner.IsNull())
+      anIO = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());
+
+    if (anIO.IsNull() && thePrs.object()) {
+      XGUI_Displayer* aDisplayer = myWorkshop->displayer();
+      AISObjectPtr anAISObject = aDisplayer->getAISObject(thePrs.object());
+      if (anAISObject.get())
+        anIO = anAISObject->impl<Handle(AIS_InteractiveObject)>();
+    }
+  }
+  return anIO;
+}
+
+void XGUI_Selection::getSelectedInViewer(QList<ModuleBase_ViewerPrs>& thePresentations) const
+{
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
   if (aContext.IsNull())
-    return aPresentations;
+    return;
 
   if (aContext->HasOpenedContext()) {
+    QList<long> aSelectedIds; // Remember of selected address in order to avoid duplicates
     for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) {
       ModuleBase_ViewerPrs aPrs;
       Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner();
@@ -46,25 +79,30 @@ QList<ModuleBase_ViewerPrs> XGUI_Selection::getSelected() const
 
       fillPresentation(aPrs, anOwner);
 
-      aPresentations.append(aPrs);
+      if (!thePresentations.contains(aPrs)) // TODO: check whether the presentation in a list
+        thePresentations.append(aPrs);
     }
   }
-  /* else {
-    for (aContext->InitCurrent(); aContext->MoreCurrent(); aContext->NextCurrent()) {
-      ModuleBase_ViewerPrs aPrs;
-      Handle(AIS_InteractiveObject) anIO = aContext->Current();
-      if (aSelectedIds.contains((long)anIO.Access()))
-        continue;
-    
-      aSelectedIds.append((long)anIO.Access());
-      aPrs.setInteractive(anIO);
+}
 
-      ObjectPtr aFeature = aDisplayer->getObject(anIO);
-      aPrs.setFeature(aFeature);
-      aPresentations.append(aPrs);
+void XGUI_Selection::getSelectedInBrowser(QList<ModuleBase_ViewerPrs>& thePresentations) const
+{
+  // collect the objects  of the parameter presentation to avoid a repeted objects in the result
+  QObjectPtrList aPresentationObjects;
+  QList<ModuleBase_ViewerPrs>::const_iterator aPrsIt = thePresentations.begin(),
+                                              aPrsLast = thePresentations.end();
+  for (; aPrsIt != aPrsLast; aPrsIt++) {
+    aPresentationObjects.push_back((*aPrsIt).object());
+  }
+
+  QObjectPtrList anObjects = selectedObjects();
+  QObjectPtrList::const_iterator anIt = anObjects.begin(), aLast = anObjects.end();
+  for (; anIt != aLast; anIt++) {
+    ObjectPtr anObject = *anIt;
+    if (anObject.get() != NULL && !aPresentationObjects.contains(anObject)) {
+      thePresentations.append(ModuleBase_ViewerPrs(anObject, TopoDS_Shape(), NULL));
     }
-  }*/
-  return aPresentations;
+  }
 }
 
 void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs,
@@ -79,7 +117,7 @@ void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs,
   // we should not check the appearance of this feature because there can be some selected shapes
   // for one feature
   Handle(StdSelect_BRepOwner) aBRO = Handle(StdSelect_BRepOwner)::DownCast(theOwner);
-  if( !aBRO.IsNull() ) {
+  if( !aBRO.IsNull() && aBRO->HasShape() ) {
     // the located method is called in the context to obtain the shape by the SelectedShape() method,
     // so the shape is located by the same rules
     TopoDS_Shape aShape = aBRO->Shape().Located (aBRO->Location() * aBRO->Shape().Location());
@@ -127,6 +165,11 @@ QObjectPtrList XGUI_Selection::selectedObjects() const
   return myWorkshop->objectBrowser()->selectedObjects();
 }
 
+void XGUI_Selection::setSelectedObjects( const QObjectPtrList& theObjects ) const
+{
+  return myWorkshop->objectBrowser()->setObjectsSelected( theObjects );
+}
+
 QObjectPtrList XGUI_Selection::selectedPresentations() const
 {
   QObjectPtrList aSelectedList;