X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetMultiSelector.cpp;h=409c2949b32815cc215f6140d6a7916066b788c2;hb=82e5b8212960f00bb388f60650cd464696ef464d;hp=80fb5cd9a6a7b4be46ad649e2dc0444bd6b8cdf2;hpb=7074394f8f08413d885f63be01df6bd5007b868c;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp index 80fb5cd9a..409c2949b 100755 --- a/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp +++ b/src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp @@ -58,6 +58,8 @@ const int ATTRIBUTE_SELECTION_INDEX_ROLE = Qt::UserRole + 1; +//#define DEBUG_UNDO_REDO + /** * Customization of a List Widget to make it to be placed on full width of container */ @@ -99,11 +101,27 @@ protected: #endif }; +#ifdef DEBUG_UNDO_REDO +void printHistoryInfo(const QString& theMethodName, int theCurrentHistoryIndex, + QList > > theSelectedHistoryValues) +{ + QStringList aSizes; + for (int i = 0; i < theSelectedHistoryValues.size(); i++) + aSizes.append(QString::number(theSelectedHistoryValues[i].size())); + + std::cout << theMethodName.toStdString() + << " current = " << theCurrentHistoryIndex + << " size(history) = " << theSelectedHistoryValues.size() + << " (" << aSizes.join(", ").toStdString() << ")" + << std::endl; +} +#endif + ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData) : ModuleBase_WidgetSelector(theParent, theWorkshop, theData), - myIsSetSelectionBlocked(false) + myIsSetSelectionBlocked(false), myCurrentHistoryIndex(-1) { QGridLayout* aMainLay = new QGridLayout(this); ModuleBase_Tools::adjustMargins(aMainLay); @@ -186,6 +204,8 @@ void ModuleBase_WidgetMultiSelector::activateCustom() myWorkshop->module()->activateCustomPrs(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects, true); + clearSelectedHistory(); + myWorkshop->updateCommandStatus(); } //******************************************************************** @@ -194,6 +214,8 @@ void ModuleBase_WidgetMultiSelector::deactivate() ModuleBase_WidgetSelector::deactivate(); myWorkshop->module()->deactivateCustomPrs(ModuleBase_IModule::CustomizeHighlightedObjects, true); + clearSelectedHistory(); + myWorkshop->updateCommandStatus(); } //******************************************************************** @@ -309,6 +331,63 @@ void ModuleBase_WidgetMultiSelector::getHighlighted(QList 0 + : (mySelectedHistoryValues.size() > 0 && + myCurrentHistoryIndex < mySelectedHistoryValues.size() - 1); + } + break; + default: + break; + } + return aCanProcess; +} + +//******************************************************************** +bool ModuleBase_WidgetMultiSelector::processAction(ModuleBase_ActionType theActionType) +{ + switch (theActionType) { + case ActionUndo: + case ActionRedo: { + if (theActionType == ActionUndo) + myCurrentHistoryIndex--; + else + myCurrentHistoryIndex++; + QList aSelected = mySelectedHistoryValues[myCurrentHistoryIndex]; + // equal vertices should not be used here + ModuleBase_ISelection::filterSelectionOnEqualPoints(aSelected); + bool isDone = setSelection(aSelected, + false /*need not validate because values already was in list*/); + updateOnSelectionChanged(isDone); + + myWorkshop->updateCommandStatus(); +#ifdef DEBUG_UNDO_REDO + printHistoryInfo(QString("processAction %1").arg(theActionType == ActionUndo ? "Undo" : "Redo"), + myCurrentHistoryIndex, mySelectedHistoryValues); +#endif + return true; + } + default: + return ModuleBase_ModelWidget::processAction(theActionType); + } +} + +//******************************************************************** +bool ModuleBase_WidgetMultiSelector::activateSelectionAndFilters(bool toActivate) +{ + myWorkshop->updateCommandStatus(); // update enable state of Undo/Redo application actions + return ModuleBase_WidgetSelector::activateSelectionAndFilters(toActivate); +} + //******************************************************************** bool ModuleBase_WidgetMultiSelector::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr& thePrs) { @@ -340,6 +419,8 @@ bool ModuleBase_WidgetMultiSelector::isValidSelectionCustom(const ModuleBase_Vie //******************************************************************** bool ModuleBase_WidgetMultiSelector::processDelete() { + appendFirstSelectionInHistory(); + // find attribute indices to delete std::set anAttributeIds; getSelectedAttributeIndices(anAttributeIds); @@ -392,6 +473,7 @@ bool ModuleBase_WidgetMultiSelector::processDelete() } } } + appendSelectionInHistory(); return aDone; } @@ -443,6 +525,8 @@ void ModuleBase_WidgetMultiSelector::onSelectionTypeChanged() // may be the feature's result is not displayed, but attributes should be myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeArguments, true); /// hope that something is redisplayed by object updated + // clear history should follow after set selected to do not increase history by setSelected + clearSelectedHistory(); } //******************************************************************** @@ -462,14 +546,53 @@ void ModuleBase_WidgetMultiSelector::onSelectionChanged() } } } + appendFirstSelectionInHistory(); ModuleBase_WidgetSelector::onSelectionChanged(); + appendSelectionInHistory(); +} + +void ModuleBase_WidgetMultiSelector::appendFirstSelectionInHistory() +{ + if (mySelectedHistoryValues.empty()) { + myCurrentHistoryIndex++; + mySelectedHistoryValues.append(getAttributeSelection()); + +#ifdef DEBUG_UNDO_REDO + printHistoryInfo("appendSelectionInHistory", myCurrentHistoryIndex, mySelectedHistoryValues); +#endif + } +} + +void ModuleBase_WidgetMultiSelector::appendSelectionInHistory() +{ + while (myCurrentHistoryIndex != mySelectedHistoryValues.count() - 1) + mySelectedHistoryValues.removeLast(); + + QList aSelected = getFilteredSelected(); + myCurrentHistoryIndex++; + mySelectedHistoryValues.append(aSelected); + myWorkshop->updateCommandStatus(); + +#ifdef DEBUG_UNDO_REDO + printHistoryInfo("appendSelectionInHistory", myCurrentHistoryIndex, mySelectedHistoryValues); +#endif +} + +void ModuleBase_WidgetMultiSelector::clearSelectedHistory() +{ + mySelectedHistoryValues.clear(); + myCurrentHistoryIndex = -1; + myWorkshop->updateCommandStatus(); + +#ifdef DEBUG_UNDO_REDO + printHistoryInfo("clearSelectedHistory", myCurrentHistoryIndex, mySelectedHistoryValues); +#endif } void ModuleBase_WidgetMultiSelector::updateFocus() { // 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); ModuleBase_Tools::setFocus(myListControl, "ModuleBase_WidgetMultiSelector::onSelectionTypeChanged()"); } @@ -745,7 +868,8 @@ bool ModuleBase_WidgetMultiSelector::removeUnusedAttributeObjects AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID()); for (int i = 0; i < aSelectionListAttr->size(); i++) { AttributeSelectionPtr anAttr = aSelectionListAttr->value(i); - bool aFound = findInSelection(anAttr->context(), anAttr->value(), aGeomSelection); + bool aFound = findInSelection(anAttr->context(), anAttr->value(), aGeomSelection, + myWorkshop); if (!aFound) anIndicesToBeRemoved.insert(i); } @@ -757,7 +881,8 @@ bool ModuleBase_WidgetMultiSelector::removeUnusedAttributeObjects for (int i = 0; i < aRefListAttr->size(); i++) { ObjectPtr anObject = aRefListAttr->object(i); if (anObject.get()) { - bool aFound = findInSelection(anObject, GeomShapePtr(), aGeomSelection); + bool aFound = findInSelection(anObject, GeomShapePtr(), aGeomSelection, + myWorkshop); if (!aFound) anIndicesToBeRemoved.insert(i); } @@ -787,7 +912,8 @@ bool ModuleBase_WidgetMultiSelector::removeUnusedAttributeObjects aFound = anAttributes.find(anAttribute) != anAttributes.end(); } else { - aFound = findInSelection(aRefAttrListAttr->object(i), GeomShapePtr(), aGeomSelection); + aFound = findInSelection(aRefAttrListAttr->object(i), GeomShapePtr(), aGeomSelection, + myWorkshop); } if (!aFound) anIndicesToBeRemoved.insert(i); @@ -826,11 +952,22 @@ std::map > ModuleBase_WidgetMultiSelector::con } bool ModuleBase_WidgetMultiSelector::findInSelection(const ObjectPtr& theObject, - const GeomShapePtr& theShape, - const std::map >& theGeomSelection) + GeomShapePtr theShape, + const std::map >& theGeomSelection, + ModuleBase_IWorkshop* theWorkshop) { + // issue #2154: we should not remove from list objects hidden in the viewer if selection + // was done with SHIFT button + if (theWorkshop->hasSHIFTPressed() && !theObject->isDisplayed()) + return true; + bool aFound = false; GeomShapePtr anEmptyShape(new GeomAPI_Shape()); + if (theShape.get()) { // treat shape equal to context as null: 2219, keep order of shapes in list + const ResultPtr aContext = std::dynamic_pointer_cast(theObject); + if (aContext.get() && aContext->shape()->isEqual(theShape)) + theShape.reset(); + } GeomShapePtr aShape = theShape.get() ? theShape : anEmptyShape; if (theGeomSelection.find(theObject) != theGeomSelection.end()) {// found const std::set& aShapes = theGeomSelection.at(theObject);