]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Shape plane filter should process shapes of objects selected in object browser.
authornds <natalia.donis@opencascade.com>
Fri, 3 Jul 2015 19:30:24 +0000 (22:30 +0300)
committernds <natalia.donis@opencascade.com>
Fri, 3 Jul 2015 19:30:24 +0000 (22:30 +0300)
Final modification to use filters from context in:1. preselection processing, 2. onSelectionChanged[for objects from OB only]

17 files changed:
src/ModuleBase/ModuleBase_FilterValidated.cpp
src/ModuleBase/ModuleBase_IModule.h
src/ModuleBase/ModuleBase_IPropertyPanel.h
src/ModuleBase/ModuleBase_ISelection.cpp
src/ModuleBase/ModuleBase_ISelection.h
src/ModuleBase/ModuleBase_Operation.cpp
src/ModuleBase/ModuleBase_ViewerFilters.cpp
src/ModuleBase/ModuleBase_WidgetSelector.cpp
src/ModuleBase/ModuleBase_WidgetValidated.cpp
src/ModuleBase/ModuleBase_WidgetValidated.h
src/PartSet/PartSet_Filters.cpp
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_Module.h
src/PartSet/PartSet_WidgetSketchLabel.cpp
src/XGUI/XGUI_ModuleConnector.cpp
src/XGUI/XGUI_PropertyPanel.cpp
src/XGUI/XGUI_PropertyPanel.h

index 28a43c3d7ee28b0d3bd7046a9817bff49ca87e82..38dc9a3f506b5acd1b9fe6828e8d964430861adb 100644 (file)
@@ -25,8 +25,10 @@ Standard_Boolean ModuleBase_FilterValidated::IsOk(const Handle(SelectMgr_EntityO
 
   ModuleBase_IPropertyPanel* aPanel = anOperation->propertyPanel();
   ModuleBase_ModelWidget* anActiveWidget = aPanel->activeWidget();
+  if (!anActiveWidget)
+    anActiveWidget = aPanel->preselectionWidget();
   ModuleBase_WidgetValidated* aWidgetValidated = dynamic_cast<ModuleBase_WidgetValidated*>
-                                                                          (anActiveWidget);
+                                                                         (anActiveWidget);
   ModuleBase_ViewerPrs aPrs;
   myWorkshop->selection()->fillPresentation(aPrs, theOwner);
 
index 1ef962d28f8a6ddd42fa352e728943bc6cdff7d6..f3e47d8559bca6153d73f9f52b7f2f22abae3f27 100644 (file)
@@ -164,6 +164,9 @@ class MODULEBASE_EXPORT ModuleBase_IModule : public QObject
   /// \param theOperation the operation\r
   virtual void sendOperation(ModuleBase_Operation* theOperation);\r
 \r
+  //! Returns data object by AIS\r
+  virtual ObjectPtr findPresentedObject(const AISObjectPtr& theAIS) const = 0;\r
+\r
 signals:\r
   void operationLaunched();\r
 \r
index 3a18c858b3b0c7d5031ca2daf8cacd9bcb080844..59c2f8435a90b9500e244080227644b642348edb 100644 (file)
@@ -52,6 +52,12 @@ public:
   /// \return Enable/Disable state of Cancel button
   virtual bool isCancelEnabled() const = 0;
 
+  /// Returns widget processed by preselection
+  virtual ModuleBase_ModelWidget* preselectionWidget() const = 0;
+
+  /// Sets widget processed by preselection
+  virtual void setPreselectionWidget(ModuleBase_ModelWidget* theWidget) = 0;
+
 signals:
   /// The signal about key release on the control, that corresponds to the attribute
   /// \param theEvent key release event
index 708382115cc5a3783d074411c92b094e00cafcf7..cff9fa134ae48aa270437c0f5992c18fbc3f07b6 100644 (file)
@@ -2,6 +2,31 @@
 
 #include "ModuleBase_ISelection.h"
 
+//********************************************************************
+void ModuleBase_ISelection::appendSelected(const QList<ModuleBase_ViewerPrs> theValues,
+                                           QList<ModuleBase_ViewerPrs>& theValuesTo)
+{
+  // collect the objects from the viewer
+  QObjectPtrList anExistedObjects;
+  QList<ModuleBase_ViewerPrs>::const_iterator aPrsIt = theValuesTo.begin(),
+                                              aPrsLast = theValuesTo.end();
+  for (; aPrsIt != aPrsLast; aPrsIt++) {
+    if ((*aPrsIt).owner() && (*aPrsIt).object())
+      anExistedObjects.push_back((*aPrsIt).object());
+  }
+
+
+  QList<ModuleBase_ViewerPrs>::const_iterator anIt = theValues.begin(),
+                                              aLast = theValues.end();
+  for (; anIt != aLast; anIt++) {
+    ObjectPtr anObject = (*anIt).object();
+    if (anObject.get() != NULL && !anExistedObjects.contains(anObject)) {
+      theValuesTo.append(ModuleBase_ViewerPrs(anObject, TopoDS_Shape(), NULL));
+    }
+  }
+
+}
+
 //********************************************************************
 ResultPtr ModuleBase_ISelection::getResult(const ModuleBase_ViewerPrs& thePrs)
 {
index 1de791addbf2b364c9fa937933ec2879fd80b89f..ffe5e389f64c3e129e40803a6e23051c8d447592 100644 (file)
@@ -38,6 +38,13 @@ class ModuleBase_ISelection
   /// \return list of presentations
   virtual QList<ModuleBase_ViewerPrs> getSelected(const SelectionPlace& thePlace = Browser) const = 0;
 
+  /// The values are appended to the first parameter list if the first list does not contain an item
+  /// with the same object
+  /// \param theValues a list of new values
+  /// \param theValuesTo a list, that will be changed
+  static void appendSelected(const QList<ModuleBase_ViewerPrs> theValues,
+                             QList<ModuleBase_ViewerPrs>& theValuesTo);
+
   /// Returns a list of viewer highlited presentations
   /// \return list of presentations
   virtual QList<ModuleBase_ViewerPrs> getHighlighted() const = 0;
index 0cfb9863045d943ccd2d2a8f268dae8597ab66be..cf100595efe0acd4e3850e2fa07fe6738bfbf1df 100644 (file)
@@ -287,7 +287,7 @@ void ModuleBase_Operation::activateByPreselection()
         aWgt = (*aWIt);
         if (!aWgt->canSetValue())
           continue;
-
+        myPropertyPanel->setPreselectionWidget(aWgt);
         if (!aWgt->setSelection(myPreSelection, true)) {
           isSet = false;
           break;
@@ -296,6 +296,7 @@ void ModuleBase_Operation::activateByPreselection()
           aFilledWgt = aWgt;
         }
       }
+      myPropertyPanel->setPreselectionWidget(NULL);
       // 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
index 70d555c8cb1d8d1ff9166bdd7be2c2d18d32aefb..a7c1e7f644f80e491b0f75c58c3bd179b57524e2 100644 (file)
@@ -37,24 +37,24 @@ Standard_Boolean ModuleBase_ShapeDocumentFilter::IsOk(const Handle(SelectMgr_Ent
   if (!anOperation)
     return true;
 
+  std::shared_ptr<GeomAPI_AISObject> aAISObj = AISObjectPtr(new GeomAPI_AISObject());
   if (theOwner->HasSelectable()) {
-    Handle(AIS_InteractiveObject) aAisObj = 
-      Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable());
+    Handle(AIS_InteractiveObject) aAisObj =
+                     Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable());
     if (!aAisObj.IsNull()) {
-      std::shared_ptr<GeomAPI_AISObject> aAISObj = AISObjectPtr(new GeomAPI_AISObject());
       aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aAisObj));
-      ObjectPtr aObj = myWorkshop->findPresentedObject(aAISObj);
-      if (aObj) {
-        DocumentPtr aDoc = aObj->document();
-        SessionPtr aMgr = ModelAPI_Session::get();
-        return (aDoc == aMgr->activeDocument() || aDoc == aMgr->moduleDocument());
-      }
-      else {
-        // This is not object controlled by the filter
-        return Standard_True;
-      }
     }
   }
+  ObjectPtr aObj = myWorkshop->findPresentedObject(aAISObj);
+  if (aObj) {
+    DocumentPtr aDoc = aObj->document();
+    SessionPtr aMgr = ModelAPI_Session::get();
+    return (aDoc == aMgr->activeDocument() || aDoc == aMgr->moduleDocument());
+  }
+  else {
+    // This object is not controlled by the filter
+    return Standard_True;
+  }
   return Standard_False;
 }
 
index e979b9c48caf69fc9be896485be1464bc64e049e..f720767dfc87ea8c128781933ebc0c38cce69355 100755 (executable)
@@ -47,10 +47,9 @@ void ModuleBase_WidgetSelector::onSelectionChanged()
 {
   clearAttribute();
 
-  QList<ModuleBase_ViewerPrs> aSelected = myWorkshop->selection()->getSelected(
-                                                              ModuleBase_ISelection::AllControls);
-  bool isDone = setSelection(aSelected, true);
+  QList<ModuleBase_ViewerPrs> aSelected = getFilteredSelected();
 
+  bool isDone = setSelection(aSelected, false);
   emit valuesChanged();
   // 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.
@@ -174,3 +173,4 @@ void ModuleBase_WidgetSelector::deactivate()
   activateSelection(false);
   activateFilters(false);
 }
+
index 94f837e924f515748ea8ca98923f6acdf26af75d..e00fd80941614a75dfb4002a1c2bb32f7e5cd11d 100644 (file)
@@ -54,38 +54,55 @@ bool ModuleBase_WidgetValidated::setSelection(QList<ModuleBase_ViewerPrs>& theVa
   return isDone;
 }
 
+//********************************************************************
+ObjectPtr ModuleBase_WidgetValidated::findPresentedObject(const AISObjectPtr& theAIS) const
+{
+  return myPresentedObject;
+}
+
 //********************************************************************
 bool ModuleBase_WidgetValidated::isValidInFilters(const ModuleBase_ViewerPrs& thePrs)
 {
   bool aValid = true;
   Handle(SelectMgr_EntityOwner) anOwner = thePrs.owner();
 
-  // if an owern is null, the selection happens in the Object browser.
+  // if an owner is null, the selection happens in the Object browser.
   // creates a selection owner on the base of object shape and the object AIS object
   if (anOwner.IsNull() && thePrs.owner().IsNull() && thePrs.object().get()) {
     ResultPtr aResult = myWorkshop->selection()->getResult(thePrs);
     if (aResult.get()) {
       GeomShapePtr aShape = aResult->shape();
-
       const TopoDS_Shape aTDShape = aShape->impl<TopoDS_Shape>();
       Handle(AIS_InteractiveObject) anIO = myWorkshop->selection()->getIO(thePrs);
       anOwner = new StdSelect_BRepOwner(aTDShape, anIO);
+      myPresentedObject = aResult;
     }
+    else
+      aValid = false; // only results can be filtered
   }
-  // finds 
+  // checks the owner by the AIS context activated filters
   if (!anOwner.IsNull()) {
+    // the widget validator filter should be active, but during check by preselection
+    // it is not yet activated, so we need to activate/deactivate it manually
+    bool isActivated = isFilterActivated();
+    if (!isActivated)
+      activateFilters(true);
+
     const SelectMgr_ListOfFilter& aFilters = myWorkshop->viewer()->AISContext()->Filters();
     SelectMgr_ListIteratorOfListOfFilter anIt(aFilters);
     for (; anIt.More() && aValid; anIt.Next()) {
       Handle(SelectMgr_Filter) aFilter = anIt.Value();
-      //if (aFilter == myWorkshop->validatorFilter())
-      //  continue;
       aValid = aFilter->IsOk(anOwner);
     }
+    if (!isActivated)
+      activateFilters(false);
   }
+
   // removes created owner
-  if (!anOwner.IsNull() && anOwner != thePrs.owner())
+  if (!anOwner.IsNull() && anOwner != thePrs.owner()) {
     anOwner.Nullify();
+    myPresentedObject = ObjectPtr();
+  }
   return aValid;
 }
 
@@ -178,6 +195,22 @@ bool ModuleBase_WidgetValidated::isValidAttribute() const
   return aValid;
 }
 
+bool ModuleBase_WidgetValidated::isFilterActivated() const
+{
+  bool isActivated = false;
+
+  Handle(SelectMgr_Filter) aSelFilter = myWorkshop->validatorFilter();
+
+  const SelectMgr_ListOfFilter& aFilters = myWorkshop->viewer()->AISContext()->Filters();
+  SelectMgr_ListIteratorOfListOfFilter aIt(aFilters);
+  for (; aIt.More(); aIt.Next()) {
+    if (aSelFilter.Access() == aIt.Value().Access())
+      isActivated = true;
+  }
+  return isActivated;
+}
+
+
 void ModuleBase_WidgetValidated::activateFilters(const bool toActivate)
 {
   ModuleBase_IViewer* aViewer = myWorkshop->viewer();
@@ -241,3 +274,35 @@ void ModuleBase_WidgetValidated::clearValidState()
   myInvalidPrs.clear();
 }
 
+//********************************************************************
+QList<ModuleBase_ViewerPrs> ModuleBase_WidgetValidated::getFilteredSelected()
+{
+  QList<ModuleBase_ViewerPrs> aSelected = myWorkshop->selection()->getSelected(
+                                                       ModuleBase_ISelection::Viewer);
+
+  QList<ModuleBase_ViewerPrs> anOBSelected = myWorkshop->selection()->getSelected(
+                                                       ModuleBase_ISelection::Browser);
+  // filter the OB presentations
+  filterPresentations(anOBSelected);
+  if (!anOBSelected.isEmpty())
+    ModuleBase_ISelection::appendSelected(anOBSelected, aSelected);
+
+  return aSelected;
+}
+
+//********************************************************************
+void ModuleBase_WidgetValidated::filterPresentations(QList<ModuleBase_ViewerPrs>& theValues)
+{
+  QList<ModuleBase_ViewerPrs> aValidatedValues;
+
+  QList<ModuleBase_ViewerPrs>::const_iterator anIt = theValues.begin(), aLast = theValues.end();
+  bool isDone = false;
+  for (; anIt != aLast; anIt++) {
+    if (isValidInFilters(*anIt))
+      aValidatedValues.append(*anIt);
+  }
+  if (aValidatedValues.size() != theValues.size()) {
+    theValues.clear();
+    theValues = aValidatedValues;
+  }
+}
index 9861d424806144ca7b4d24412156cee5ce9460c2..bafc219aa349590fcf8d34a12720ebfd576c5172 100644 (file)
@@ -12,6 +12,7 @@
 #include <ModuleBase_ModelWidget.h>
 
 #include <GeomAPI_Shape.h>
+#include <GeomAPI_AISObject.h>
 #include <ModelAPI_Object.h>
 
 #include <SelectMgr_ListOfFilter.hxx>
@@ -61,6 +62,10 @@ class MODULEBASE_EXPORT ModuleBase_WidgetValidated : public ModuleBase_ModelWidg
   /// \param theValues the wrapped selection values
   virtual bool setSelection(QList<ModuleBase_ViewerPrs>& theValues,
                             const bool theToValidate);
+
+  //! Returns data object by AIS
+  ObjectPtr findPresentedObject(const AISObjectPtr& theAIS) const;
+
 protected:
   /// Creates a backup of the current values of the attribute
   /// It should be realized in the specific widget because of different
@@ -86,10 +91,14 @@ protected:
   // \return true if all validators return that the attribute is valid
   bool isValidAttribute() const;
 
+  /// Returns true if the workshop validator filter has been already activated
+  /// \return boolean value
+  bool isFilterActivated() const;
+
   /// It obtains selection filters from the workshop and activates them in the active viewer
   /// \param theWorkshop an active workshop
   /// \param toActivate a flag about activation or deactivation the filters
-  virtual void activateFilters(const bool toActivate);
+  void activateFilters(const bool toActivate);
 
   /// Gets the validity state of the presentation in an internal map. Returns true if the valid state of value is stored
   /// \param theValue a viewer presentation
@@ -104,10 +113,21 @@ protected:
   // Removes all presentations from internal maps.
   void clearValidState();
 
+  /// Returns a list of selected presentations in the viewer and object browser
+  /// The presentations from the object browser are filtered by the AIS context filters
+  /// \return a list of presentations
+  QList<ModuleBase_ViewerPrs> getFilteredSelected();
+
+  /// Applies AIS context filters to the parameter list. The not approved presentations are
+  /// removed from the parameters.
+  /// \param theValues a list of presentations.
+  void filterPresentations(QList<ModuleBase_ViewerPrs>& theValues);
+
 protected:
   ModuleBase_IWorkshop* myWorkshop;  /// Reference to workshop
 
 private:
+  ObjectPtr myPresentedObject; /// back up of the filtered object
   QList<ModuleBase_ViewerPrs> myValidPrs;
   QList<ModuleBase_ViewerPrs> myInvalidPrs;
   bool isValidateBlocked;
index 85038b426b10801a788481489bc5a2df834c1f03..0921844d6456fbb13161d1b1e255052c935dd598 100644 (file)
@@ -28,24 +28,24 @@ Standard_Boolean PartSet_GlobalFilter::IsOk(const Handle(SelectMgr_EntityOwner)&
     return true;
 
   if (ModuleBase_ShapeDocumentFilter::IsOk(theOwner)) {
+    std::shared_ptr<GeomAPI_AISObject> aAISObj = AISObjectPtr(new GeomAPI_AISObject());
     if (theOwner->HasSelectable()) {
       Handle(AIS_InteractiveObject) aAisObj = 
         Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable());
       if (!aAisObj.IsNull()) {
-        std::shared_ptr<GeomAPI_AISObject> aAISObj = AISObjectPtr(new GeomAPI_AISObject());
         aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aAisObj));
-        ObjectPtr aObj = myWorkshop->findPresentedObject(aAISObj);
-        if (aObj) {
-          FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
-          if (aFeature) {
-            return aFeature->getKind() != FeaturesPlugin_Group::ID();
-          } else 
-            return Standard_True;
-        } else
-          // This is not object controlled by the filter
-          return Standard_True;
       }
     }
+    ObjectPtr aObj = myWorkshop->findPresentedObject(aAISObj);
+    if (aObj) {
+      FeaturePtr aFeature = ModelAPI_Feature::feature(aObj);
+      if (aFeature) {
+        return aFeature->getKind() != FeaturesPlugin_Group::ID();
+      } else 
+        return Standard_True;
+    } else
+      // This is not object controlled by the filter
+      return Standard_True;
   }
   return Standard_False;
 }
index 8ad7937e4460cfd94357c929b6216d7adb2b84f4..938731a81ecd17ce2ff5d3d7f6d0e34e7efe5972 100644 (file)
@@ -4,6 +4,7 @@
 #include "PartSet_WidgetSketchLabel.h"
 #include "PartSet_Validators.h"
 #include "PartSet_Tools.h"
+#include "ModuleBase_WidgetValidated.h"
 #include "PartSet_WidgetPoint2d.h"
 #include "PartSet_WidgetPoint2dDistance.h"
 #include "PartSet_WidgetShapeSelector.h"
@@ -757,6 +758,25 @@ void PartSet_Module::customizeObjectBrowser(QWidget* theObjectBrowser)
   }
 }
 
+ObjectPtr PartSet_Module::findPresentedObject(const AISObjectPtr& theAIS) const
+{
+  ObjectPtr anObject;
+  ModuleBase_Operation* aOperation = myWorkshop->currentOperation();
+  if (aOperation) {
+    /// If last line finished on vertex the lines creation sequence has to be break
+    ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
+    ModuleBase_ModelWidget* anActiveWidget = aPanel->activeWidget();
+    // if there is an active widget, find the presented object in it
+    if (!anActiveWidget)
+      anActiveWidget = aPanel->preselectionWidget();
+    
+    ModuleBase_WidgetValidated* aWidgetValidated = dynamic_cast<ModuleBase_WidgetValidated*>
+                                                                           (anActiveWidget);
+    if (aWidgetValidated)
+      anObject = aWidgetValidated->findPresentedObject(theAIS);
+  }
+  return anObject;
+}
 
 void PartSet_Module::addObjectBrowserMenu(QMenu* theMenu) const
 {
index f946512a52baa89365b7b5d5a7bac916339b609b..eb64c79e4ea22c7304e75138c966ceb51926665f 100644 (file)
@@ -164,6 +164,9 @@ public:
   /// Returns the viewer Z layer
   int getVisualLayerId() const { return myVisualLayerId; }
 
+  //! Returns data object by AIS
+  virtual ObjectPtr findPresentedObject(const AISObjectPtr& theAIS) const;
+
 public slots:
   /// SLOT, that is called by no more widget signal emitted by property panel
   /// Set a specific flag to restart the sketcher operation
index e9e43ba5ac243a79ab060b8edfd131e2367fd42b..fb2b86e605e2081972d23ab9a8dad0948d29c58a 100644 (file)
@@ -104,8 +104,8 @@ QList<QWidget*> PartSet_WidgetSketchLabel::getControls() const
 
 void PartSet_WidgetSketchLabel::onSelectionChanged()
 {
-  QList<ModuleBase_ViewerPrs> aSelected = myWorkshop->selection()->getSelected(
-                                                           ModuleBase_ISelection::AllControls);
+  QList<ModuleBase_ViewerPrs> aSelected = getFilteredSelected();
+
   if (aSelected.empty())
     return;
   ModuleBase_ViewerPrs aPrs = aSelected.first();
index 486b89b85a29448deef094eeb51ea9302e85ce22..de204ffb420f67a6dd1ff504ac1207ede78e6dd2 100644 (file)
@@ -99,7 +99,10 @@ AISObjectPtr XGUI_ModuleConnector::findPresentation(const ObjectPtr& theObject)
 ObjectPtr XGUI_ModuleConnector::findPresentedObject(const AISObjectPtr& theAIS) const
 {
   XGUI_Displayer* aDisp = myWorkshop->displayer();
-  return aDisp->getObject(theAIS);
+  ObjectPtr anObject = aDisp->getObject(theAIS);
+  if (!anObject.get())
+    anObject = module()->findPresentedObject(theAIS);
+  return anObject;
 }
 
 void XGUI_ModuleConnector::setSelected(const QList<ModuleBase_ViewerPrs>& theValues)
index 6c53bb84347606c4d75a1f198e59bced1f1cec01..0a9c7189e20ec4b99de9dcf091d517d7fbc0680d 100644 (file)
@@ -34,6 +34,7 @@
 XGUI_PropertyPanel::XGUI_PropertyPanel(QWidget* theParent)
     : ModuleBase_IPropertyPanel(theParent), 
     myActiveWidget(NULL),
+    myPreselectionWidget(NULL),
     myPanelPage(NULL)
 {
   this->setWindowTitle(tr("Property Panel"));
@@ -225,3 +226,13 @@ void XGUI_PropertyPanel::setupActions(XGUI_ActionsMgr* theMgr)
     aBtn->setDefaultAction(anAct);
   }
 }
+
+ModuleBase_ModelWidget* XGUI_PropertyPanel::preselectionWidget() const
+{
+  return myPreselectionWidget;
+}
+
+void XGUI_PropertyPanel::setPreselectionWidget(ModuleBase_ModelWidget* theWidget)
+{
+  myPreselectionWidget = theWidget;
+}
index bc0934af53f26d7cc31e7aeecf190622bff259da..6a982c1c66e8c6795fec689ba8c426e20f9d57ef 100644 (file)
@@ -88,6 +88,12 @@ Q_OBJECT
   //! Allows to set predefined actions for the property panel fetched from the ActionsMgr
   void setupActions(XGUI_ActionsMgr* theMgr);
 
+  /// Returns widget processed by preselection
+  virtual ModuleBase_ModelWidget* preselectionWidget() const;
+
+  /// Sets widget processed by preselection
+  virtual void setPreselectionWidget(ModuleBase_ModelWidget* theWidget);
+
  public slots:
 
    /// \brief Update all widgets in property panel with values from the given feature
@@ -108,6 +114,8 @@ Q_OBJECT
 
   /// Currently active widget
   ModuleBase_ModelWidget* myActiveWidget;
+  /// Currently widget processed by preselection
+  ModuleBase_ModelWidget* myPreselectionWidget;
 };
 
 #endif /* XGUI_PROPERTYPANEL_H_ */