]> SALOME platform Git repositories - modules/shaper.git/blob - src/ModuleBase/ModuleBase_WidgetConcealedObjects.cpp
Salome HOME
Fix for the issue #1712 : avoid duplicates and not-concealed attributes usage
[modules/shaper.git] / src / ModuleBase / ModuleBase_WidgetConcealedObjects.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D\r
2 \r
3 // File:        ModuleBase_WidgetConcealedObjects.cpp\r
4 // Created:     29 Jul 2016\r
5 // Author:      Natalia ERMOLAEVA\r
6 \r
7 #include <ModuleBase_WidgetConcealedObjects.h>\r
8 #include <ModuleBase_Tools.h>\r
9 \r
10 #include <ModelAPI_Result.h>\r
11 #include <ModelAPI_AttributeReference.h>\r
12 #include <ModelAPI_AttributeRefList.h>\r
13 #include <ModelAPI_Session.h>\r
14 #include <ModelAPI_Validator.h>\r
15 \r
16 #include <Config_WidgetAPI.h>\r
17 \r
18 #include <QGridLayout>\r
19 \r
20 #include <QWidget>\r
21 #include <QTableWidget>\r
22 #include <QHeaderView>\r
23 #include <QToolButton>\r
24 \r
25 ModuleBase_WidgetConcealedObjects::ModuleBase_WidgetConcealedObjects(QWidget* theParent,\r
26                                                      const Config_WidgetAPI* theData)\r
27 : ModuleBase_ModelWidget(theParent, theData)\r
28 {\r
29   myBaseShapeAttribute = theData->getProperty("base_shape_attribute");\r
30   QGridLayout* aMainLay = new QGridLayout(this);\r
31   ModuleBase_Tools::adjustMargins(aMainLay);\r
32 \r
33   myView = new QTableWidget(this);\r
34   aMainLay->addWidget(myView);\r
35 \r
36   myView->setColumnCount(2);\r
37   myView->horizontalHeader()->setVisible(false);\r
38   myView->verticalHeader()->setVisible(false);\r
39 }\r
40 \r
41 ModuleBase_WidgetConcealedObjects::~ModuleBase_WidgetConcealedObjects()\r
42 {\r
43 }\r
44 \r
45 bool ModuleBase_WidgetConcealedObjects::storeValueCustom()\r
46 {\r
47   if(!myFeature)\r
48     return false;\r
49   DataPtr aData = myFeature->data();\r
50   AttributeRefListPtr anAttributeList = aData->reflist(attributeID());\r
51   anAttributeList->clear();\r
52   int aSize1 = anAttributeList->size(false);\r
53   for (int i = 0, aSize = myView->rowCount(); i < aSize; i++) {\r
54     QToolButton* aButton = dynamic_cast<QToolButton*>(myView->cellWidget(i, 0));;\r
55     if (aButton->isChecked())\r
56       anAttributeList->append(myConcealedResults[i]);\r
57   }\r
58   int aSize = anAttributeList->size(false);\r
59   return true;\r
60 }\r
61 \r
62 bool ModuleBase_WidgetConcealedObjects::restoreValueCustom()\r
63 {\r
64   FeaturePtr aBaseFeature;\r
65   ObjectPtr anObject;\r
66   if (myFeature) {\r
67     anObject = ModuleBase_Tools::getObject(myFeature->attribute(myBaseShapeAttribute));\r
68     if (anObject.get() != NULL)\r
69       aBaseFeature = ModelAPI_Feature::feature(anObject);\r
70   }\r
71   if (myBaseFeature != aBaseFeature) {\r
72     myView->setRowCount(0);\r
73     myConcealedResults.clear();\r
74     myBaseFeature = aBaseFeature;\r
75     if (myBaseFeature.get()) {\r
76       std::list<std::pair<std::string, std::list<std::shared_ptr<ModelAPI_Object> > > > aRefs;\r
77       myBaseFeature->data()->referencesToObjects(aRefs);\r
78       std::list<std::pair<std::string, std::list<ObjectPtr> > >::const_iterator\r
79                                                       anIt = aRefs.begin(), aLast = aRefs.end();\r
80       std::set<ResultPtr> alreadyThere; // to avoid duplications\r
81       for (; anIt != aLast; anIt++) {\r
82         if (!ModelAPI_Session::get()->validators()->\r
83               isConcealed(myBaseFeature->getKind(), anIt->first))\r
84           continue; // use only concealed attributes\r
85         std::list<ObjectPtr> anObjects = (*anIt).second;\r
86         std::list<ObjectPtr>::const_iterator anOIt = anObjects.begin(), anOLast = anObjects.end();\r
87         for (; anOIt != anOLast; anOIt++) {\r
88           ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(*anOIt);\r
89           if (aResult && aResult->isConcealed()) {\r
90             if (alreadyThere.find(aResult) == alreadyThere.end()) // issue 1712, avoid duplicates\r
91               alreadyThere.insert(aResult);\r
92             else continue;\r
93             int aRowId = myView->rowCount();\r
94             addViewRow(aResult);\r
95             myConcealedResults[aRowId] = aResult;\r
96           }\r
97         }\r
98       }\r
99     }\r
100   }\r
101   \r
102   DataPtr aData = myFeature->data();\r
103   AttributeRefListPtr anAttributeList = aData->reflist(attributeID());\r
104   int aSize = anAttributeList->size();\r
105   for (int i = 0, aSize = myView->rowCount(); i < aSize; i++) {\r
106     ResultPtr aResult = myConcealedResults[i];\r
107     QToolButton* aButton = dynamic_cast<QToolButton*>(myView->cellWidget(i, 0));\r
108     bool isChecked = anAttributeList->isInList(aResult);\r
109 \r
110     bool aBlocked = aButton->blockSignals(true);\r
111     aButton->setChecked(isChecked);\r
112     this->updateItemIcon(aButton);\r
113     aButton->blockSignals(aBlocked);\r
114   }\r
115   return true;\r
116 }\r
117 \r
118 QList<QWidget*> ModuleBase_WidgetConcealedObjects::getControls() const\r
119 {\r
120   QList<QWidget*> result;\r
121   result << myView;\r
122   return result;\r
123 }\r
124 \r
125 void ModuleBase_WidgetConcealedObjects::addViewRow(const std::shared_ptr<ModelAPI_Result>& theResult)\r
126 {\r
127   int anId = myView->rowCount();\r
128   myView->setRowCount(anId+1);\r
129 \r
130   QToolButton* aVisibilityBtn = new QToolButton(this);\r
131   connect(aVisibilityBtn, SIGNAL(toggled(bool)), this, SLOT(onItemToggled(bool)));\r
132   aVisibilityBtn->setCheckable(true);\r
133   aVisibilityBtn->setChecked(false);\r
134   updateItemIcon(aVisibilityBtn);\r
135 \r
136   myView->setCellWidget(anId, 0, aVisibilityBtn);\r
137   myView->setItem(anId, 1, new QTableWidgetItem(theResult->data()->name().c_str()));\r
138 }\r
139 \r
140 void ModuleBase_WidgetConcealedObjects::onItemToggled(bool theState)\r
141 {\r
142   emit valuesChanged();\r
143   updateObject(myFeature);\r
144 }\r
145 \r
146 void ModuleBase_WidgetConcealedObjects::updateItemIcon(QToolButton* theButton)\r
147 {\r
148   bool isChecked = theButton->isChecked();\r
149   theButton->setIcon(isChecked ? QIcon(":icons/concealed_on.png")\r
150                                : QIcon(":icons/concealed_off.png"));\r
151   theButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);\r
152 }\r