2 * ModuleBase_WidgetMultiSelector.cpp
4 * Created on: Aug 28, 2014
8 #include <ModuleBase_WidgetMultiSelector.h>
9 #include <ModuleBase_WidgetShapeSelector.h>
10 #include <ModuleBase_ISelection.h>
11 #include <ModuleBase_IWorkshop.h>
12 #include <ModuleBase_Tools.h>
14 #include <ModelAPI_Data.h>
15 #include <ModelAPI_Object.h>
16 #include <ModelAPI_AttributeSelectionList.h>
18 #include <Config_WidgetAPI.h>
20 #include <QGridLayout>
22 #include <QListWidget>
28 #include <boost/smart_ptr/shared_ptr.hpp>
31 ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParent,
32 ModuleBase_IWorkshop* theWorkshop,
33 const Config_WidgetAPI* theData,
34 const std::string& theParentId)
35 : ModuleBase_ModelWidget(theParent, theData, theParentId),
36 myWorkshop(theWorkshop), myIsActive(false), myUseSubShapes(false)
38 myMainWidget = new QWidget(theParent);
39 QGridLayout* aMainLay = new QGridLayout(myMainWidget);
40 ModuleBase_Tools::adjustMargins(aMainLay);
42 QLabel* aTypeLabel = new QLabel(tr("Type"), myMainWidget);
43 aMainLay->addWidget(aTypeLabel, 0, 0);
45 myTypeCombo = new QComboBox(myMainWidget);
46 // There is no sence to paramerize list of types while we can not parametrize selection mode
47 QString aTypesStr("Vertices Edges Faces Solids");
48 QStringList aShapeTypes = aTypesStr.split(' ');
49 myTypeCombo->addItems(aShapeTypes);
50 aMainLay->addWidget(myTypeCombo, 0, 1);
52 QLabel* aListLabel = new QLabel(tr("Selected objects:"), myMainWidget);
53 aMainLay->addWidget(aListLabel, 1, 0, 1, -1);
55 myListControl = new QListWidget(myMainWidget);
56 aMainLay->addWidget(myListControl, 2, 0, 2, -1);
57 aMainLay->setColumnStretch(1, 1);
58 myMainWidget->setLayout(aMainLay);
60 //TODO: Move into the base class
61 myUseSubShapes = theData->getBooleanAttribute("use_subshapes", false);
63 connect(myTypeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onSelectionTypeChanged()));
65 activateSelection(true);
68 ModuleBase_WidgetMultiSelector::~ModuleBase_WidgetMultiSelector()
70 activateSelection(false);
73 //********************************************************************
74 bool ModuleBase_WidgetMultiSelector::storeValue() const
76 // A rare case when plugin was not loaded.
79 DataPtr aData = myFeature->data();
80 AttributeSelectionListPtr aSelectionListAttr =
81 boost::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(aData->attribute(attributeID()));
83 if (aSelectionListAttr) {
84 aSelectionListAttr->clear();
86 TopAbs_ShapeEnum aCurrentType =
87 ModuleBase_WidgetShapeSelector::shapeType(myTypeCombo->currentText());
88 aSelectionListAttr->setSelectionType((int) aCurrentType);
89 // Store selection in the attribute
90 foreach (GeomSelection aSelec, mySelection) {
91 aSelectionListAttr->append(aSelec.first, aSelec.second);
93 updateObject(myFeature);
99 //********************************************************************
100 bool ModuleBase_WidgetMultiSelector::restoreValue()
102 // A rare case when plugin was not loaded.
105 DataPtr aData = myFeature->data();
106 AttributeSelectionListPtr aSelectionListAttr =
107 boost::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(aData->attribute(attributeID()));
109 if (aSelectionListAttr) {
111 // Restore shape type
112 TopAbs_ShapeEnum aShapeType = (TopAbs_ShapeEnum) aSelectionListAttr->selectionType();
113 setCurrentShapeType(aShapeType);
114 // Restore selection in the list
115 for (int i = 0; i < aSelectionListAttr->size(); i++) {
116 AttributeSelectionPtr aSelectAttr = aSelectionListAttr->value(i);
117 mySelection.append(GeomSelection(aSelectAttr->context(), aSelectAttr->value()));
119 updateSelectionList();
125 //********************************************************************
126 QWidget* ModuleBase_WidgetMultiSelector::getControl() const
131 //********************************************************************
132 QList<QWidget*> ModuleBase_WidgetMultiSelector::getControls() const
134 QList<QWidget*> result;
135 //result << myTypeCombo;
136 result << myListControl;
140 //********************************************************************
141 bool ModuleBase_WidgetMultiSelector::eventFilter(QObject* theObj, QEvent* theEvent)
143 //TODO: Remove maybe?
144 return ModuleBase_ModelWidget::eventFilter(theObj, theEvent);
147 //********************************************************************
148 void ModuleBase_WidgetMultiSelector::activateSelection(bool toActivate)
150 myIsActive = toActivate;
152 connect(myWorkshop, SIGNAL(selectionChanged()),
153 this, SLOT(onSelectionChanged()),
154 Qt::UniqueConnection);
155 activateShapeSelection();
157 disconnect(myWorkshop, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
158 myWorkshop->deactivateSubShapesSelection();
162 //********************************************************************
163 void ModuleBase_WidgetMultiSelector::onSelectionTypeChanged()
165 activateShapeSelection();
166 QList<ObjectPtr> anEmptyList;
167 myWorkshop->setSelected(anEmptyList);
168 // Clear mySelection, myListControl and storeValue()
169 onSelectionChanged();
172 //********************************************************************
173 void ModuleBase_WidgetMultiSelector::onSelectionChanged()
175 ModuleBase_ISelection* aSelection = myWorkshop->selection();
176 NCollection_List<TopoDS_Shape> aSelectedShapes; //, aFilteredShapes;
177 std::list<ObjectPtr> aOwnersList;
178 aSelection->selectedShapes(aSelectedShapes, aOwnersList);
181 std::list<ObjectPtr>::const_iterator aIt;
182 NCollection_List<TopoDS_Shape>::Iterator aShpIt(aSelectedShapes);
184 for (aIt = aOwnersList.cbegin(); aIt != aOwnersList.cend(); aShpIt.Next(), aIt++) {
185 ResultPtr aResult = boost::dynamic_pointer_cast<ModelAPI_Result>(*aIt);
187 // We can not select a result of our feature
188 const std::list<ResultPtr>& aResList = myFeature->results();
189 std::list<ResultPtr>::const_iterator aIt;
190 bool isSkipSelf = false;
191 for (aIt = aResList.cbegin(); aIt != aResList.cend(); ++aIt) {
192 if ((*aIt) == aResult) {
200 aShape = boost::shared_ptr<GeomAPI_Shape>(new GeomAPI_Shape());
201 aShape->setImpl(new TopoDS_Shape(aShpIt.Value()));
202 mySelection.append(GeomSelection(aResult, aShape));
204 updateSelectionList();
205 emit valuesChanged();
208 //********************************************************************
209 void ModuleBase_WidgetMultiSelector::filterShapes(const NCollection_List<TopoDS_Shape>& theShapesToFilter,
210 NCollection_List<TopoDS_Shape>& theResult)
212 if(myTypeCombo->count() == 0 || theShapesToFilter.IsEmpty())
214 TopAbs_ShapeEnum aReferenceType =
215 ModuleBase_WidgetShapeSelector::shapeType(myTypeCombo->currentText());
216 NCollection_List<TopoDS_Shape>::Iterator anIter(theShapesToFilter);
217 for (; anIter.More(); anIter.Next()) {
218 TopoDS_Shape aShape = anIter.Value();
219 if (aShape.IsNull() || aShape.ShapeType() != aReferenceType)
221 theResult.Append(aShape);
225 //********************************************************************
226 void ModuleBase_WidgetMultiSelector::setCurrentShapeType(const TopAbs_ShapeEnum theShapeType)
228 QString aShapeTypeName;
230 for (int idx = 0; idx < myTypeCombo->count(); ++idx) {
231 aShapeTypeName = myTypeCombo->itemText(idx);
232 TopAbs_ShapeEnum aRefType = ModuleBase_WidgetShapeSelector::shapeType(aShapeTypeName);
233 if(aRefType == theShapeType && idx != myTypeCombo->currentIndex()) {
234 activateSelection(false);
235 bool isBlocked = myTypeCombo->blockSignals(true);
236 myTypeCombo->setCurrentIndex(idx);
237 myTypeCombo->blockSignals(isBlocked);
238 activateSelection(true);
244 void ModuleBase_WidgetMultiSelector::activateShapeSelection()
246 QString aNewType = myTypeCombo->currentText();
248 aList.append(ModuleBase_WidgetShapeSelector::shapeType(aNewType));
249 myWorkshop->activateSubShapesSelection(aList);
252 //********************************************************************
253 void ModuleBase_WidgetMultiSelector::updateSelectionList()
256 if (myTypeCombo->currentText().toLower() == "vertices")
258 else if (myTypeCombo->currentText().toLower() == "edges")
260 else if (myTypeCombo->currentText().toLower() == "faces")
262 else if (myTypeCombo->currentText().toLower() == "solids")
265 myListControl->clear();
267 foreach (GeomSelection aSel, mySelection) {
268 QString aName(aSel.first->data()->name().c_str());
269 aName += ":" + aType + QString("_%1").arg(i);
270 myListControl->addItem(aName);
273 myListControl->repaint();