]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Preselection using in operations: setSelection of widget returns a modified list...
authornds <natalia.donis@opencascade.com>
Wed, 17 Jun 2015 11:15:41 +0000 (14:15 +0300)
committernds <natalia.donis@opencascade.com>
Wed, 17 Jun 2015 11:16:10 +0000 (14:16 +0300)
This is especially useful for multi-selection control, which should process all possible selected presentations and give back non-used.

15 files changed:
src/ConstructionPlugin/ConstructionPlugin_Axis.cpp
src/ConstructionPlugin/axis_widget.xml
src/GeomValidators/GeomValidators_ConstructionComposite.cpp
src/ModuleBase/ModuleBase_ModelWidget.cpp
src/ModuleBase/ModuleBase_ModelWidget.h
src/ModuleBase/ModuleBase_Operation.cpp
src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp
src/ModuleBase/ModuleBase_WidgetMultiSelector.h
src/ModuleBase/ModuleBase_WidgetToolbox.h
src/ModuleBase/ModuleBase_WidgetValidated.cpp
src/ModuleBase/ModuleBase_WidgetValidated.h
src/PartSet/PartSet_WidgetPoint2d.cpp
src/PartSet/PartSet_WidgetPoint2d.h
src/PartSet/PartSet_WidgetSketchLabel.cpp
src/PartSet/PartSet_WidgetSketchLabel.h

index 280da1e7fd28869a24c27f8e23cc3189db3f5af1..e97fba83eae285e28d621f9593b5f79eb0d82d59 100644 (file)
@@ -44,7 +44,11 @@ void ConstructionPlugin_Axis::createAxisByTwoPoints()
   AttributeSelectionPtr aRef2 = data()->selection(ConstructionPlugin_Axis::POINT_SECOND());
   if ((aRef1.get() != NULL) && (aRef2.get() != NULL)) {
     GeomShapePtr aShape1 = aRef1->value();
+    if (!aShape1.get())
+      aShape1 = aRef1->context()->shape();
     GeomShapePtr aShape2 = aRef2->value();
+    if (!aShape2.get())
+      aShape2 = aRef2->context()->shape();
     if (aShape1->isVertex() && aShape2->isVertex() && (!aShape1->isEqual(aShape2))) {
       std::shared_ptr<GeomAPI_Pnt> aStart = GeomAlgoAPI_PointBuilder::point(aShape1);
       std::shared_ptr<GeomAPI_Pnt> anEnd = GeomAlgoAPI_PointBuilder::point(aShape2);
index 97796f3025a845ed53ec51095e69b52057c86b77..86afa347385f6d33e9e0d53579d30f94aeb772cf 100644 (file)
@@ -9,6 +9,7 @@
         tooltip="Select a first point"
         shape_types="vertex">
         <validator id="GeomValidators_ConstructionComposite"/>
+        <validator id="GeomValidators_ShapeType" parameters="vertex"/>
       </shape_selector>
       <shape_selector id="SecondPoint"
         label="Second point"
@@ -16,6 +17,7 @@
         tooltip="Select a second point"
         shape_types="vertex">
         <validator id="GeomValidators_ConstructionComposite"/>
+        <validator id="GeomValidators_ShapeType" parameters="vertex"/>
         <validator id="PartSet_DifferentShapes"/>
       </shape_selector>
     </box>
index fea2319925f92521a50aac085a7f37678041971b..16fd4a2e954f83225f1c62adaf7f91774cc41a8b 100644 (file)
@@ -26,7 +26,14 @@ bool GeomValidators_ConstructionComposite::isValid(const AttributePtr& theAttrib
     // It is a GeomAPI_Vertex shape for the point. The shape of the parameter is 
     // GeomAPI_Shape. It is important to use the realization of the isEqual method from
     // GeomAPI_Vertex class
-    aValid = aShapePtr.get() != NULL && aShapePtr->isEqual(aShape);
+    if (aShape.get()) {
+      aValid = aShapePtr.get() != NULL && aShapePtr->isEqual(aShape);
+    }
+    else {
+      // an empty shape is used in attribute selection if the shape of the result is equal to
+      // the selected shape, so according to the upper condifition, the result is true
+      aValid = true;
+    }
   }
   if (!aValid) {
     ResultConstructionPtr aConstr =
index b22c1f3b1ca773b70ba8b09d4f45e51bcf904acd..f3818ed5267809e9605090b13ddca7b90e24c68c 100644 (file)
@@ -139,14 +139,14 @@ bool ModuleBase_ModelWidget::storeValue()
   return isDone;
 }
 
-void ModuleBase_ModelWidget::updateObject(ObjectPtr theObj) const
+void ModuleBase_ModelWidget::updateObject(ObjectPtr theObj)
 {
   Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
   static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY);
   ModelAPI_EventCreator::get()->sendUpdated(theObj, anEvent);
 }
 
-void ModuleBase_ModelWidget::moveObject(ObjectPtr theObj) const
+void ModuleBase_ModelWidget::moveObject(ObjectPtr theObj)
 {
   static Events_ID anEvent = Events_Loop::eventByName(EVENT_OBJECT_MOVED);
   ModelAPI_EventCreator::get()->sendUpdated(theObj, anEvent);
index 615fdb152a3bb2432bc665072668da6b6b97c346..ce5eb80671b9ab295b860fac486fd7021b979687 100644 (file)
@@ -81,8 +81,7 @@ Q_OBJECT
   /// Set the given wrapped value to the current widget
   /// This value should be processed in the widget according to the needs
   /// \param theValues the wrapped selection values
-  /// \param thePosition an index in the list of values, the values should be get from the index
-  virtual bool setSelection(const QList<ModuleBase_ViewerPrs>& theValues, int& thePosition)
+  virtual bool setSelection(QList<ModuleBase_ViewerPrs>& theValues)
   {
     return false;
   }
@@ -145,6 +144,14 @@ Q_OBJECT
   /// \return Current Editing mode
   bool isEditingMode() const { return myIsEditing; }
 
+  /// Sends Update and Redisplay for the given object
+  /// \param theObj is updating object
+  static void updateObject(ObjectPtr theObj);
+
+  /// Sends Move event for the given object
+  /// \param theObj is object for moving
+  static void moveObject(ObjectPtr theObj);
+
 signals:
   /// The signal about widget values are to be changed
   void beforeValuesChanged();
@@ -187,14 +194,6 @@ signals:
   /// The methiod called when widget is activated
   virtual void activateCustom() {};
 
-  /// Sends Update and Redisplay for the given object
-  /// \param theObj is updating object
-  void updateObject(ObjectPtr theObj) const;
-
-  /// Sends Move event for the given object
-  /// \param theObj is object for moving
-  void moveObject(ObjectPtr theObj) const;
-
 protected slots:
   /// Processing of values changed in model widget by store the current value to the feature
   void onWidgetValuesChanged();
index 492637ba512808f1838ff4ddade6867c1bfcc4ce..3f9e149eda4d62ceab2c352554e2b00535a1bd62 100644 (file)
@@ -277,18 +277,17 @@ void ModuleBase_Operation::activateByPreselection()
     myPropertyPanel->activateNextWidget(NULL);
     return;
   }
-  
+
   ModuleBase_ModelWidget* aWgt, *aFilledWgt = 0;
   QList<ModuleBase_ModelWidget*>::const_iterator aWIt;
   bool isSet = false;
   // 1. apply the selection to controls
-  int aCurrentPosition = 0;
   for (aWIt = aWidgets.constBegin(); aWIt != aWidgets.constEnd(); ++aWIt) {
     aWgt = (*aWIt);
     if (!aWgt->canSetValue())
       continue;
 
-    if (!aWgt->setSelection(myPreSelection, aCurrentPosition/*aValue*/)) {
+    if (!aWgt->setSelection(myPreSelection)) {
       isSet = false;
       break;
     } else {
@@ -296,6 +295,11 @@ void ModuleBase_Operation::activateByPreselection()
       aFilledWgt = aWgt;
     }
   }
+  // in order to redisplay object in the viewer, the update/redisplay signals should be flushed
+  // it is better to perform it not in setSelection of each widget, but do it here,
+  // after the preselection is processed
+  ModuleBase_ModelWidget::updateObject(myFeature);
+
   // 2. ignore not obligatory widgets
   /*for (; aWIt != aWidgets.constEnd(); ++aWIt) {
     aWgt = (*aWIt);
index 6f413e634d1f0d2486e5b97aabd1e776e51afb9e..2720e55cfafc31f2886004fc0541893f26d14771 100644 (file)
@@ -262,33 +262,34 @@ bool ModuleBase_WidgetMultiSelector::acceptSubShape(const TopoDS_Shape& theShape
 }
 
 //********************************************************************
-bool ModuleBase_WidgetMultiSelector::setSelection(const QList<ModuleBase_ViewerPrs>& theValues,
-                                                  int& thePosition)
+bool ModuleBase_WidgetMultiSelector::setSelection(QList<ModuleBase_ViewerPrs>& theValues)
 {
-  if (thePosition < 0)
-    return false;
+  QList<ModuleBase_ViewerPrs> aSkippedValues;
 
   QList<ModuleBase_ViewerPrs>::const_iterator anIt = theValues.begin(), aLast = theValues.end();
   bool isDone = false;
-  for (int i = thePosition; i < theValues.size(); i++) {
-    ModuleBase_ViewerPrs aValue = theValues[i];
+  for (; anIt != aLast; anIt++) {
+    ModuleBase_ViewerPrs aValue = *anIt;
     bool aProcessed = false;
     if (isValidSelection(aValue)) {
       aProcessed = setSelectionCustom(aValue);
     }
+    else
+      aSkippedValues.append(aValue);
     // if there is at least one set, the result is true
     isDone = isDone || aProcessed;
-    // when an object, which do not satisfy the validating process, stop set selection
-    if (!aProcessed)
-      break;
-    else
-      thePosition++;
   }
-  if (isDone) {
-    updateObject(myFeature);
+  // updateObject - to update/redisplay feature
+  // it is commented in order to perfom it outside the method
+  //if (isDone) {
+    //updateObject(myFeature);
     // this emit is necessary to call store/restore method an restore type of selection
-    emit valuesChanged();
-  }
+    //emit valuesChanged();
+  //}
+  theValues.clear();
+  if (!aSkippedValues.empty())
+    theValues.append(aSkippedValues);
+
   return isDone;
 }
 
index c6c6a5c3b9f13e2cf7481b6352a066705725016b..9d569d2c43023ca3889fcb0470590fe50dc09b33 100644 (file)
@@ -78,8 +78,7 @@ class MODULEBASE_EXPORT ModuleBase_WidgetMultiSelector : public ModuleBase_Widge
   /// Set the given wrapped value to the current widget
   /// This value should be processed in the widget according to the needs
   /// \param theValues the wrapped selection values
-  /// \param thePosition an index in the list of values, the values should be get from the index
-  virtual bool setSelection(const QList<ModuleBase_ViewerPrs>& theValues, int& thePosition);
+  virtual bool setSelection(QList<ModuleBase_ViewerPrs>& theValues);
 
   /// Checks the widget validity. By default, it returns true.
   /// \param theValue a selected presentation in the view
index 639e90f14da10fd57faa7e709d67af45d574207e..b315e5d3a43456efff85b7e904d586c6df2a21ef 100644 (file)
@@ -22,6 +22,11 @@ class MODULEBASE_EXPORT ModuleBase_WidgetToolbox : public ModuleBase_PagedContai
   ModuleBase_WidgetToolbox(QWidget* theParent, const Config_WidgetAPI* theData,
                            const std::string& theParentId);
   virtual ~ModuleBase_WidgetToolbox();
+
+  /// Defines if it is supported to set the value in this widget
+  /// It returns false because this is an info widget
+  virtual bool canSetValue() const { return false; };
+
   /// Overrides ModuleBase_PagedContainer
   int addPage(ModuleBase_PageBase* theWidget,
               const QString& theName, const QString& theCaseId);
index b329e36c9ac6f065e7e90070cab6f0de0b691948..1225e1282173d223a19bf926af41dec182ff4fcb 100644 (file)
@@ -29,19 +29,21 @@ ModuleBase_WidgetValidated::~ModuleBase_WidgetValidated()
 }
 
 //********************************************************************
-bool ModuleBase_WidgetValidated::setSelection(const QList<ModuleBase_ViewerPrs>& theValues, int& thePosition)
+bool ModuleBase_WidgetValidated::setSelection(QList<ModuleBase_ViewerPrs>& theValues)
 {
-  if (thePosition < 0 || thePosition >= theValues.size())
+  if (theValues.empty())
     return false;
-  ModuleBase_ViewerPrs aValue = theValues[thePosition];
-  thePosition++;
-
+  // it removes the processed value from the parameters list
+  ModuleBase_ViewerPrs aValue = theValues.takeFirst();
   bool isDone = false;
 
   if (isValidSelection(aValue)) {
     isDone = setSelectionCustom(aValue);
-    updateObject(myFeature);
-    emit valuesChanged();
+    // updateObject - to update/redisplay feature
+    // it is commented in order to perfom it outside the method
+    //updateObject(myFeature);
+    // to storeValue()
+    //emit valuesChanged();
   }
   return isDone;
 }
index e13fb166f96063ba6b8ff73949207312767d3c64..bacba1887eeba137eb75a5785e2eb223303982e7 100644 (file)
@@ -50,8 +50,7 @@ class MODULEBASE_EXPORT ModuleBase_WidgetValidated : public ModuleBase_ModelWidg
   /// The method is called by the current operation to process the operation preselection.
   /// It is redefined to check the value validity and if it is, fill the attribute with by value
   /// \param theValues the wrapped selection values
-  /// \param thePosition an index in the list of values, the values should be get from the index
-  virtual bool setSelection(const QList<ModuleBase_ViewerPrs>& theValues, int& thePosition);
+  virtual bool setSelection(QList<ModuleBase_ViewerPrs>& theValues);
 
 protected:
   /// Creates a backup of the current values of the attribute
@@ -74,8 +73,6 @@ protected:
   /// \param theOwner a selected owner
   virtual bool setSelectionCustom(const ModuleBase_ViewerPrs& thePrs) = 0;
 
-  virtual void removePresentations() {};
-
   /// Checks the current attibute in all attribute validators
   // \return true if all validators return that the attribute is valid
   bool isValidAttribute() const;
index df7aab9dca3ce905ef015c06f7a799661210f926..964303fcd659a215d0e6008f80a48c2742233ad0 100644 (file)
@@ -125,12 +125,12 @@ PartSet_WidgetPoint2D::~PartSet_WidgetPoint2D()
 {
 }
 
-bool PartSet_WidgetPoint2D::setSelection(const QList<ModuleBase_ViewerPrs>& theValues, int& thePosition)
+bool PartSet_WidgetPoint2D::setSelection(QList<ModuleBase_ViewerPrs>& theValues)
 {
-  if (thePosition < 0 || thePosition >= theValues.size())
+  if (theValues.empty())
     return false;
-  ModuleBase_ViewerPrs aValue = theValues[thePosition];
-  thePosition++;
+
+  ModuleBase_ViewerPrs aValue = theValues.takeFirst();
 
   Handle(V3d_View) aView = myWorkshop->viewer()->activeView();
   bool isDone = false;
index 75c617ca005707440afaf5db41e213704327dc90..21f9738b4de9dcd59f87e7d4c576e01ebc475bb5 100644 (file)
@@ -52,8 +52,8 @@ Q_OBJECT
 
   /// Set the given wrapped value to the current widget
   /// This value should be processed in the widget according to the needs
-  /// \param theValue the wrapped widget value
-  virtual bool setSelection(const QList<ModuleBase_ViewerPrs>& theValues, int& thePosition);
+  /// \param theValues the wrapped widget values
+  virtual bool setSelection(QList<ModuleBase_ViewerPrs>& theValues);
 
   virtual bool restoreValue();
 
index e72f1bff547f1bbc19fd3cb83865c795077cfff1..9e659086c353cfc7f3c48a5c32281e2350ee2db5 100644 (file)
@@ -81,7 +81,7 @@ PartSet_WidgetSketchLabel::~PartSet_WidgetSketchLabel()
   erasePreviewPlanes();
 }
 
-bool PartSet_WidgetSketchLabel::setSelection(const QList<ModuleBase_ViewerPrs>& theValues, int& thePosition)
+bool PartSet_WidgetSketchLabel::setSelection(QList<ModuleBase_ViewerPrs>& theValues)
 {
   // do not use the given selection if the plane of the sketch has been already set.
   // If this check is absent, a selected plane in the viewer can be set in the sketch
@@ -89,7 +89,7 @@ bool PartSet_WidgetSketchLabel::setSelection(const QList<ModuleBase_ViewerPrs>&
   if (plane().get())
     return true;
 
-  return ModuleBase_WidgetValidated::setSelection(theValues, thePosition);
+  return ModuleBase_WidgetValidated::setSelection(theValues);
 }
 
 QList<QWidget*> PartSet_WidgetSketchLabel::getControls() const
index 0dc7c07f63f547d1dff933fd3f504213724d240e..4074ad53d8587cad2b045d2471adb6f0d2469a31 100644 (file)
@@ -52,8 +52,7 @@ Q_OBJECT
   /// The method is called by the current operation to process the operation preselection.
   /// It is redefined to do nothing if the plane of the sketch has been already set.
   /// \param theValues the wrapped selection values
-  /// \param thePosition an index in the list of values, the values should be get from the index
-  virtual bool setSelection(const QList<ModuleBase_ViewerPrs>& theValues, int& thePosition);
+  virtual bool setSelection(QList<ModuleBase_ViewerPrs>& theValues);
 
   virtual bool restoreValue()
   {