]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #604 Creation of an unexpected line in the Sketcher
authornds <natalia.donis@opencascade.com>
Fri, 26 Jun 2015 09:07:06 +0000 (12:07 +0300)
committernds <natalia.donis@opencascade.com>
Fri, 26 Jun 2015 09:07:39 +0000 (12:07 +0300)
An additional condition for Apply button validity.

src/ModuleBase/ModuleBase_IModule.cpp
src/ModuleBase/ModuleBase_IModule.h
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_Module.h
src/PartSet/PartSet_SketcherMgr.cpp
src/PartSet/PartSet_SketcherMgr.h
src/XGUI/XGUI_OperationMgr.cpp
src/XGUI/XGUI_OperationMgr.h
src/XGUI/XGUI_Workshop.cpp

index 987b17491ccee0cc076369008d3c567fc2c85368..f15a9321f168048143fc6dba226b6b5a0cb52a67 100644 (file)
@@ -128,6 +128,11 @@ bool ModuleBase_IModule::canRedo() const
   return aMgr->hasModuleDocument() && aMgr->canRedo() && !aMgr->isOperation();
 }
 
+bool ModuleBase_IModule::canCommitOperation() const
+{
+  return true;
+}
+
 void ModuleBase_IModule::onFeatureTriggered()
 {
   QAction* aCmd = dynamic_cast<QAction*>(sender());
index ba082667ef1cb2a7e099ceca7d9022afbaad72ed..bea23dbcd5108862e1fdf5c4c6ff2e71eb802067 100644 (file)
@@ -120,6 +120,10 @@ class MODULEBASE_EXPORT ModuleBase_IModule : public QObject
   //! Returns True if there are available Redos and there is not an active operation\r
   virtual bool canRedo() const;\r
 \r
+  /// Returns True if the current operation can be committed. By default it is true.\r
+  /// \return a boolean value\r
+  virtual bool canCommitOperation() const;\r
+\r
   /// Returns whether the object can be displayed. The default realization returns true.\r
   /// \param theObject a model object\r
   virtual bool canDisplayObject(const ObjectPtr& theObject) const;\r
index d90aec2401f4e814371e32eb79d66b7b99c152d0..2e87de581af3bcee016128aca9a8507798fe59c6 100644 (file)
@@ -315,6 +315,11 @@ bool PartSet_Module::canRedo() const
   return aCanRedo;
 }
 
+bool PartSet_Module::canCommitOperation() const
+{
+  return mySketchMgr->canCommitOperation();
+}
+
 bool PartSet_Module::canDisplayObject(const ObjectPtr& theObject) const
 {
   // the sketch manager put the restriction to the objects display
index 46012ad1667279b0ecef33d45aeb7e7122c4ad40..d6c2d478614f30397c32847d06ab6ae3f3ebe008 100644 (file)
@@ -99,6 +99,10 @@ public:
   /// \return the boolean result
   virtual bool canRedo() const;
 
+  /// Returns True if the current operation can be committed. Asks the sketch manager.
+  /// \return a boolean value
+  virtual bool canCommitOperation() const;
+
   /// Returns whether the object can be displayed at the bounds of the active operation.
   /// Display only current operation results for usual operation and ask the sketcher manager
   /// if it is a sketch operation
index 323c9ffd1a2dbd6dd5fc198d971ea0f4375f0b10..099bd16b3c3dfe028f016dd5b31c79bbbafe5e2c 100644 (file)
@@ -12,6 +12,7 @@
 #include "PartSet_WidgetSketchLabel.h"
 
 #include <ModuleBase_WidgetEditor.h>
+#include <ModuleBase_ModelWidget.h>
 
 #include <XGUI_ModuleConnector.h>
 #include <XGUI_Displayer.h>
 #include <XGUI_ContextMenuMgr.h>
 #include <XGUI_Selection.h>
 #include <XGUI_SelectionMgr.h>
-#include <ModuleBase_ModelWidget.h>
 #include <XGUI_ModuleConnector.h>
 #include <XGUI_PropertyPanel.h>
 #include <XGUI_ViewerProxy.h>
+#include <XGUI_OperationMgr.h>
 
 #include <ModuleBase_IViewer.h>
 #include <ModuleBase_IWorkshop.h>
@@ -189,6 +190,7 @@ void PartSet_SketcherMgr::onEnterViewPort()
   // redisplayed before this update, the feature presentation jumps from reset value to current.
   myIsMouseOverWindow = true;
   myIsPropertyPanelValueChanged = false;
+  operationMgr()->onValidateOperation();
 #ifdef DEBUG_MOUSE_OVER_WINDOW_FLAGS
   qDebug(QString("onEnterViewPort: %1").arg(mouseOverWindowFlagsInfo()).toStdString().c_str());
 #endif
@@ -218,6 +220,7 @@ void PartSet_SketcherMgr::onLeaveViewPort()
   myIsMouseOverViewProcessed = false;
   myIsMouseOverWindow = false;
   myIsPropertyPanelValueChanged = false;
+  operationMgr()->onValidateOperation();
 #ifdef DEBUG_MOUSE_OVER_WINDOW_FLAGS
   qDebug(QString("onLeaveViewPort: %1").arg(mouseOverWindowFlagsInfo()).toStdString().c_str());
 #endif
@@ -294,6 +297,7 @@ void PartSet_SketcherMgr::onValuesChangedInPropertyPanel()
 
   // visualize the current operation feature
   myIsPropertyPanelValueChanged = true;
+  operationMgr()->onValidateOperation();
   ModuleBase_Operation* aOperation = getCurrentOperation();
   // 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)
@@ -822,6 +826,7 @@ void PartSet_SketcherMgr::stopNestedSketch(ModuleBase_Operation* theOp)
   connectToPropertyPanel(false);
   myIsPropertyPanelValueChanged = false;
   myIsMouseOverViewProcessed = true;
+  operationMgr()->onValidateOperation();
 }
 
 void PartSet_SketcherMgr::commitNestedSketch(ModuleBase_Operation* theOperation)
@@ -846,6 +851,16 @@ bool PartSet_SketcherMgr::canRedo() const
   return isNestedCreateOperation(getCurrentOperation());
 }
 
+bool PartSet_SketcherMgr::canCommitOperation() const
+{
+  bool aCanCommit = true;
+
+  if (isNestedCreateOperation(getCurrentOperation()) && !canDisplayCurrentCreatedFeature())
+    aCanCommit = false;
+
+  return aCanCommit;
+}
+
 bool PartSet_SketcherMgr::canDisplayObject(const ObjectPtr& theObject) const
 {
   bool aCanDisplay = true;
@@ -1198,3 +1213,12 @@ QString PartSet_SketcherMgr::mouseOverWindowFlagsInfo() const
   return QString("myIsPropertyPanelValueChanged = %1,    myIsMouseOverWindow = %2")
      .arg(myIsPropertyPanelValueChanged).arg(myIsMouseOverWindow);
 }
+
+XGUI_OperationMgr* PartSet_SketcherMgr::operationMgr() const
+{
+  ModuleBase_IWorkshop* anIWorkshop = myModule->workshop();
+  XGUI_ModuleConnector* aConnector = dynamic_cast<XGUI_ModuleConnector*>(anIWorkshop);
+  XGUI_Workshop* aWorkshop = aConnector->workshop();
+
+  return aWorkshop->operationMgr();
+}
index 973924a3e0d7a5e8702d16dde6700e2d4a786e86..677c4a163107208de4c566e97a33a36686c9389d 100644 (file)
@@ -28,6 +28,7 @@ class PartSet_Module;
 class ModuleBase_IViewWindow;
 class ModuleBase_ModelWidget;
 class ModuleBase_Operation;
+class XGUI_OperationMgr;
 class QMouseEvent;
 
 /**
@@ -134,6 +135,10 @@ public:
   /// \return the boolean result
   bool canRedo() const;
 
+  /// Returns False only if the sketch creating feature can not be visualized.
+  /// \return a boolean value
+  bool canCommitOperation() const;
+
   /// Returns whether the object can be displayed at the bounds of the active operation.
   /// Display only current operation results for usual operation and ask the sketcher manager
   /// if it is a sketch operation
@@ -267,6 +272,8 @@ private:
   /// \return a string value
   QString mouseOverWindowFlagsInfo() const;
 
+  XGUI_OperationMgr* operationMgr() const;
+
 private:
   PartSet_Module* myModule;
 
index 65e76b68c56ef4d34b81ee117928c447d25e25f3..fc45ef3f8052088dfc84793265fb7bd591d5dabf 100644 (file)
@@ -7,13 +7,17 @@
 #include "XGUI_OperationMgr.h"
 
 #include "ModuleBase_Operation.h"
+#include "ModuleBase_IWorkshop.h"
+#include "ModuleBase_IModule.h"
 
 #include <QMessageBox>
 #include <QApplication>
 #include <QKeyEvent>
 
-XGUI_OperationMgr::XGUI_OperationMgr(QObject* theParent)
-    : QObject(theParent), myIsValidationLock(false), myIsApplyEnabled(false)
+XGUI_OperationMgr::XGUI_OperationMgr(QObject* theParent,
+                                     ModuleBase_IWorkshop* theWorkshop)
+: QObject(theParent), myIsValidationLock(false), myIsApplyEnabled(false),
+  myWorkshop(theWorkshop)
 {
 }
 
@@ -153,7 +157,8 @@ void XGUI_OperationMgr::onValidateOperation()
     return;
   ModuleBase_Operation* anOperation = currentOperation();
   if(anOperation) {
-    setApplyEnabled(!myIsValidationLock && anOperation->isValid());
+    bool aCanCommit = myWorkshop->module()->canCommitOperation();
+    setApplyEnabled(!myIsValidationLock && aCanCommit && anOperation->isValid());
   }
 }
 
index 812c61c3dd2a1b83be4b31f46ee4c79df8a01b50..155d4ef486cd5378d49a71d89fb3f53c82f4dfa7 100644 (file)
@@ -17,6 +17,8 @@
 
 class QKeyEvent;
 
+class ModuleBase_IWorkshop;
+
 /**\class XGUI_OperationMgr
  * \ingroup GUI
  * \brief Operation manager. Servers to manipulate to the workshop operations. Contains a stack
@@ -32,10 +34,13 @@ Q_OBJECT
  public:
   /// Constructor
   /// \param theParent the parent
-  XGUI_OperationMgr(QObject* theParent);
+  XGUI_OperationMgr(QObject* theParent, ModuleBase_IWorkshop* theWorkshop);
   /// Destructor
   virtual ~XGUI_OperationMgr();
 
+  void setWorkshop(ModuleBase_IWorkshop* theWorkshop)
+  { myWorkshop = theWorkshop; };
+
   /// Returns the current operation or NULL
   /// \return the current operation
   ModuleBase_Operation* currentOperation() const;
@@ -173,6 +178,10 @@ signals:
   Operations myOperations;  ///< a stack of started operations. The active operation is on top,
                             // others are suspended and started by the active is finished
 
+  /// Current workshop
+  ModuleBase_IWorkshop* myWorkshop;
+
+
   /// Lock/Unlock access to Ok button in property panel
   bool myIsValidationLock;
   /// Lock/Unlock access to Ok button in property panel
index 49abca2021ac9a28a8f05b4aa3d9572b0a71e31b..cfc79f6b7ed0d171ee4667cdea03a1130b438f04 100644 (file)
@@ -127,7 +127,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector)
   mySelector = new XGUI_SelectionMgr(this);
   //connect(mySelector, SIGNAL(selectionChanged()), this, SLOT(updateModuleCommands()));
 
-  myOperationMgr = new XGUI_OperationMgr(this);
+  myOperationMgr = new XGUI_OperationMgr(this, 0);
   myActionsMgr = new XGUI_ActionsMgr(this);
   myErrorDlg = new XGUI_ErrorDialog(QApplication::desktop());
   myContextMenuMgr = new XGUI_ContextMenuMgr(this);
@@ -139,6 +139,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector)
           myActionsMgr,  SLOT(updateOnViewSelection()));
 
   myModuleConnector = new XGUI_ModuleConnector(this);
+  myOperationMgr->setWorkshop(moduleConnector());
 
   connect(myOperationMgr, SIGNAL(operationStarted(ModuleBase_Operation*)), 
           SLOT(onOperationStarted(ModuleBase_Operation*)));