#include "PartSet_WidgetPoint2dDistance.h"
#include "PartSet_Tools.h"
#include "PartSet_WidgetSketchLabel.h"
+#include "PartSet_WidgetEditor.h"
#include <XGUI_ModuleConnector.h>
#include <XGUI_Displayer.h>
//#include <AIS_DimensionSelectionMode.hxx>
#include <AIS_Shape.hxx>
+#include <AIS_Dimension.hxx>
#include <ModelAPI_Events.h>
#include <ModelAPI_Session.h>
#include <QMouseEvent>
#include <QApplication>
+#include <QCursor>
//#define DEBUG_DO_NOT_BY_ENTER
+//#define DEBUG_CURSOR
+
/// Returns list of unique objects by sum of objects from List1 and List2
/*QList<ModuleBase_ViewerPrs> getSumList(const QList<ModuleBase_ViewerPrs>& theList1,
const QList<ModuleBase_ViewerPrs>& theList2)
return;
#endif
+ if (canChangeCursor(getCurrentOperation())) {
+ QCursor* aCurrentCursor = QApplication::overrideCursor();
+ if (!aCurrentCursor || aCurrentCursor->shape() != Qt::CrossCursor) {
+ QApplication::setOverrideCursor(QCursor(Qt::CrossCursor));
+#ifdef DEBUG_CURSOR
+ qDebug("onEnterViewPort() : Qt::CrossCursor");
+#endif
+ }
+ }
+
if (!isNestedCreateOperation(getCurrentOperation()))
return;
- QApplication::setOverrideCursor(QCursor(Qt::CrossCursor));//QIcon(":pictures/button_plus.png").pixmap(20,20)));
-
operationMgr()->onValidateOperation();
// we need change displayed state of the current operation feature
return;
#endif
+ if (canChangeCursor(getCurrentOperation())) {
+ QApplication::restoreOverrideCursor();
+#ifdef DEBUG_CURSOR
+ qDebug("onLeaveViewPort() : None");
+#endif
+ }
+
if (!isNestedCreateOperation(getCurrentOperation()))
return;
- QApplication::restoreOverrideCursor();
-
// the method should be performed if the popup menu is called,
// the reset of the current widget should not happen
if (myIsPopupMenuActive)
ModuleBase_ModelWidget* anActiveWidget = getActiveWidget();
if (anActiveWidget)
anActiveWidget->reset();
- aDisplayer->enableUpdateViewer(isEnableUpdateViewer);
// hides the presentation of the current operation feature
// the feature is to be erased here, but it is correct to call canDisplayObject because
FeaturePtr aFeature = aFOperation->feature();
visualizeFeature(aFeature, aFOperation->isEditOperation(), canDisplayObject(aFeature));
}
+ // we should update viewer after the presentation are hidden in the viewer
+ // otherwise the reset presentation(line) appears in the viewer(by quick move from viewer to PP)
+ aDisplayer->enableUpdateViewer(isEnableUpdateViewer);
}
void PartSet_SketcherMgr::onBeforeValuesChangedInPropertyPanel()
{
- if (isNestedCreateOperation(getCurrentOperation()))
+ if (!isNestedEditOperation(getCurrentOperation()) ||
+ myModule->sketchReentranceMgr()->isInternalEditActive())
return;
// it is necessary to save current selection in order to restore it after the values are modifed
storeSelection();
void PartSet_SketcherMgr::onAfterValuesChangedInPropertyPanel()
{
- if (isNestedCreateOperation(getCurrentOperation()))
+ if (!isNestedEditOperation(getCurrentOperation()) ||
+ myModule->sketchReentranceMgr()->isInternalEditActive())
return;
// it is necessary to restore current selection in order to restore it after the values are modified
restoreSelection();
if (myModule->sketchReentranceMgr()->processMousePressed(theWnd, theEvent))
return;
- get2dPoint(theWnd, theEvent, myClickedPoint);
+ //get2dPoint(theWnd, theEvent, myClickedPoint);
if (!(theEvent->buttons() & Qt::LeftButton))
return;
// TODO: Has to be uncommented when SALOME patch on draw mode become avialable
myPreviousDrawModeEnabled = aViewer->enableDrawMode(false);
+ // this is temporary commented in order to avoid the following wrong case:
+ // Distance constraint is under edition, double click on the digit -> nothing happens
+ // because QApplication::processEvents() calls onMouseDoubleClick, which try to show editor
+ // but as the prev edit is commited an new one is not started, editor is not shown.
// This is necessary in order to finalize previous operation
- QApplication::processEvents();
+ //QApplication::processEvents();
launchEditing();
}
}
ModuleBase_Operation* aOp = getCurrentOperation();
if (aOp) {
if (isNestedSketchOperation(aOp)) {
- get2dPoint(theWnd, theEvent, myClickedPoint);
+ //get2dPoint(theWnd, theEvent, myClickedPoint);
// Only for sketcher operations
if (myIsDragging) {
}
}
- myClickedPoint.clear();
+ //myClickedPoint.clear();
if (myIsDragging) {
// 1. the current selection is saved in the mouse press method in order to restore it after moving
// Find corresponded widget to activate value editing
foreach (ModuleBase_ModelWidget* aWgt, aWidgets) {
if (aWgt->attributeID() == "ConstraintValue") {
- aWgt->focusTo();
+ PartSet_WidgetEditor* anEditor = dynamic_cast<PartSet_WidgetEditor*>(aWgt);
+ if (anEditor)
+ anEditor->showPopupEditor();
return;
}
}
XGUI_PropertyPanel* aPropertyPanel = aWorkshop->propertyPanel();
if (aPropertyPanel) {
- connect(aPropertyPanel, SIGNAL(beforeWidgetActivated(ModuleBase_ModelWidget*)),
- this, SLOT(onBeforeWidgetActivated(ModuleBase_ModelWidget*)));
+ //connect(aPropertyPanel, SIGNAL(beforeWidgetActivated(ModuleBase_ModelWidget*)),
+ // this, SLOT(onBeforeWidgetActivated(ModuleBase_ModelWidget*)));
connect(aPropertyPanel, SIGNAL(noMoreWidgets(const std::string&)),
aReentranceMgr, SLOT(onNoMoreWidgets(const std::string&)));
connect(aContextMenuMgr, SIGNAL(afterContextMenu()), this, SLOT(onAfterContextMenu()));
}
-void PartSet_SketcherMgr::onBeforeWidgetActivated(ModuleBase_ModelWidget* theWidget)
-{
- if (!myClickedPoint.myIsInitialized)
- return;
+//void PartSet_SketcherMgr::onBeforeWidgetActivated(ModuleBase_ModelWidget* theWidget)
+//{
+ //if (!myClickedPoint.myIsInitialized)
+ // return;
- ModuleBase_Operation* aOperation = getCurrentOperation();
+ //ModuleBase_Operation* aOperation = getCurrentOperation();
// the distance constraint feature should not use the clickedd point
// this is workaround in order to don't throw down the flyout point value,
// set by execute() method of these type of features
- if (isDistanceOperation(aOperation))
- return;
+ //if (isDistanceOperation(aOperation))
+ // return;
- PartSet_WidgetPoint2D* aPnt2dWgt = dynamic_cast<PartSet_WidgetPoint2D*>(theWidget);
- if (aPnt2dWgt) {
- aPnt2dWgt->setPoint(myClickedPoint.myCurX, myClickedPoint.myCurY);
- }
-}
+ //PartSet_WidgetPoint2D* aPnt2dWgt = dynamic_cast<PartSet_WidgetPoint2D*>(theWidget);
+ //if (aPnt2dWgt) {
+ // aPnt2dWgt->setPoint(myClickedPoint.myCurX, myClickedPoint.myCurY);
+ //}
+//}
void PartSet_SketcherMgr::onBeforeContextMenu()
{
return anError;
}
-QString PartSet_SketcherMgr::getFeatureError(const FeaturePtr& theFeature, const bool isCheckGUI)
+QString PartSet_SketcherMgr::getFeatureError(const FeaturePtr& theFeature)
{
QString anError = "";
if (!theFeature.get() || !theFeature->data()->isValid())
AttributeStringPtr aAttributeString = aSketch->string(SketchPlugin_Sketch::SOLVER_ERROR());
anError = aAttributeString->value().c_str();
}
- else {
- ModuleBase_ModelWidget* anActiveWidget = getActiveWidget();
- if (isCheckGUI && anActiveWidget) {
- ModuleBase_ModelWidget::ValueState aState = anActiveWidget->getValueState();
- if (aState != ModuleBase_ModelWidget::Stored) {
- AttributePtr anAttr = anActiveWidget->feature()->attribute(anActiveWidget->attributeID());
- if (anAttr.get()) {
- QString anAttributeName = anAttr->id().c_str();
- switch (aState) {
- case ModuleBase_ModelWidget::ModifiedInPP:
- anError = "Attribute \"" + anAttributeName +
- "\" modification is not applyed. Please click \"Enter\" or \"Tab\".";
- break;
- case ModuleBase_ModelWidget::ModifiedInViewer:
- anError = "Attribute \"" + anAttributeName +
- "\" is locked by modification value in the viewer.";
- break;
- case ModuleBase_ModelWidget::Reset:
- anError = "Attribute \"" + anAttributeName + "\" is not initialized.";
- break;
- }
- }
- }
- }
- }
return anError;
}
+void PartSet_SketcherMgr::clearClickedFlags()
+{
+ //myClickedPoint.clear();
+ myCurrentPoint.clear();
+}
+
const QStringList& PartSet_SketcherMgr::sketchOperationIdList()
{
static QStringList aIds;
return aFOperation && !aFOperation->isEditOperation() && isNestedSketchOperation(aFOperation);
}
+bool PartSet_SketcherMgr::isNestedEditOperation(ModuleBase_Operation* theOperation)
+{
+ ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
+ (theOperation);
+ return aFOperation && aFOperation->isEditOperation() && isNestedSketchOperation(aFOperation);
+}
+
bool PartSet_SketcherMgr::isEntity(const std::string& theId)
{
return (theId == SketchPlugin_Line::ID()) ||
// Display all sketcher sub-Objects
myCurrentSketch = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(aFOperation->feature());
XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(myModule->workshop());
+ aConnector->workshop()->displayer()->activateTrihedron(true);
// Hide sketcher result
std::list<ResultPtr> aResults = myCurrentSketch->results();
}
// restore the module selection modes, which were changed on startSketch
aConnector->activateModuleSelectionModes();
+ aConnector->workshop()->displayer()->activateTrihedron(false);
}
void PartSet_SketcherMgr::startNestedSketch(ModuleBase_Operation* theOperation)
{
- if (isNestedCreateOperation(theOperation) && myIsMouseOverWindow)
- QApplication::setOverrideCursor(QCursor(Qt::CrossCursor));//QIcon(":pictures/button_plus.png").pixmap(20,20)));
+ if (canChangeCursor(theOperation) && myIsMouseOverWindow) {
+ QCursor* aCurrentCursor = QApplication::overrideCursor();
+ if (!aCurrentCursor || aCurrentCursor->shape() != Qt::CrossCursor) {
+ QApplication::setOverrideCursor(QCursor(Qt::CrossCursor));
+#ifdef DEBUG_CURSOR
+ qDebug("startNestedSketch() : Qt::CrossCursor");
+#endif
+ }
+ }
}
-void PartSet_SketcherMgr::stopNestedSketch(ModuleBase_Operation* theOp)
+void PartSet_SketcherMgr::stopNestedSketch(ModuleBase_Operation* theOperation)
{
myIsMouseOverViewProcessed = true;
operationMgr()->onValidateOperation();
- if (isNestedCreateOperation(theOp) || myModule->sketchReentranceMgr()->isInternalEditActive())
+ if (canChangeCursor(theOperation)) {
QApplication::restoreOverrideCursor();
+#ifdef DEBUG_CURSOR
+ qDebug("stopNestedSketch() : None");
+#endif
+ }
}
void PartSet_SketcherMgr::commitNestedSketch(ModuleBase_Operation* theOperation)
}
}
+void PartSet_SketcherMgr::operationActivatedByPreselection()
+{
+ ModuleBase_Operation* anOperation = getCurrentOperation();
+ if(anOperation && PartSet_SketcherMgr::isNestedSketchOperation(anOperation)) {
+ // Set final definitions if they are necessary
+ //propertyPanelDefined(aOperation);
+ /// Commit sketcher operations automatically
+ ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
+ (anOperation);
+ if (aFOperation) {
+ if (PartSet_SketcherMgr::isDistanceOperation(aFOperation)) {
+ FeaturePtr aFeature = aFOperation->feature();
+ // editor is shown only if all attribute references are filled by preseletion
+ bool anAllRefAttrInitialized = true;
+
+ std::list<AttributePtr> aRefAttrs = aFeature->data()->attributes(
+ ModelAPI_AttributeRefAttr::typeId());
+ std::list<AttributePtr>::const_iterator anIt = aRefAttrs.begin(), aLast = aRefAttrs.end();
+ for (; anIt != aLast && anAllRefAttrInitialized; anIt++) {
+ anAllRefAttrInitialized = (*anIt)->isInitialized();
+ }
+ if (anAllRefAttrInitialized) {
+ // Activate dimension value editing on double click
+ ModuleBase_IPropertyPanel* aPanel = aFOperation->propertyPanel();
+ QList<ModuleBase_ModelWidget*> aWidgets = aPanel->modelWidgets();
+ // Find corresponded widget to activate value editing
+ foreach (ModuleBase_ModelWidget* aWgt, aWidgets) {
+ if (aWgt->attributeID() == "ConstraintValue") {
+ // the featue should be displayed in order to find the AIS text position,
+ // the place where the editor will be shown
+ aFeature->setDisplayed(true);
+ /// the execute is necessary to perform in the feature compute for flyout position
+ aFeature->execute();
+
+ Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
+ Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
+
+ PartSet_WidgetEditor* anEditor = dynamic_cast<PartSet_WidgetEditor*>(aWgt);
+ if (anEditor) {
+ int aX = 0, anY = 0;
+
+ ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
+ XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(aWorkshop);
+ XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer();
+ AISObjectPtr anAIS = aDisplayer->getAISObject(aFeature);
+ Handle(AIS_InteractiveObject) anAISIO;
+ if (anAIS.get() != NULL) {
+ anAISIO = anAIS->impl<Handle(AIS_InteractiveObject)>();
+ }
+ if (anAIS.get() != NULL) {
+ Handle(AIS_InteractiveObject) anAISIO = anAIS->impl<Handle(AIS_InteractiveObject)>();
+
+ if (!anAISIO.IsNull()) {
+ Handle(AIS_Dimension) aDim = Handle(AIS_Dimension)::DownCast(anAISIO);
+ if (!aDim.IsNull()) {
+ gp_Pnt aPosition = aDim->GetTextPosition();
+
+ ModuleBase_IViewer* aViewer = aWorkshop->viewer();
+ Handle(V3d_View) aView = aViewer->activeView();
+ int aCX, aCY;
+ aView->Convert(aPosition.X(), aPosition.Y(), aPosition.Z(), aCX, aCY);
+
+ QWidget* aViewPort = aViewer->activeViewPort();
+ QPoint aGlPoint = aViewPort->mapToGlobal(QPoint(aCX, aCY));
+ aX = aGlPoint.x();
+ anY = aGlPoint.y();
+ }
+ }
+ anEditor->setCursorPosition(aX, anY);
+ anEditor->showPopupEditor(false);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ anOperation->commit();
+ }
+}
+
bool PartSet_SketcherMgr::canUndo() const
{
return isNestedCreateOperation(getCurrentOperation());
return aCanDisplay;
}
+bool PartSet_SketcherMgr::canChangeCursor(ModuleBase_Operation* theOperation) const
+{
+ return isNestedCreateOperation(theOperation) ||
+ myModule->sketchReentranceMgr()->isInternalEditActive();
+}
+
bool PartSet_SketcherMgr::isObjectOfSketch(const ObjectPtr& theObject) const
{
bool isFoundObject = false;
return aWorkshop->operationMgr();
}
+