]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
An improvement to deselect a value in a shape selector control in the same way as...
authornds <natalia.donis@opencascade.com>
Thu, 21 May 2015 05:05:59 +0000 (08:05 +0300)
committernds <natalia.donis@opencascade.com>
Thu, 21 May 2015 05:05:59 +0000 (08:05 +0300)
The reason is the plane deselection in the extrusion operation.

This leads to a modification in selection behavior e.g for sketch parallel constraint. After the first line is selected, the second control gets the focus, it is empty, so, the selection in the viewer is also empty. So, the first object is not selected anymore and the user can not see it.

src/ModuleBase/ModuleBase_IWorkshop.h
src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp
src/ModuleBase/ModuleBase_WidgetShapeSelector.cpp
src/ModuleBase/ModuleBase_WidgetShapeSelector.h
src/PartSet/PartSet_WidgetShapeSelector.cpp
src/XGUI/XGUI_Displayer.cpp
src/XGUI/XGUI_Displayer.h
src/XGUI/XGUI_ModuleConnector.cpp
src/XGUI/XGUI_ModuleConnector.h

index 87da9de589b76ae6357534a30311acb75bb9ca89..229b6e2e3c55aac56022606073eac7c327deb6d1 100644 (file)
@@ -10,6 +10,7 @@
 #include "ModuleBase.h"
 #include "ModuleBase_Definitions.h"
 #include <ModuleBase_FilterValidated.h>
+#include <ModuleBase_ViewerPrs.h>
 
 #include <ModelAPI_Object.h>
 #include <GeomAPI_AISObject.h>
@@ -78,7 +79,7 @@ Q_OBJECT
 
   //! Select features clearing previous selection. 
   //! If the list is empty then selection will be cleared
-  virtual void setSelected(const QObjectPtrList& theFeatures) = 0;
+  virtual void setSelected(const QList<ModuleBase_ViewerPrs>& theValues) = 0;
 
 signals:
   /// Signal selection chaged.
index 87de31d8106ebc81a2a43bef873dc8ba74be9a14..2e01ee941308cf260ed4c6c92f6076fffda8bfd2 100644 (file)
@@ -95,6 +95,7 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen
 ModuleBase_WidgetMultiSelector::~ModuleBase_WidgetMultiSelector()
 {
   activateShapeSelection(false);
+  activateFilters(myWorkshop, false);
 }
 
 //********************************************************************
@@ -106,8 +107,7 @@ void ModuleBase_WidgetMultiSelector::activateCustom()
           Qt::UniqueConnection);
 
   activateShapeSelection(true);
-
-  QObjectPtrList anObjects;
+  QList<ModuleBase_ViewerPrs> aSelected;
   // Restore selection in the viewer by the attribute selection list
   if(myFeature) {
     DataPtr aData = myFeature->data();
@@ -117,12 +117,20 @@ void ModuleBase_WidgetMultiSelector::activateCustom()
       for (int i = 0; i < aListAttr->size(); i++) {
         AttributeSelectionPtr anAttr = aListAttr->value(i);
         ResultPtr anObject = anAttr->context();
-        if (anObject.get())
-          anObjects.append(anObject);
+        if (anObject.get()) {
+          TopoDS_Shape aShape;
+          std::shared_ptr<GeomAPI_Shape> aShapePtr = anAttr->value();
+          if (aShapePtr.get()) {
+            aShape = aShapePtr->impl<TopoDS_Shape>();
+          }
+          aSelected.append(ModuleBase_ViewerPrs(anObject, aShape, NULL));
+        }
       }
     }
   }
-  myWorkshop->setSelected(anObjects);
+  myWorkshop->setSelected(aSelected);
+
+  activateFilters(myWorkshop, true);
 }
 
 //********************************************************************
@@ -130,6 +138,7 @@ void ModuleBase_WidgetMultiSelector::deactivate()
 {
   disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
   activateShapeSelection(false);
+  activateFilters(myWorkshop, false);
 }
 
 //********************************************************************
@@ -316,7 +325,8 @@ bool ModuleBase_WidgetMultiSelector::eventFilter(QObject* theObj, QEvent* theEve
 void ModuleBase_WidgetMultiSelector::onSelectionTypeChanged()
 {
   activateShapeSelection(true);
-  QObjectPtrList anEmptyList;
+  activateFilters(myWorkshop, true);
+  QList<ModuleBase_ViewerPrs> anEmptyList;
   // This method will call Selection changed event which will call onSelectionChanged
   // To clear mySelection, myListControl and storeValue()
   // So, we don't need to call it
@@ -356,10 +366,13 @@ void ModuleBase_WidgetMultiSelector::setCurrentShapeType(const TopAbs_ShapeEnum
     TopAbs_ShapeEnum aRefType = ModuleBase_Tools::shapeType(aShapeTypeName);
     if(aRefType == theShapeType && idx != myTypeCombo->currentIndex()) {
       activateShapeSelection(false);
+      activateFilters(myWorkshop, false);
       bool isBlocked = myTypeCombo->blockSignals(true);
       myTypeCombo->setCurrentIndex(idx);
       myTypeCombo->blockSignals(isBlocked);
+
       activateShapeSelection(true);
+      activateFilters(myWorkshop, true);
       break;
     }
   }
@@ -377,8 +390,6 @@ void ModuleBase_WidgetMultiSelector::activateShapeSelection(const bool isActivat
   } else {
     myWorkshop->deactivateSubShapesSelection();
   }
-
-  activateFilters(myWorkshop, isActivated);
 }
 
 //********************************************************************
index 73035992a958d7bf425c8140479a8a13873f685b..91cc1f01f5e0538e493c6b91ef00ed3fe939a348 100644 (file)
@@ -71,7 +71,7 @@ ModuleBase_WidgetShapeSelector::ModuleBase_WidgetShapeSelector(QWidget* theParen
                                                      const Config_WidgetAPI* theData,
                                                      const std::string& theParentId)
     : ModuleBase_WidgetValidated(theParent, theData, theParentId),
-      myWorkshop(theWorkshop), myIsActive(false)
+      myWorkshop(theWorkshop)
 {
   QFormLayout* aLayout = new QFormLayout(this);
   ModuleBase_Tools::adjustMargins(aLayout);
@@ -99,6 +99,7 @@ ModuleBase_WidgetShapeSelector::ModuleBase_WidgetShapeSelector(QWidget* theParen
 ModuleBase_WidgetShapeSelector::~ModuleBase_WidgetShapeSelector()
 {
   activateSelection(false);
+  activateFilters(myWorkshop, false);
 }
 
 //********************************************************************
@@ -186,61 +187,26 @@ QList<QWidget*> ModuleBase_WidgetShapeSelector::getControls() const
 //********************************************************************
 void ModuleBase_WidgetShapeSelector::onSelectionChanged()
 {
-  // In order to make reselection possible
-  // TODO: check with MPV clearAttribute();
+  // In order to make reselection possible, set empty object and shape should be done
+  setObject(ObjectPtr(), std::shared_ptr<GeomAPI_Shape>(new GeomAPI_Shape()));
 
+  bool aHasObject = false;
   QList<ModuleBase_ViewerPrs> aSelectedPrs = getSelectedEntitiesOrObjects(myWorkshop->selection());
-  if (aSelectedPrs.empty())
-    return;
-  ModuleBase_ViewerPrs aPrs = aSelectedPrs.first();
-  if (aPrs.isEmpty() || !isValidSelection(aPrs))
-    return;
-
-  if (!aPrs.isEmpty() && isValidSelection(aPrs)) {
-    setSelectionCustom(aPrs);
-    // the updateObject method should be called to flush the updated sigal. The workshop listens it,
-    // calls validators for the feature and, as a result, updates the Apply button state.
-    updateObject(myFeature);
-    //if (theObj) {
-      //  raisePanel();
-    //} 
-    //updateSelectionName();
-    //emit valuesChanged();
-    emit focusOutWidget(this);
+  if (!aSelectedPrs.empty()) {
+    ModuleBase_ViewerPrs aPrs = aSelectedPrs.first();
+    if (!aPrs.isEmpty() && isValidSelection(aPrs)) {
+      setSelectionCustom(aPrs);
+      aHasObject = true;
+    }
   }
-
+  // the updateObject method should be called to flush the updated sigal. The workshop listens it,
+  // calls validators for the feature and, as a result, updates the Apply button state.
+  updateObject(myFeature);
+  // the widget loses the focus only if the selected object is set
+  if (aHasObject)
+    emit focusOutWidget(this);
 }
 
-//********************************************************************
-//bool ModuleBase_WidgetShapeSelector::acceptObjectShape(const ObjectPtr theResult) const
-//{
-//  ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theResult);
-//
-//  // Check that the shape of necessary type
-//  std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(aResult);
-//  if (!aShapePtr)
-//    return false;
-//  TopoDS_Shape aShape = aShapePtr->impl<TopoDS_Shape>();
-//  if (aShape.IsNull())
-//    return false;
-//
-//  TopAbs_ShapeEnum aShapeType = aShape.ShapeType();
-//  if (aShapeType == TopAbs_COMPOUND) {
-//    foreach (QString aType,
-//      myShapeTypes) {
-//      TopExp_Explorer aEx(aShape, shapeType(aType));
-//      if (aEx.More())
-//        return true;
-//    }
-//  } else {
-//    foreach (QString aType, myShapeTypes) {
-//      if (shapeType(aType) == aShapeType)
-//        return true;
-//    }
-//  }
-//  return false;
-//}
-
 //********************************************************************
 bool ModuleBase_WidgetShapeSelector::acceptSubShape(std::shared_ptr<GeomAPI_Shape> theShape) const
 {
@@ -296,7 +262,7 @@ void ModuleBase_WidgetShapeSelector::updateSelectionName()
           myTextLine->setText(QString::fromStdString(aName.str()));
         }
       }
-      else if (myIsActive) {
+      else {
         myTextLine->setText("");
       }
     }
@@ -307,12 +273,9 @@ void ModuleBase_WidgetShapeSelector::updateSelectionName()
 //********************************************************************
 void ModuleBase_WidgetShapeSelector::activateSelection(bool toActivate)
 {
-  if (myIsActive == toActivate)
-    return;
-  myIsActive = toActivate;
   updateSelectionName();
 
-  if (myIsActive) {
+  if (toActivate) {
     QIntList aList;
     foreach (QString aType, myShapeTypes) {
       aList.append(ModuleBase_Tools::shapeType(aType));
@@ -321,8 +284,6 @@ void ModuleBase_WidgetShapeSelector::activateSelection(bool toActivate)
   } else {
     myWorkshop->deactivateSubShapesSelection();
   }
-
-  activateFilters(myWorkshop, myIsActive);
 }
 
 //********************************************************************
@@ -347,6 +308,24 @@ void ModuleBase_WidgetShapeSelector::activateCustom()
 {
   connect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
   activateSelection(true);
+  // Restore selection in the viewer by the attribute selection list
+  QList<ModuleBase_ViewerPrs> aSelected;
+  if(myFeature) {
+    DataPtr aData = myFeature->data();
+    AttributePtr anAttribute = myFeature->attribute(attributeID());
+
+    ObjectPtr anObject = GeomValidators_Tools::getObject(anAttribute);
+    TopoDS_Shape aShape;
+    std::shared_ptr<GeomAPI_Shape> aShapePtr = getShape();
+    if (aShapePtr.get()) {
+      aShape = aShapePtr->impl<TopoDS_Shape>();
+    }
+    ModuleBase_ViewerPrs aPrs(anObject, aShape, NULL);
+    aSelected.append(aPrs);
+  }
+  myWorkshop->setSelected(aSelected);
+
+  activateFilters(myWorkshop, true);
 }
 
 //********************************************************************
@@ -438,5 +417,6 @@ bool ModuleBase_WidgetShapeSelector::setSelectionCustom(const ModuleBase_ViewerP
 void ModuleBase_WidgetShapeSelector::deactivate()
 {
   activateSelection(false);
+  activateFilters(myWorkshop, false);
   disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
 }
index bf0fb6800d39f5d4b5029b6b29d53ee6aba28c6e..86a7b7312e0ee1c87b23524d3bb92129d4acec73 100644 (file)
@@ -150,9 +150,6 @@ Q_OBJECT
   /// List of accepting shapes types
   QStringList myShapeTypes;
 
-  /// Active/inactive flag
-  bool myIsActive;
-
   /// backup parameters of the model attribute. The class processes three types of attribute:
   /// Reference, RefAttr and Selection. Depending on the attribute type, only the attribute parameter
   /// values are reserved in the backup
index bdd7bba7a1323f37e7fd169f0818493abf2a0019..cea864a6af9dcfe1aa1ac198b7ba02b723f7639c 100644 (file)
@@ -102,7 +102,7 @@ void PartSet_WidgetShapeSelector::setPointAttribute(ObjectPtr theSelectedObject,
     // test case is - preselection for distance operation, which contains two points selected on lines
     if (aPntAttr)
       aRefAttr->setAttr(aPntAttr);
-    else if (theSelectedObject)
+    else
       aRefAttr->setObject(theSelectedObject);
   }
 }
index 3ec1a2105d78001a736027174bea997927a1acd0..ce6aadefccc27003aa65cee1f139a9ecfc48b1ce 100644 (file)
@@ -454,6 +454,57 @@ void XGUI_Displayer::setSelected(const QObjectPtrList& theResults, const bool is
     updateViewer();
 }
 
+void XGUI_Displayer::setSelected(const  QList<ModuleBase_ViewerPrs>& theValues, bool isUpdateViewer)
+{
+  Handle(AIS_InteractiveContext) aContext = AISContext();
+  if (aContext.IsNull())
+    return;
+  if (aContext->HasOpenedContext()) {
+    aContext->UnhilightSelected();
+    aContext->ClearSelected();
+    //if (aSelected.size() > 0) {
+    foreach (ModuleBase_ViewerPrs aPrs, theValues) {
+    //    if (isValidSelection(aPrs)) {
+    //foreach(ObjectPtr aResult, theResults) {
+      ObjectPtr anObject = aPrs.object();
+      ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
+      if (aResult.get() && isVisible(aResult)) {
+        AISObjectPtr anObj = myResult2AISObjectMap[aResult];
+        Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
+        if (!anAIS.IsNull()) {
+          const TopoDS_Shape& aShape = aPrs.shape();
+          if (!aShape.IsNull()) {
+            aContext->AddOrRemoveSelected(aShape, false);
+          }
+          else {
+            // The methods are replaced in order to provide multi-selection, e.g. restore selection
+            // by activating multi selector widget. It also gives an advantage that the multi
+            // selection in OB gives multi-selection in the viewer
+            //aContext->SetSelected(anAIS, false);
+            // The selection in the context was cleared, so the method sets the objects are selected
+            aContext->AddOrRemoveSelected(anAIS, false);
+          }
+        }
+      }
+    }
+  } else {
+    aContext->UnhilightCurrents();
+    aContext->ClearCurrents();
+    //foreach(ObjectPtr aResult, theResults) {
+    foreach (ModuleBase_ViewerPrs aPrs, theValues) {
+      ObjectPtr anObject = aPrs.object();
+      ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
+      if (aResult.get() && isVisible(aResult)) {
+        AISObjectPtr anObj = myResult2AISObjectMap[aResult];
+        Handle(AIS_InteractiveObject) anAIS = anObj->impl<Handle(AIS_InteractiveObject)>();
+        if (!anAIS.IsNull())
+          aContext->SetCurrentObject(anAIS, false);
+      }
+    }
+  }
+  if (isUpdateViewer)
+    updateViewer();
+}
 
 void XGUI_Displayer::clearSelected()
 {
index 5ea7f07137efdb6dcf924512711dc4fab1fbe59f..7c66603442255abb3fcad566f4401481cd81f92b 100644 (file)
@@ -85,6 +85,8 @@ class XGUI_EXPORT XGUI_Displayer: public QObject
    */
   void setSelected(const QObjectPtrList& theFeatures, bool isUpdateViewer = true);
 
+  void setSelected(const  QList<ModuleBase_ViewerPrs>& theValues, bool isUpdateViewer = true);
+
 
   /// Unselect all objects
   void clearSelected();
index b83edb4c8d158e4233a4368875f232d6234ee576..1405ba5d620fb6d7da7997fa9a59a24b169597aa 100644 (file)
@@ -111,13 +111,13 @@ ObjectPtr XGUI_ModuleConnector::findPresentedObject(const AISObjectPtr& theAIS)
   return aDisp->getObject(theAIS);
 }
 
-void XGUI_ModuleConnector::setSelected(const QObjectPtrList& theFeatures)
+void XGUI_ModuleConnector::setSelected(const QList<ModuleBase_ViewerPrs>& theValues)
 {
   XGUI_Displayer* aDisp = myWorkshop->displayer();
-  if (theFeatures.isEmpty()) {
+  if (theValues.isEmpty()) {
     myWorkshop->selector()->clearSelection();
   } else {
-    aDisp->setSelected(theFeatures);
+    aDisp->setSelected(theValues);
   }    
 }
 
index e78228378bebf0f455857e6850215cb7fbfc9001..d2348e101018e6672460988ccb5113075127ae02 100644 (file)
@@ -63,7 +63,7 @@ Q_OBJECT
 
   //! Select features clearing previous selection. 
   //! If the list is empty then selection will be cleared
-  virtual void setSelected(const QObjectPtrList& theFeatures);
+  virtual void setSelected(const QList<ModuleBase_ViewerPrs>& theValues);
 
   //! Returns workshop
   XGUI_Workshop* workshop() const { return myWorkshop; }