#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 <QMouseEvent>
#include <QApplication>
+#include <QCursor>
//#define DEBUG_DO_NOT_BY_ENTER
-//#define DEBUG_MOUSE_OVER_WINDOW_FLAGS
+
+//#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,
PartSet_SketcherMgr::PartSet_SketcherMgr(PartSet_Module* theModule)
: QObject(theModule), myModule(theModule), myIsDragging(false), myDragDone(false),
- myIsResetCurrentValue(false), myIsMouseOverWindow(false),
+ myIsMouseOverWindow(false),
myIsMouseOverViewProcessed(true), myPreviousUpdateViewerEnabled(true),
myIsPopupMenuActive(false), myIsConstraintsShown(true)
{
// the mouse move and use the cursor position to update own values. If the presentaion is
// redisplayed before this update, the feature presentation jumps from reset value to current.
myIsMouseOverWindow = true;
- myIsResetCurrentValue = false;
- // it is important to validate operation here only if sketch entity create operation is active
- // because at this operation we reacts to the mouse leave/enter view port
- //operationMgr()->onValidateOperation();
-#ifdef DEBUG_MOUSE_OVER_WINDOW_FLAGS
- qDebug(QString("onEnterViewPort: %1").arg(mouseOverWindowFlagsInfo()).toStdString().c_str());
-#endif
#ifdef DEBUG_DO_NOT_BY_ENTER
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
// it is important to validate operation here only if sketch entity create operation is active
// because at this operation we reacts to the mouse leave/enter view port
//operationMgr()->onValidateOperation();
-#ifdef DEBUG_MOUSE_OVER_WINDOW_FLAGS
- qDebug(QString("onLeaveViewPort: %1").arg(mouseOverWindowFlagsInfo()).toStdString().c_str());
-#endif
#ifdef DEBUG_DO_NOT_BY_ENTER
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)
// disable the viewer update in order to avoid visualization of redisplayed feature in viewer
// obtained after reset value
bool isEnableUpdateViewer = aDisplayer->enableUpdateViewer(false);
- ModuleBase_Operation* aOperation = getCurrentOperation();
- ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
- ModuleBase_ModelWidget* aActiveWgt = aPanel->activeWidget();
- if (aActiveWgt && aActiveWgt->reset()) {
- myIsResetCurrentValue = true;
- }
- aDisplayer->enableUpdateViewer(isEnableUpdateViewer);
+ ModuleBase_ModelWidget* anActiveWidget = getActiveWidget();
+ if (anActiveWidget)
+ anActiveWidget->reset();
// 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()
{
- myIsResetCurrentValue = false;
-
- 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();
aDisplayer->updateViewer();
}
-void PartSet_SketcherMgr::onValuesChangedInPropertyPanel()
+void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
{
- if (!isNestedCreateOperation(getCurrentOperation()))
+ if (myModule->sketchReentranceMgr()->processMousePressed(theWnd, theEvent))
return;
- // visualize the current operation feature
- //myIsResetCurrentValue = false;
- operationMgr()->onValidateOperation();
- // the feature is to be erased here, but it is correct to call canDisplayObject because
- // there can be additional check (e.g. editor widget in distance constraint)
- ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
- (getCurrentOperation());
- if (aFOperation) {
- FeaturePtr aFeature = aFOperation->feature();
- visualizeFeature(aFeature, aFOperation->isEditOperation(), canDisplayObject(aFeature));
- }
-}
-
-void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
-{
get2dPoint(theWnd, theEvent, myClickedPoint);
if (!(theEvent->buttons() & Qt::LeftButton))
return;
- if (myModule->sketchReentranceMgr()->processMousePressed())
- return;
-
// Clear dragging mode
myIsDragging = false;
return;
if (aFOperation->isEditOperation()) {
- ModuleBase_IPropertyPanel* aPanel = aFOperation->propertyPanel();
- ModuleBase_ModelWidget* aActiveWgt = aPanel->activeWidget();
// If the current widget is a selector, do nothing, it processes the mouse press
- if(aActiveWgt && aActiveWgt->isViewerSelector()) {
+ ModuleBase_ModelWidget* anActiveWidget = getActiveWidget();
+ if(anActiveWidget && anActiveWidget->isViewerSelector()) {
return;
}
}
void PartSet_SketcherMgr::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
{
- if (myModule->sketchReentranceMgr()->processMouseReleased())
+ if (myModule->sketchReentranceMgr()->processMouseReleased(theWnd, theEvent))
return;
ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
void PartSet_SketcherMgr::onMouseMoved(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
{
- if (myModule->sketchReentranceMgr()->processMouseMoved())
+ if (myModule->sketchReentranceMgr()->processMouseMoved(theWnd, theEvent))
return;
if (isNestedCreateOperation(getCurrentOperation()) && !myIsMouseOverViewProcessed) {
myIsMouseOverViewProcessed = true;
// 1. perform the widget mouse move functionality and display the presentation
- ModuleBase_Operation* aOperation = getCurrentOperation();
- ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
- ModuleBase_ModelWidget* anActiveWdg = aPanel->activeWidget();
// the mouse move should be processed in the widget, if it can in order to visualize correct
// presentation. These widgets correct the feature attribute according to the mouse position
- PartSet_WidgetPoint2D* aPoint2DWdg = dynamic_cast<PartSet_WidgetPoint2D*>(anActiveWdg);
+ ModuleBase_ModelWidget* anActiveWidget = getActiveWidget();
+ PartSet_WidgetPoint2D* aPoint2DWdg = dynamic_cast<PartSet_WidgetPoint2D*>(anActiveWidget);
if (aPoint2DWdg) {
aPoint2DWdg->onMouseMove(theWnd, theEvent);
}
PartSet_WidgetPoint2dDistance* aDistanceWdg = dynamic_cast<PartSet_WidgetPoint2dDistance*>
- (anActiveWdg);
+ (anActiveWidget);
if (aDistanceWdg) {
aDistanceWdg->onMouseMove(theWnd, theEvent);
}
// 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;
}
}
ModuleBase_IWorkshop* anIWorkshop = myModule->workshop();
XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(anIWorkshop);
XGUI_Workshop* aWorkshop = aConnector->workshop();
+ PartSet_SketcherReetntrantMgr* aReentranceMgr = myModule->sketchReentranceMgr();
+
XGUI_PropertyPanel* aPropertyPanel = aWorkshop->propertyPanel();
if (aPropertyPanel) {
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(aPropertyPanel, SIGNAL(widgetActivated(ModuleBase_ModelWidget*)),
+ aReentranceMgr, SLOT(onWidgetActivated()));
}
XGUI_ViewerProxy* aViewerProxy = aWorkshop->viewer();
AttributeStringPtr aAttributeString = aSketch->string(SketchPlugin_Sketch::SOLVER_ERROR());
anError = aAttributeString->value().c_str();
}
- else if (myIsResetCurrentValue) { // this flag do not allow commit of the current operation
- ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
- (getCurrentOperation());
- if (aFOperation) {
- FeaturePtr aFeature = aFOperation->feature();
- if (aFeature.get() && aFeature == theFeature && isNestedCreateOperation(aFOperation)) {
- QString anAttributeName = "";
- ModuleBase_IPropertyPanel* aPanel = aFOperation->propertyPanel();
- ModuleBase_ModelWidget* anActiveWgt = aPanel->activeWidget();
- if (anActiveWgt) {
- AttributePtr anAttr = aFeature->attribute(anActiveWgt->attributeID());
- if (anAttr.get())
- anAttributeName = anAttr->id().c_str();
- }
- anError = "Attribute \"" + anAttributeName + "\" is not initialized.";
- }
- }
- }
return anError;
}
+void PartSet_SketcherMgr::clearClickedFlags()
+{
+ return;
+ 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();
{
myIsMouseOverWindow = false;
myIsConstraintsShown = true;
-#ifdef DEBUG_MOUSE_OVER_WINDOW_FLAGS
- qDebug(QString("stopSketch: %1").arg(mouseOverWindowFlagsInfo()).toStdString().c_str());
-#endif
+
XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(myModule->workshop());
DataPtr aData = myCurrentSketch->data();
}
// restore the module selection modes, which were changed on startSketch
aConnector->activateModuleSelectionModes();
+ aConnector->workshop()->displayer()->activateTrihedron(false);
}
void PartSet_SketcherMgr::startNestedSketch(ModuleBase_Operation* theOperation)
{
- connectToPropertyPanel(true);
- 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)
{
- connectToPropertyPanel(false);
- myIsResetCurrentValue = false;
myIsMouseOverViewProcessed = true;
operationMgr()->onValidateOperation();
- if (isNestedCreateOperation(theOp))
+ if (canChangeCursor(theOperation)) {
QApplication::restoreOverrideCursor();
+#ifdef DEBUG_CURSOR
+ qDebug("stopNestedSketch() : None");
+#endif
+ }
}
void PartSet_SketcherMgr::commitNestedSketch(ModuleBase_Operation* theOperation)
return isNestedCreateOperation(getCurrentOperation());
}
-bool PartSet_SketcherMgr::canCommitOperation() const
-{
- bool aCanCommit = true;
-
- if (isNestedCreateOperation(getCurrentOperation()) && myIsResetCurrentValue)
- aCanCommit = false;
-
- return aCanCommit;
-}
-
bool PartSet_SketcherMgr::canEraseObject(const ObjectPtr& theObject) const
{
bool aCanErase = true;
// c. widget editor control
#ifndef DEBUG_DO_NOT_BY_ENTER
if (aCanDisplay && isNestedCreateOperation(getCurrentOperation())) {
- ModuleBase_Operation* aOperation = getCurrentOperation();
- ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel();
- ModuleBase_ModelWidget* anActiveWdg = aPanel ? aPanel->activeWidget() : 0;
- ModuleBase_WidgetEditor* anEditorWdg = anActiveWdg ? dynamic_cast<ModuleBase_WidgetEditor*>(anActiveWdg) : 0;
+ ModuleBase_ModelWidget* anActiveWidget = getActiveWidget();
+ ModuleBase_WidgetEditor* anEditorWdg = anActiveWidget ? dynamic_cast<ModuleBase_WidgetEditor*>(anActiveWidget) : 0;
// the active widget editor should not influence here. The presentation should be visible always
// when this widget is active.
if (!anEditorWdg && !myIsPopupMenuActive) {
bool PartSet_SketcherMgr::canDisplayCurrentCreatedFeature() const
{
- return myIsMouseOverWindow || !myIsResetCurrentValue;
-#ifdef DEBUG_MOUSE_OVER_WINDOW_FLAGS
- qDebug(QString("canDisplayCurrentCreatedFeature: %1").arg(mouseOverWindowFlagsInfo()).toStdString().c_str());
-#endif
+ bool aCanDisplay = myIsMouseOverWindow;
+ if (!aCanDisplay) {
+ ModuleBase_ModelWidget* anActiveWidget = getActiveWidget();
+ if (anActiveWidget)
+ aCanDisplay = anActiveWidget->getValueState() == ModuleBase_ModelWidget::Stored;
+ }
+ return aCanDisplay;
+}
+
+bool PartSet_SketcherMgr::canChangeCursor(ModuleBase_Operation* theOperation) const
+{
+ return isNestedCreateOperation(theOperation) ||
+ myModule->sketchReentranceMgr()->isInternalEditActive();
}
bool PartSet_SketcherMgr::isObjectOfSketch(const ObjectPtr& theObject) const
}
}
-void PartSet_SketcherMgr::connectToPropertyPanel(const bool isToConnect)
+void PartSet_SketcherMgr::connectToPropertyPanel(ModuleBase_ModelWidget* theWidget, const bool isToConnect)
{
- ModuleBase_IWorkshop* anIWorkshop = myModule->workshop();
- XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(anIWorkshop);
- XGUI_Workshop* aWorkshop = aConnector->workshop();
- XGUI_PropertyPanel* aPropertyPanel = aWorkshop->propertyPanel();
- if (aPropertyPanel) {
- const QList<ModuleBase_ModelWidget*>& aWidgets = aPropertyPanel->modelWidgets();
- foreach (ModuleBase_ModelWidget* aWidget, aWidgets) {
- if (isToConnect) {
- connect(aWidget, SIGNAL(beforeValuesChanged()),
+ if (isToConnect) {
+ connect(theWidget, SIGNAL(beforeValuesChanged()),
+ this, SLOT(onBeforeValuesChangedInPropertyPanel()));
+ connect(theWidget, SIGNAL(afterValuesChanged()),
+ this, SLOT(onAfterValuesChangedInPropertyPanel()));
+ }
+ else {
+ disconnect(theWidget, SIGNAL(beforeValuesChanged()),
this, SLOT(onBeforeValuesChangedInPropertyPanel()));
- connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onValuesChangedInPropertyPanel()));
- connect(aWidget, SIGNAL(afterValuesChanged()),
+ disconnect(theWidget, SIGNAL(afterValuesChanged()),
this, SLOT(onAfterValuesChangedInPropertyPanel()));
- }
- else {
- disconnect(aWidget, SIGNAL(beforeValuesChanged()),
- this, SLOT(onBeforeValuesChangedInPropertyPanel()));
- disconnect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onValuesChangedInPropertyPanel()));
- disconnect(aWidget, SIGNAL(afterValuesChanged()),
- this, SLOT(onAfterValuesChangedInPropertyPanel()));
- }
+ }
+}
+
+void PartSet_SketcherMgr::widgetStateChanged(int thePreviousState)
+{
+ ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
+ (getCurrentOperation());
+ if (aFOperation) {
+ if (PartSet_SketcherMgr::isSketchOperation(aFOperation) ||
+ PartSet_SketcherMgr::isNestedSketchOperation(aFOperation) &&
+ thePreviousState == ModuleBase_ModelWidget::ModifiedInPP) {
+ FeaturePtr aFeature = aFOperation->feature();
+ visualizeFeature(aFeature, aFOperation->isEditOperation(), canDisplayObject(aFeature));
}
}
}
return myModule->workshop()->currentOperation();
}
+//**************************************************************
+ModuleBase_ModelWidget* PartSet_SketcherMgr::getActiveWidget() const
+{
+ ModuleBase_ModelWidget* aWidget = 0;
+ ModuleBase_Operation* anOperation = getCurrentOperation();
+ if (anOperation) {
+ ModuleBase_IPropertyPanel* aPanel = anOperation->propertyPanel();
+ if (aPanel)
+ aWidget = aPanel->activeWidget();
+ }
+ return aWidget;
+}
+
void PartSet_SketcherMgr::visualizeFeature(const FeaturePtr& theFeature,
const bool isEditOperation,
const bool isToDisplay,
Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
}
-QString PartSet_SketcherMgr::mouseOverWindowFlagsInfo() const
-{
- return QString("myIsResetCurrentValue = %1, myIsMouseOverWindow = %2")
- .arg(myIsResetCurrentValue).arg(myIsMouseOverWindow);
-}
-
XGUI_OperationMgr* PartSet_SketcherMgr::operationMgr() const
{
ModuleBase_IWorkshop* anIWorkshop = myModule->workshop();
return aWorkshop->operationMgr();
}
+