Salome HOME
Union of validator and filter functionalities.
[modules/shaper.git] / src / ModuleBase / ModuleBase_WidgetValidated.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 #include <ModuleBase_WidgetValidated.h>
4 #include <ModuleBase_FilterFactory.h>
5 #include <ModuleBase_IViewer.h>
6
7 #include <ModelAPI_Session.h>
8 #include <ModelAPI_Validator.h>
9 #include <ModelAPI_ResultValidator.h>
10 #include <ModelAPI_AttributeValidator.h>
11
12 #include <SelectMgr_ListIteratorOfListOfFilter.hxx>
13 #include <SelectMgr_EntityOwner.hxx>
14
15 #include <QWidget>
16
17 ModuleBase_WidgetValidated::ModuleBase_WidgetValidated(QWidget* theParent,
18                                                        const Config_WidgetAPI* theData,
19                                                        const std::string& theParentId)
20  : ModuleBase_ModelWidget(theParent, theData, theParentId)
21 {
22 }
23
24 ModuleBase_WidgetValidated::~ModuleBase_WidgetValidated()
25 {
26 }
27
28 bool ModuleBase_WidgetValidated::setSelection(ModuleBase_ViewerPrs theValue)
29 {
30   bool isDone = false;
31
32   Handle(SelectMgr_EntityOwner) anOwner = theValue.owner();
33   if (isValid(anOwner)) {
34     //storeAttributeValue(anOwner);
35     setSelection(anOwner);
36     updateObject(myFeature);
37     //isDone = setSelection(anOwner);
38     emit valuesChanged();
39   }
40   return isDone;
41 }
42
43 bool ModuleBase_WidgetValidated::isValid(const Handle_SelectMgr_EntityOwner& theOwner)
44 {
45   backupAttributeValue(true);
46
47   setSelection(theOwner);
48   bool aValid = isValidAttribute();
49
50   backupAttributeValue(false);
51
52   return aValid;
53 }
54
55 //********************************************************************
56 bool ModuleBase_WidgetValidated::isValidAttribute() const
57 {
58   SessionPtr aMgr = ModelAPI_Session::get();
59   ModelAPI_ValidatorsFactory* aFactory = aMgr->validators();
60   std::list<ModelAPI_Validator*> aValidators;
61   std::list<std::list<std::string> > anArguments;
62   aFactory->validators(parentID(), attributeID(), aValidators, anArguments);
63
64   DataPtr aData = myFeature->data();
65   AttributePtr anAttribute = myFeature->attribute(attributeID());
66
67   aData->blockSendAttributeUpdated(true);
68
69     // 3. check the acceptability of the current values
70   std::list<ModelAPI_Validator*>::iterator aValidator = aValidators.begin();
71   std::list<std::list<std::string> >::iterator aArgs = anArguments.begin();
72   bool aValid = true;
73   for (; aValidator != aValidators.end() && aValid; aValidator++, aArgs++) {
74     const ModelAPI_AttributeValidator* aAttrValidator =
75         dynamic_cast<const ModelAPI_AttributeValidator*>(*aValidator);
76     if (aAttrValidator) {
77       aValid = aAttrValidator->isValid(anAttribute, *aArgs);
78     }
79   }
80   aData->blockSendAttributeUpdated(false);
81
82   return aValid;
83 }
84
85 //********************************************************************
86 bool ModuleBase_WidgetValidated::isValid(ObjectPtr theObj, GeomShapePtr theShape) const
87 {
88   SessionPtr aMgr = ModelAPI_Session::get();
89   ModelAPI_ValidatorsFactory* aFactory = aMgr->validators();
90   std::list<ModelAPI_Validator*> aValidators;
91   std::list<std::list<std::string> > anArguments;
92   aFactory->validators(parentID(), attributeID(), aValidators, anArguments);
93
94   // Check the type of selected object
95   std::list<ModelAPI_Validator*>::iterator aValidator = aValidators.begin();
96   bool isValid = true;
97   for (; aValidator != aValidators.end(); aValidator++) {
98     const ModelAPI_ResultValidator* aResValidator =
99         dynamic_cast<const ModelAPI_ResultValidator*>(*aValidator);
100     if (aResValidator) {
101       isValid = false;
102       if (aResValidator->isValid(theObj)) {
103         isValid = true;
104         break;
105       }
106     }
107   }
108   return isValid;
109 }
110
111 void ModuleBase_WidgetValidated::activateFilters(ModuleBase_IWorkshop* theWorkshop,
112                                                  const bool toActivate) const
113 {
114   ModuleBase_IViewer* aViewer = theWorkshop->viewer();
115
116   Handle(SelectMgr_Filter) aSelFilter = theWorkshop->validatorFilter();
117   if (toActivate)
118     aViewer->addSelectionFilter(aSelFilter);
119   else
120     aViewer->removeSelectionFilter(aSelFilter);
121 /*
122   // apply filters loaded from the XML definition of the widget
123   ModuleBase_FilterFactory* aFactory = theWorkshop->selectionFilters();
124   SelectMgr_ListOfFilter aFactoryFilters;
125   aFactory->filters(parentID(), attributeID(), aFactoryFilters);
126   SelectMgr_ListIteratorOfListOfFilter aFactoryIt(aFactoryFilters);
127   for (; aFactoryIt.More(); aFactoryIt.Next()) {
128     Handle(SelectMgr_Filter) aSelFilter = aFactoryIt.Value();
129     if (aSelFilter.IsNull())
130       continue;
131     if (toActivate)
132       aViewer->addSelectionFilter(aSelFilter);
133     else
134       aViewer->removeSelectionFilter(aSelFilter);
135   }*/
136 }
137
138 void ModuleBase_WidgetValidated::selectionFilters(ModuleBase_IWorkshop* theWorkshop,
139                                                   SelectMgr_ListOfFilter& theFilters) const
140 {
141   ModuleBase_FilterFactory* aFactory = theWorkshop->selectionFilters();
142   SelectMgr_ListOfFilter aFilters;
143   aFactory->filters(parentID(), attributeID(), aFilters);
144   SelectMgr_ListIteratorOfListOfFilter aIt(aFilters);
145   for (; aIt.More(); aIt.Next()) {
146     Handle(SelectMgr_Filter) aSelFilter = aIt.Value();
147     if (aSelFilter.IsNull())
148       continue;
149
150     theFilters.Append(aSelFilter);
151   }
152 }