X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_WidgetPoint2dDistance.cpp;h=427efc273fe8dd552c6718d67ffc9d69317a31ed;hb=09dabb6acd9664f589a0bd9415d804d7a37ab801;hp=e8d24eb51421f612c0b514c7d61b8263a460a667;hpb=150ef68b3ea2df3c2130a4f5ea8128ddb5c76048;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_WidgetPoint2dDistance.cpp b/src/PartSet/PartSet_WidgetPoint2dDistance.cpp index e8d24eb51..427efc273 100644 --- a/src/PartSet/PartSet_WidgetPoint2dDistance.cpp +++ b/src/PartSet/PartSet_WidgetPoint2dDistance.cpp @@ -1,20 +1,22 @@ // Copyright (C) 2014-20xx CEA/DEN, EDF R&D -// File: PartSet_WidgetPoint2dDistance.h +// File: PartSet_WidgetPoint2dDistance.cpp // Created: 23 June 2014 // Author: Vitaly Smetannikov #include "PartSet_WidgetPoint2dDistance.h" #include "PartSet_Tools.h" +#include +#include +#include + #include +#include #include +#include #include - -#include -#include -#include -#include +#include #include #include @@ -26,28 +28,42 @@ #include PartSet_WidgetPoint2dDistance::PartSet_WidgetPoint2dDistance(QWidget* theParent, - const Config_WidgetAPI* theData, - const std::string& theParentId) - : ModuleBase_WidgetDoubleValue(theParent, theData, theParentId) + ModuleBase_IWorkshop* theWorkshop, + const Config_WidgetAPI* theData) +: ModuleBase_WidgetDoubleValue(theParent, theData), myWorkshop(theWorkshop), + myValueIsCashed(false), myIsFeatureVisibleInCash(true), myValueInCash(0) { myFirstPntName = theData->getProperty("first_point"); - - // Reconnect to local slot - disconnect(mySpinBox, SIGNAL(valueChanged(double)), this, SIGNAL(valuesChanged())); - connect(mySpinBox, SIGNAL(valueChanged(double)), this, SLOT(onValuesChanged())); + myWidgetValidator = new ModuleBase_WidgetValidator(this, myWorkshop); } PartSet_WidgetPoint2dDistance::~PartSet_WidgetPoint2dDistance() { } -void PartSet_WidgetPoint2dDistance::reset() +bool PartSet_WidgetPoint2dDistance::isValidSelectionCustom( + const std::shared_ptr& theValue) { - bool isOk; - double aDefValue = QString::fromStdString(getDefaultValue()).toDouble(&isOk); + return false; +} - ModuleBase_Tools::setSpinValue(mySpinBox, isOk ? aDefValue : 0.0); - storeValueCustom(); +bool PartSet_WidgetPoint2dDistance::resetCustom() +{ + bool aDone = false; + if (!isUseReset() || isComputedDefault() || mySpinBox->hasVariable()) { + aDone = false; + } + else { + if (myValueIsCashed) { + // if the restored value should be hidden, aDone = true to set + // reset state for the widget in the parent + aDone = restoreCurentValue(); + emit objectUpdated(); + } + else + aDone = ModuleBase_WidgetDoubleValue::resetCustom(); + } + return aDone; } void PartSet_WidgetPoint2dDistance::setPoint(FeaturePtr theFeature, @@ -59,20 +75,26 @@ void PartSet_WidgetPoint2dDistance::setPoint(FeaturePtr theFeature, if (!aPoint) return; - double aRadius = thePnt->distance(aPoint->pnt()); + double aValue = computeValue(aPoint->pnt(), thePnt); AttributeDoublePtr aReal = aData->real(attributeID()); - if (aReal && (aReal->value() != aRadius)) { - aReal->setValue(aRadius); + if (aReal && (aReal->value() != aValue)) { + aReal->setValue(aValue); - ModuleBase_Tools::setSpinValue(mySpinBox, aRadius); + ModuleBase_Tools::setSpinValue(mySpinBox, aValue); storeValue(); } } +double PartSet_WidgetPoint2dDistance::computeValue(const std::shared_ptr& theFirstPnt, + const std::shared_ptr& theCurrentPnt) +{ + return theCurrentPnt->distance(theFirstPnt); +} + void PartSet_WidgetPoint2dDistance::activateCustom() { - XGUI_ViewerProxy* aViewer = myWorkshop->viewer(); - connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)), + ModuleBase_IViewer* aViewer = myWorkshop->viewer(); + connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)), this, SLOT(onMouseMove(ModuleBase_IViewWindow*, QMouseEvent*))); connect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)), this, SLOT(onMouseRelease(ModuleBase_IViewWindow*, QMouseEvent*))); @@ -80,12 +102,12 @@ void PartSet_WidgetPoint2dDistance::activateCustom() void PartSet_WidgetPoint2dDistance::deactivate() { + ModuleBase_ModelWidget::deactivate(); ModuleBase_IViewer* aViewer = myWorkshop->viewer(); disconnect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)), this, SLOT(onMouseMove(ModuleBase_IViewWindow*, QMouseEvent*))); disconnect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)), this, SLOT(onMouseRelease(ModuleBase_IViewWindow*, QMouseEvent*))); - myWorkshop->operationMgr()->setLockValidating(false); } void PartSet_WidgetPoint2dDistance::onMouseRelease(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) @@ -94,6 +116,9 @@ void PartSet_WidgetPoint2dDistance::onMouseRelease(ModuleBase_IViewWindow* theWn if (theEvent->button() != Qt::LeftButton) return; + if (mySpinBox->hasVariable()) + return; + gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWnd->v3dView()); double aX, aY; @@ -101,13 +126,19 @@ void PartSet_WidgetPoint2dDistance::onMouseRelease(ModuleBase_IViewWindow* theWn std::shared_ptr aPnt = std::shared_ptr(new GeomAPI_Pnt2d(aX, aY)); setPoint(feature(), aPnt); - emit focusOutWidget(this); + + // if the validator of the control returns false, focus should not be switched + if (getError(false).isEmpty()) + emit focusOutWidget(this); } void PartSet_WidgetPoint2dDistance::onMouseMove(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent) { - myWorkshop->operationMgr()->setLockValidating(true); - myWorkshop->operationMgr()->setApplyEnabled(false); + if (isEditingMode()) + return; + + if (mySpinBox->hasVariable()) + return; gp_Pnt aPoint = PartSet_Tools::convertClickToPoint(theEvent->pos(), theWnd->v3dView()); @@ -115,12 +146,56 @@ void PartSet_WidgetPoint2dDistance::onMouseMove(ModuleBase_IViewWindow* theWnd, PartSet_Tools::convertTo2D(aPoint, mySketch, theWnd->v3dView(), aX, aY); std::shared_ptr aPnt = std::shared_ptr(new GeomAPI_Pnt2d(aX, aY)); + if (myState != ModifiedInViewer) + storeCurentValue(); + + bool isBlocked = blockValueState(true); setPoint(feature(), aPnt); + blockValueState(isBlocked); + setValueState(ModifiedInViewer); } -void PartSet_WidgetPoint2dDistance::onValuesChanged() +void PartSet_WidgetPoint2dDistance::storeCurentValue() { - myWorkshop->operationMgr()->setLockValidating(false); - emit valuesChanged(); + // do not use cash if a variable is used + if (mySpinBox->hasVariable()) + return; + + myValueIsCashed = true; + myIsFeatureVisibleInCash = XGUI_Displayer::isVisible( + XGUI_Tools::workshop(myWorkshop)->displayer(), myFeature); + myValueInCash = mySpinBox->value(); } +bool PartSet_WidgetPoint2dDistance::restoreCurentValue() +{ + bool aRestoredAndHidden = true; + + bool isVisible = myIsFeatureVisibleInCash; + // fill the control widgets by the cashed value + + myValueIsCashed = false; + myIsFeatureVisibleInCash = true; + ModuleBase_Tools::setSpinValue(mySpinBox, myValueInCash); + + // store value to the model + storeValueCustom(); + if (isVisible) { + setValueState(Stored); + aRestoredAndHidden = false; + } + else + aRestoredAndHidden = true; + + return aRestoredAndHidden; +} + +bool PartSet_WidgetPoint2dDistance::processEnter() +{ + bool isModified = getValueState() == ModifiedInPP; + if (isModified) { + emit valuesChanged(); + mySpinBox->selectAll(); + } + return isModified; +}