Salome HOME
Use ModelWidgets for filters GUI
[modules/shaper.git] / src / ModuleBase / ModuleBase_WidgetSelectionFilter.cpp
index d8b9233c8fb1ba1d8ec86dd5906ba7e8aadf1522..bccb9032b8a1f90bda986ca375bd0356625f64c5 100644 (file)
@@ -26,6 +26,7 @@
 #include "ModuleBase_PageWidget.h"
 #include "ModuleBase_WidgetMultiSelector.h"
 #include "ModuleBase_ResultPrs.h"
+#include "ModuleBase_WidgetFactory.h"
 
 #include <ModelAPI_Session.h>
 #include <ModelAPI_AttributeSelectionList.h>
@@ -124,17 +125,40 @@ void ModuleBase_FilterStarter::onFiltersLaunch()
 //*****************************************************************************
 //*****************************************************************************
 ModuleBase_FilterItem::ModuleBase_FilterItem(
-  const std::string& theFilter, FeaturePtr theSelection, QWidget* theParent)
-  : QWidget(theParent), myFilterID(theFilter),
-    mySelection(std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(theSelection))
+  const std::string& theFilter, ModuleBase_WidgetSelectionFilter* theParent)
+  : QWidget(theParent->filtersWidget()), myFilterID(theFilter),
+    mySelection(std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(theParent->feature()))
 {
   std::string aXmlString = ModelAPI_Session::get()->filters()->filter(theFilter)->xmlRepresentation();
+  if (aXmlString.length() == 0)
+    addItemRow(this);
+  else {
+    ModuleBase_WidgetFactory aFactory(aXmlString, theParent->workshop());
+    QVBoxLayout* aLayout = new QVBoxLayout(this);
+    ModuleBase_Tools::zeroMargins(aLayout);
+
+    QWidget* aItemRow = new QWidget(this);
+    addItemRow(aItemRow);
+    aLayout->addWidget(aItemRow);
+
+    ModuleBase_PageWidget* aParamsWgt = new ModuleBase_PageWidget(this);
+    aFactory.createWidget(aParamsWgt);
+    ModuleBase_Tools::zeroMargins(aParamsWgt->layout());
+    QList<ModuleBase_ModelWidget*> aWidgets = aFactory.getModelWidgets();
+    foreach(ModuleBase_ModelWidget* aWidget, aWidgets) {
+      aWidget->setFeature(theParent->feature());
+    }
+    aLayout->addWidget(aParamsWgt);
+  }
+}
 
-  QHBoxLayout* aLayout = new QHBoxLayout(this);
+void ModuleBase_FilterItem::addItemRow(QWidget* theParent)
+{
+  QHBoxLayout* aLayout = new QHBoxLayout(theParent);
   ModuleBase_Tools::zeroMargins(aLayout);
 
   // Reverse filter button
-  myRevBtn = new QToolButton(this);
+  myRevBtn = new QToolButton(theParent);
   myRevBtn->setCheckable(true);
   myRevBtn->setChecked(false);
   myRevBtn->setAutoRaise(true);
@@ -144,9 +168,9 @@ ModuleBase_FilterItem::ModuleBase_FilterItem(
   aLayout->addWidget(myRevBtn);
 
   const std::string& aFilterName = ModelAPI_Session::get()->filters()->filter(myFilterID)->name();
-  aLayout->addWidget(new QLabel(aFilterName.c_str(), this), 1);
+  aLayout->addWidget(new QLabel(aFilterName.c_str(), theParent), 1);
 
-  QToolButton* aDelBtn = new QToolButton(this);
+  QToolButton* aDelBtn = new QToolButton(theParent);
   aDelBtn->setIcon(QIcon(":pictures/delete.png"));
   aDelBtn->setAutoRaise(true);
   aDelBtn->setToolTip(tr("Delete the filter"));
@@ -154,7 +178,6 @@ ModuleBase_FilterItem::ModuleBase_FilterItem(
   aLayout->addWidget(aDelBtn);
 }
 
-
 void ModuleBase_FilterItem::onReverse(bool theCheck)
 {
   mySelection->setReversed(myFilterID, theCheck);
@@ -294,8 +317,7 @@ void ModuleBase_WidgetSelectionFilter::onAddFilter(int theIndex)
   }
   if (!aFilter.empty()) {
     myUseFilters.push_back(aFilter);
-    ModuleBase_FilterItem* aItem =
-      new ModuleBase_FilterItem(aFilter, myFeature, myFiltersWgt);
+    ModuleBase_FilterItem* aItem = new ModuleBase_FilterItem(aFilter, this);
     connect(aItem, SIGNAL(deleteItem(ModuleBase_FilterItem*)),
       SLOT(onDeleteItem(ModuleBase_FilterItem*)));
     connect(aItem, SIGNAL(reversedItem(ModuleBase_FilterItem*)),