Salome HOME
Multiple fixes (issue #1757 , issue #1799 , issue #1842 , etc):
[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 #include <ModelAPI_Tools.h>\r
16 \r
17 #include <Config_WidgetAPI.h>\r
18 \r
19 #include <QGridLayout>\r
20 \r
21 #include <QWidget>\r
22 #include <QTableWidget>\r
23 #include <QHeaderView>\r
24 #include <QToolButton>\r
25 \r
26 const int DEFAULT_NAME_COLUMN_WIDTH = 200;\r
27 \r
28 ModuleBase_WidgetConcealedObjects::ModuleBase_WidgetConcealedObjects(QWidget* theParent,\r
29                                                      const Config_WidgetAPI* theData)\r
30 : ModuleBase_ModelWidget(theParent, theData)\r
31 {\r
32   myBaseShapeAttribute = theData->getProperty("base_shape_attribute");\r
33   QGridLayout* aMainLay = new QGridLayout(this);\r
34   ModuleBase_Tools::adjustMargins(aMainLay);\r
35 \r
36   myView = new QTableWidget(this);\r
37   aMainLay->addWidget(myView);\r
38 \r
39   myView->setColumnCount(2);\r
40   myView->horizontalHeader()->setVisible(false);\r
41   myView->verticalHeader()->setVisible(false);\r
42 }\r
43 \r
44 ModuleBase_WidgetConcealedObjects::~ModuleBase_WidgetConcealedObjects()\r
45 {\r
46 }\r
47 \r
48 bool ModuleBase_WidgetConcealedObjects::storeValueCustom()\r
49 {\r
50   if(!myFeature)\r
51     return false;\r
52   DataPtr aData = myFeature->data();\r
53   AttributeRefListPtr anAttributeList = aData->reflist(attributeID());\r
54   anAttributeList->clear();\r
55   int aSize1 = anAttributeList->size(false);\r
56   for (int i = 0, aSize = myView->rowCount(); i < aSize; i++) {\r
57     QToolButton* aButton = dynamic_cast<QToolButton*>(myView->cellWidget(i, 0));;\r
58     if (aButton->isChecked())\r
59       anAttributeList->append(myConcealedResults[i]);\r
60   }\r
61   int aSize = anAttributeList->size(false);\r
62   return true;\r
63 }\r
64 \r
65 bool ModuleBase_WidgetConcealedObjects::restoreValueCustom()\r
66 {\r
67   FeaturePtr aBaseFeature;\r
68   ObjectPtr anObject;\r
69   if (myFeature) {\r
70     anObject = ModuleBase_Tools::getObject(myFeature->attribute(myBaseShapeAttribute));\r
71     if (anObject.get() != NULL)\r
72       aBaseFeature = ModelAPI_Feature::feature(anObject);\r
73   }\r
74   if (myBaseFeature != aBaseFeature) {\r
75     myView->setRowCount(0);\r
76     myConcealedResults.clear();\r
77     myBaseFeature = aBaseFeature;\r
78     if (myBaseFeature.get()) {\r
79       std::list<std::shared_ptr<ModelAPI_Result> > aResults;\r
80       ModelAPI_Tools::getConcealedResults(myBaseFeature, aResults);\r
81       std::list<std::shared_ptr<ModelAPI_Result> >::const_iterator anIt = aResults.begin(),\r
82                                                                    aLast = aResults.end();\r
83       for (; anIt != aLast; anIt++) {\r
84         ResultPtr aResult = *anIt;\r
85 \r
86         int aRowId = myView->rowCount();\r
87         addViewRow(aResult);\r
88         myConcealedResults[aRowId] = aResult;\r
89       }\r
90     }\r
91   }\r
92   \r
93   DataPtr aData = myFeature->data();\r
94   AttributeRefListPtr anAttributeList = aData->reflist(attributeID());\r
95   int aSize = anAttributeList->size();\r
96   for (int i = 0, aSize = myView->rowCount(); i < aSize; i++) {\r
97     ResultPtr aResult = myConcealedResults[i];\r
98     QToolButton* aButton = dynamic_cast<QToolButton*>(myView->cellWidget(i, 0));\r
99     bool isChecked = anAttributeList->isInList(aResult);\r
100 \r
101     bool aBlocked = aButton->blockSignals(true);\r
102     aButton->setChecked(isChecked);\r
103     this->updateItemIcon(aButton);\r
104     aButton->blockSignals(aBlocked);\r
105   }\r
106   return true;\r
107 }\r
108 \r
109 QList<QWidget*> ModuleBase_WidgetConcealedObjects::getControls() const\r
110 {\r
111   QList<QWidget*> result;\r
112   result << myView;\r
113   return result;\r
114 }\r
115 \r
116 void ModuleBase_WidgetConcealedObjects::addViewRow(const std::shared_ptr<ModelAPI_Result>& theResult)\r
117 {\r
118   int anId = myView->rowCount();\r
119   myView->setRowCount(anId+1);\r
120 \r
121   QToolButton* aVisibilityBtn = new QToolButton(this);\r
122   connect(aVisibilityBtn, SIGNAL(toggled(bool)), this, SLOT(onItemToggled(bool)));\r
123   aVisibilityBtn->setCheckable(true);\r
124   aVisibilityBtn->setChecked(false);\r
125   updateItemIcon(aVisibilityBtn);\r
126 \r
127   myView->setCellWidget(anId, 0, aVisibilityBtn);\r
128   myView->setItem(anId, 1, new QTableWidgetItem(theResult->data()->name().c_str()));\r
129 \r
130   if (anId == 1) {\r
131     myView->setColumnWidth(0, myView->verticalHeader()->defaultSectionSize());\r
132     myView->setColumnWidth(1, DEFAULT_NAME_COLUMN_WIDTH);\r
133   }\r
134 }\r
135 \r
136 void ModuleBase_WidgetConcealedObjects::onItemToggled(bool theState)\r
137 {\r
138   emit valuesChanged();\r
139   updateObject(myFeature);\r
140 }\r
141 \r
142 void ModuleBase_WidgetConcealedObjects::updateItemIcon(QToolButton* theButton)\r
143 {\r
144   bool isChecked = theButton->isChecked();\r
145   theButton->setIcon(isChecked ? QIcon(":icons/concealed_on.png")\r
146                                : QIcon(":icons/concealed_off.png"));\r
147   theButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);\r
148 }\r