#include <ModuleBase_IViewer.h>
#include <ModuleBase_Tools.h>
#include <ModuleBase_Definitions.h>
+#include <ModuleBase_IModule.h>
#include <ModelAPI_Data.h>
#include <ModelAPI_Object.h>
#include <ModelAPI_AttributeSelectionList.h>
#include <ModelAPI_AttributeRefList.h>
+#include <ModelAPI_AttributeRefAttrList.h>
#include <Config_WidgetAPI.h>
#include <memory>
#include <string>
+const int ATTRIBUTE_SELECTION_INDEX_ROLE = Qt::UserRole + 1;
+
/**
* Customization of a List Widget to make it to be placed on full width of container
*/
/// Redefinition of virtual method
virtual QSize minimumSizeHint() const
{
- int aHeight = 2*QFontMetrics( font() ).height();
+ int aHeight = 4/*2*/*QFontMetrics( font() ).height();
QSize aSize = QListWidget::minimumSizeHint();
return QSize( aSize.width(), aHeight );
}
aMainLay->setColumnStretch(2, 1);
}
+ QString aToolTip = QString::fromStdString(theData->widgetTooltip());
myListControl = new CustomListWidget(this);
+ QString anObjName = QString::fromStdString(attributeID());
+ myListControl->setObjectName(anObjName);
+ myListControl->setToolTip(aToolTip);
+ myListControl->setSelectionMode(QAbstractItemView::ExtendedSelection);
+
aMainLay->addWidget(myListControl, 2, 0, 1, -1);
aMainLay->setRowStretch(2, 1);
//aMainLay->addWidget(new QLabel(this)); //FIXME(sbh)???
myCopyAction->setEnabled(false);
connect(myCopyAction, SIGNAL(triggered(bool)), SLOT(onCopyItem()));
myListControl->addAction(myCopyAction);
+
+ myDeleteAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this);
+ myDeleteAction->setEnabled(false);
+ connect(myDeleteAction, SIGNAL(triggered(bool)), SLOT(onDeleteItem()));
+ myListControl->addAction(myDeleteAction);
+
myListControl->setContextMenuPolicy(Qt::ActionsContextMenu);
connect(myListControl, SIGNAL(itemSelectionChanged()), SLOT(onListSelection()));
}
{
}
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::activateCustom()
+{
+ ModuleBase_WidgetSelector::activateCustom();
+
+ myWorkshop->module()->activateCustomPrs(myFeature,
+ ModuleBase_IModule::CustomizeHighlightedObjects, true);
+}
+
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::deactivate()
+{
+ ModuleBase_WidgetSelector::deactivate();
+
+ myWorkshop->module()->deactivateCustomPrs(ModuleBase_IModule::CustomizeHighlightedObjects, true);
+}
+
//********************************************************************
bool ModuleBase_WidgetMultiSelector::storeValueCustom() const
{
if (!myFeature)
return false;
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
- aSelectionListAttr->setSelectionType(myTypeCombo->currentText().toStdString());
- }
- return true;
+ AttributePtr anAttribute = myFeature->data()->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
+ aSelectionListAttr->setSelectionType(myTypeCombo->currentText().toStdString());
+ }
+ return true;
}
//********************************************************************
if (!myFeature)
return false;
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
+ AttributePtr anAttribute = myFeature->data()->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
// Restore shape type
- if (!aSelectionListAttr->selectionType().empty())
- setCurrentShapeType(ModuleBase_Tools::shapeType(aSelectionListAttr->selectionType().c_str()));
+ setCurrentShapeType(ModuleBase_Tools::shapeType(aSelectionListAttr->selectionType().c_str()));
}
updateSelectionList();
return true;
{
ModuleBase_WidgetValidated::storeAttributeValue();
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
+ AttributePtr anAttribute = myFeature->data()->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
mySelectionType = aSelectionListAttr->selectionType();
mySelectionCount = aSelectionListAttr->size();
}
- else {
- AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(anAttribute);
mySelectionCount = aRefListAttr->size();
}
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ AttributeRefAttrListPtr aRefAttrListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefAttrList>(anAttribute);
+ mySelectionCount = aRefAttrListAttr->size();
+ }
}
//********************************************************************
{
ModuleBase_WidgetValidated::restoreAttributeValue(theValid);
- // Store shape type
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
+ AttributePtr anAttribute = myFeature->data()->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
aSelectionListAttr->setSelectionType(mySelectionType);
// restore selection in the attribute. Indeed there is only one stored object
for (int i = 0; i < aCountAppened; i++)
aSelectionListAttr->removeLast();
}
- else {
- AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(anAttribute);
// restore objects in the attribute. Indeed there is only one stored object
int aCountAppened = aRefListAttr->size() - mySelectionCount;
for (int i = 0; i < aCountAppened; i++)
aRefListAttr->removeLast();
}
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ AttributeRefAttrListPtr aRefAttrListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefAttrList>(anAttribute);
+ // restore objects in the attribute. Indeed there is only one stored object
+ int aCountAppened = aRefAttrListAttr->size() - mySelectionCount;
+ for (int i = 0; i < aCountAppened; i++)
+ aRefAttrListAttr->removeLast();
+ }
}
//********************************************************************
void ModuleBase_WidgetMultiSelector::clearAttribute()
{
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get())
+ AttributePtr anAttribute = myFeature->data()->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
aSelectionListAttr->clear();
- else {
- AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
+ }
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(anAttribute);
aRefListAttr->clear();
}
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ AttributeRefAttrListPtr aRefAttrListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefAttrList>(anAttribute);
+ aRefAttrListAttr->clear();
+ }
}
//********************************************************************
void ModuleBase_WidgetMultiSelector::setObject(ObjectPtr theSelectedObject,
GeomShapePtr theShape)
{
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
+ AttributePtr anAttribute = myFeature->data()->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theSelectedObject);
aSelectionListAttr->append(aResult, theShape, myIsInValidate);
}
- else {
- AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(anAttribute);
aRefListAttr->append(theSelectedObject);
}
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ AttributeRefAttrListPtr aRefAttrListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefAttrList>(anAttribute);
+
+ AttributePtr anAttribute = myWorkshop->module()->findAttribute(theSelectedObject, theShape);
+ if (anAttribute.get())
+ aRefAttrListAttr->append(anAttribute);
+ else
+ aRefAttrListAttr->append(theSelectedObject);
+ }
}
//********************************************************************
return isDone;
}
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::getHighlighted(QList<ModuleBase_ViewerPrs>& theValues)
+{
+ std::set<int> anAttributeIds;
+ getSelectedAttributeIndices(anAttributeIds);
+ if (!anAttributeIds.empty())
+ convertIndicesToViewerSelection(anAttributeIds, theValues);
+}
+
//********************************************************************
bool ModuleBase_WidgetMultiSelector::isValidSelectionCustom(const ModuleBase_ViewerPrs& thePrs)
{
return aValid;
}
+//********************************************************************
+bool ModuleBase_WidgetMultiSelector::processDelete()
+{
+ // find attribute indices to delete
+ std::set<int> anAttributeIds;
+ getSelectedAttributeIndices(anAttributeIds);
+
+ // refill attribute by the items which indices are not in the list of ids
+ bool aDone = false;
+ AttributePtr anAttribute = myFeature->data()->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ aDone = !anAttributeIds.empty();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
+ aSelectionListAttr->remove(anAttributeIds);
+
+ }
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(anAttribute);
+ aRefListAttr->remove(anAttributeIds);
+ }
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ AttributeRefAttrListPtr aRefAttrListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefAttrList>(anAttribute);
+ aRefAttrListAttr->remove(anAttributeIds);
+ }
+
+ if (aDone) {
+ // update object is necessary to flush update signal. It leads to objects references map update
+ // and the operation presentation will not contain deleted items visualized as parameters of
+ // the feature.
+ updateObject(myFeature);
+
+ restoreValue();
+ myWorkshop->setSelected(getAttributeSelection());
+ }
+ return aDone;
+}
+
//********************************************************************
QList<QWidget*> ModuleBase_WidgetMultiSelector::getControls() const
{
// Set focus to List control in order to make possible
// to use Tab key for transfer the focus to next widgets
myListControl->setCurrentRow(myListControl->model()->rowCount() - 1);
- myListControl->setFocus();
+ ModuleBase_Tools::setFocus(myListControl,
+ "ModuleBase_WidgetMultiSelector::onSelectionTypeChanged()");
}
//********************************************************************
QList<ModuleBase_ViewerPrs> ModuleBase_WidgetMultiSelector::getAttributeSelection() const
{
QList<ModuleBase_ViewerPrs> aSelected;
- // Restore selection in the viewer by the attribute selection list
- if(myFeature) {
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
- for (int i = 0; i < aSelectionListAttr->size(); i++) {
- AttributeSelectionPtr anAttr = aSelectionListAttr->value(i);
- ResultPtr anObject = anAttr->context();
- if (anObject.get()) {
- TopoDS_Shape aShape;
- std::shared_ptr<GeomAPI_Shape> aShapePtr = anAttr->value();
- if (aShapePtr.get()) {
- aShape = aShapePtr->impl<TopoDS_Shape>();
- }
- aSelected.append(ModuleBase_ViewerPrs(anObject, aShape, NULL));
- }
- }
- }
- else {
- AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
- if (aRefListAttr.get()) {
- for (int i = 0; i < aRefListAttr->size(); i++) {
- ObjectPtr anObject = aRefListAttr->object(i);
- if (anObject.get()) {
- aSelected.append(ModuleBase_ViewerPrs(anObject, TopoDS_Shape(), NULL));
- }
- }
- }
- }
- }
+ convertIndicesToViewerSelection(std::set<int>(), aSelected);
return aSelected;
}
{
myListControl->clear();
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
+ AttributePtr anAttribute = myFeature->data()->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
for (int i = 0; i < aSelectionListAttr->size(); i++) {
AttributeSelectionPtr aAttr = aSelectionListAttr->value(i);
- myListControl->addItem(aAttr->namingName().c_str());
+ QListWidgetItem* anItem = new QListWidgetItem(aAttr->namingName().c_str(), myListControl);
+ anItem->setData(ATTRIBUTE_SELECTION_INDEX_ROLE, i);
+ myListControl->addItem(anItem);
}
}
- else {
- AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(anAttribute);
for (int i = 0; i < aRefListAttr->size(); i++) {
ObjectPtr anObject = aRefListAttr->object(i);
- if (anObject.get())
- myListControl->addItem(anObject->data()->name().c_str());
+ if (anObject.get()) {
+ QListWidgetItem* anItem = new QListWidgetItem(anObject->data()->name().c_str(),
+ myListControl);
+ anItem->setData(ATTRIBUTE_SELECTION_INDEX_ROLE, i);
+ myListControl->addItem(anItem);
+ }
}
}
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ AttributeRefAttrListPtr aRefAttrListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefAttrList>(anAttribute);
+ for (int i = 0; i < aRefAttrListAttr->size(); i++) {
+ AttributePtr anAttribute = aRefAttrListAttr->attribute(i);
+ QString aName;
+ if (anAttribute.get()) {
+ std::string anAttrName = generateName(anAttribute);
+ aName = QString::fromStdString(anAttrName);
+ }
+ else {
+ ObjectPtr anObject = aRefAttrListAttr->object(i);
+ if (anObject.get()) {
+ aName = anObject->data()->name().c_str();
+ }
+ }
+ QListWidgetItem* anItem = new QListWidgetItem(aName, myListControl);
+ anItem->setData(ATTRIBUTE_SELECTION_INDEX_ROLE, i);
+ myListControl->addItem(anItem);
+ }
+ }
+
// We have to call repaint because sometimes the List control is not updated
myListControl->repaint();
}
}
}
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::onDeleteItem()
+{
+ processDelete();
+}
+
//********************************************************************
void ModuleBase_WidgetMultiSelector::onListSelection()
{
QList<QListWidgetItem*> aItems = myListControl->selectedItems();
myCopyAction->setEnabled(!aItems.isEmpty());
+ myDeleteAction->setEnabled(!aItems.isEmpty());
+
+ myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects,
+ true);
+}
+
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::getSelectedAttributeIndices(std::set<int>& theAttributeIds)
+{
+ QList<QListWidgetItem*> aItems = myListControl->selectedItems();
+ foreach(QListWidgetItem* anItem, aItems) {
+ int anIndex = anItem->data(ATTRIBUTE_SELECTION_INDEX_ROLE).toInt();
+ if (theAttributeIds.find(anIndex) == theAttributeIds.end())
+ theAttributeIds.insert(anIndex);
+ }
+}
+
+void ModuleBase_WidgetMultiSelector::convertIndicesToViewerSelection(std::set<int> theAttributeIds,
+ QList<ModuleBase_ViewerPrs>& theValues) const
+{
+ if(myFeature.get() == NULL)
+ return;
+
+ AttributePtr anAttribute = myFeature->data()->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(anAttribute);
+ for (int i = 0; i < aSelectionListAttr->size(); i++) {
+ // filter by attribute indices only if the container is not empty otherwise return all items
+ if (!theAttributeIds.empty() && theAttributeIds.find(i) == theAttributeIds.end())
+ continue;
+ AttributeSelectionPtr anAttr = aSelectionListAttr->value(i);
+ ResultPtr anObject = anAttr->context();
+ if (anObject.get()) {
+ TopoDS_Shape aShape;
+ std::shared_ptr<GeomAPI_Shape> aShapePtr = anAttr->value();
+ if (aShapePtr.get()) {
+ aShape = aShapePtr->impl<TopoDS_Shape>();
+ }
+ theValues.append(ModuleBase_ViewerPrs(anObject, aShape, NULL));
+ }
+ }
+ }
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(anAttribute);
+ for (int i = 0; i < aRefListAttr->size(); i++) {
+ // filter by attribute indices only if the container is not empty otherwise return all items
+ if (!theAttributeIds.empty() && theAttributeIds.find(i) == theAttributeIds.end())
+ continue;
+ ObjectPtr anObject = aRefListAttr->object(i);
+ if (anObject.get()) {
+ theValues.append(ModuleBase_ViewerPrs(anObject, TopoDS_Shape(), NULL));
+ }
+ }
+ }
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ AttributeRefAttrListPtr aRefAttrListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeRefAttrList>(anAttribute);
+ for (int i = 0; i < aRefAttrListAttr->size(); i++) {
+ // filter by attribute indices only if the container is not empty otherwise return all items
+ if (!theAttributeIds.empty() && theAttributeIds.find(i) == theAttributeIds.end())
+ continue;
+ ObjectPtr anObject = aRefAttrListAttr->object(i);
+ if (!anObject.get())
+ continue;
+ TopoDS_Shape aShape;
+ AttributePtr anAttribute = aRefAttrListAttr->attribute(i);
+ if (anAttribute.get()) {
+ GeomShapePtr aGeomShape = myWorkshop->module()->findShape(anAttribute);
+ if (aGeomShape.get()) {
+ aShape = aGeomShape->impl<TopoDS_Shape>();
+ }
+ theValues.append(ModuleBase_ViewerPrs(anObject, aShape, NULL));
+ }
+ }
+ }
}