]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
SketchPoint feature appeared in origin by restart. Correction: the viewer update...
authornds <nds@opencascade.com>
Wed, 17 Feb 2016 12:45:38 +0000 (15:45 +0300)
committernds <nds@opencascade.com>
Wed, 17 Feb 2016 12:46:47 +0000 (15:46 +0300)
src/ModuleBase/ModuleBase_ModelWidget.h
src/PartSet/PartSet_SketcherReetntrantMgr.cpp
src/XGUI/XGUI_Displayer.cpp
src/XGUI/XGUI_Displayer.h

index 8d6b0be3b3a14d47a54b5ebc4f0d3c0c38aa3c7a..a9f6530b92307f49101ca5cbd64cde7d8b2c1d0e 100644 (file)
@@ -197,6 +197,10 @@ Q_OBJECT
   /// \param theObj is object for moving
   static void moveObject(ObjectPtr theObj);
 
+  /// Sends a message about block/unblock viewer updating
+  /// \param theValue a boolean value
+  static void blockUpdateViewer(const bool theValue);
+
 signals:
   /// The signal about widget values are to be changed
   void beforeValuesChanged();
@@ -276,10 +280,6 @@ protected:
   /// The method called when widget is activated
   virtual void activateCustom() {};
 
-  /// Sends a message about block/unblock viewer updating
-  /// \param theValue a boolean value
-  static void blockUpdateViewer(const bool theValue);
-
 protected slots:
   /// Processing of values changed in model widget by store the current value to the feature
   void onWidgetValuesChanged();
index ae06c60e45ae9488a76ce92f733e612653a8109a..e063f05daaf6f6b59968fa7e299378be53c68c3e 100755 (executable)
@@ -178,6 +178,14 @@ bool PartSet_SketcherReetntrantMgr::processMouseReleased(ModuleBase_IViewWindow*
 
     ModuleBase_ModelWidget* anActiveWidget = aPanel->activeWidget();
     if (!anActiveWidget || !anActiveWidget->isViewerSelector()) {
+
+      // block of viewer update
+      // we need to block update content of the viewer because of Sketch Point feature
+      // in activate() the value of the point is initialized and it can be displayed
+      // but the default value is [0, 0]. So, we block update viewer contentent until
+      // onMouseRelease happens, which correct the point position
+      ModuleBase_ModelWidget::blockUpdateViewer(true);
+
       restartOperation();
       aProcessed = true;
 
@@ -189,6 +197,8 @@ bool PartSet_SketcherReetntrantMgr::processMouseReleased(ModuleBase_IViewWindow*
       if (aPoint2DWdg && aPoint2DWdg == aFirstWidget) {
         aPoint2DWdg->onMouseRelease(theWnd, theEvent);
       }
+      // unblock viewer update
+      ModuleBase_ModelWidget::blockUpdateViewer(false);
     }
   }
 
index 3899d5e37fdffb31f1939b95d75823f0e043d6a6..dd84ebdb7e32e5332f12b0fb449de55486409e77 100644 (file)
@@ -103,10 +103,9 @@ QString qIntListInfo(const QIntList& theValues, const QString& theSeparator = QS
 }
 
 XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop)
-  : myWorkshop(theWorkshop), myEnableUpdateViewer(true), myNeedUpdate(false),
-  myIsTrihedronActive(false)
+  : myWorkshop(theWorkshop), myNeedUpdate(false),
+  myIsTrihedronActive(false), myViewerBlockedRecursiveCount(0)
 {
-  enableUpdateViewer(true);
   myCustomPrs = std::shared_ptr<GeomAPI_ICustomPrs>(new XGUI_CustomPrs(theWorkshop));
 }
 
@@ -253,7 +252,7 @@ bool XGUI_Displayer::erase(ObjectPtr theObject, const bool theUpdateViewer)
     Handle(AIS_InteractiveObject) anAIS = anObject->impl<Handle(AIS_InteractiveObject)>();
     if (!anAIS.IsNull()) {
       emit beforeObjectErase(theObject, anObject);
-      aContext->Remove(anAIS, theUpdateViewer);
+      aContext->Remove(anAIS);
       aErased = true;
     }
   }
@@ -265,6 +264,10 @@ bool XGUI_Displayer::erase(ObjectPtr theObject, const bool theUpdateViewer)
   qDebug(QString("erase object: %1").arg(aPtrStr.str().c_str()).toStdString().c_str());
   qDebug(getResult2AISObjectMapInfo().c_str());
 #endif
+
+  if (theUpdateViewer)
+    updateViewer();
+
   return aErased;
 }
 
@@ -744,20 +747,28 @@ ObjectPtr XGUI_Displayer::getObject(const Handle(AIS_InteractiveObject)& theIO)
 
 bool XGUI_Displayer::enableUpdateViewer(const bool isEnabled)
 {
-  bool aWasEnabled = myEnableUpdateViewer;
+  bool aWasEnabled = isUpdateEnabled();
+  if (isEnabled)
+    myViewerBlockedRecursiveCount--;
+  else
+    myViewerBlockedRecursiveCount++;
 
-  myEnableUpdateViewer = isEnabled;
-  if (myNeedUpdate && myEnableUpdateViewer) {
+  if (myNeedUpdate && isUpdateEnabled()) {
     updateViewer();
     myNeedUpdate = false;
   }
   return aWasEnabled;
 }
 
+bool XGUI_Displayer::isUpdateEnabled() const
+{
+  return myViewerBlockedRecursiveCount == 0;
+}
+
 void XGUI_Displayer::updateViewer() const
 {
   Handle(AIS_InteractiveContext) aContext = AISContext();
-  if (!aContext.IsNull() && myEnableUpdateViewer) {
+  if (!aContext.IsNull() && isUpdateEnabled()) {
     myWorkshop->viewer()->Zfitall();
     aContext->UpdateCurrentViewer();
   } else {
@@ -770,13 +781,15 @@ void XGUI_Displayer::activateAIS(const Handle(AIS_InteractiveObject)& theIO,
 {
   Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext();
   if (!aContext.IsNull()) {
-    aContext->Activate(theIO, theMode, theUpdateViewer);
+    aContext->Activate(theIO, theMode, false);
 
 #ifdef DEBUG_ACTIVATE_AIS
     ObjectPtr anObject = getObject(theIO);
     anInfo.append(ModuleBase_Tools::objectInfo((*anIt)));
     qDebug(QString("activateAIS: theMode = %1, object = %2").arg(theMode).arg(anInfo).toStdString().c_str());
 #endif
+    if (theUpdateViewer)
+      updateViewer();
   }
 }
 
@@ -827,7 +840,7 @@ bool XGUI_Displayer::displayAIS(AISObjectPtr theAIS, const bool toActivateInSele
   Handle(AIS_InteractiveContext) aContext = AISContext();
   Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
   if (!aContext.IsNull() && !anAISIO.IsNull()) {
-    aContext->Display(anAISIO, 0/*wireframe*/, 0, theUpdateViewer, true, AIS_DS_Displayed);
+    aContext->Display(anAISIO, 0/*wireframe*/, 0, false/*update viewer*/, true, AIS_DS_Displayed);
     aDisplayed = true;
     aContext->Deactivate(anAISIO);
     aContext->Load(anAISIO);
@@ -842,6 +855,8 @@ bool XGUI_Displayer::displayAIS(AISObjectPtr theAIS, const bool toActivateInSele
         }
       }
     }
+    if (theUpdateViewer)
+      updateViewer();
   }
   return aDisplayed;
 }
@@ -853,7 +868,7 @@ bool XGUI_Displayer::eraseAIS(AISObjectPtr theAIS, const bool theUpdateViewer)
   if (!aContext.IsNull()) {
     Handle(AIS_InteractiveObject) anAISIO = theAIS->impl<Handle(AIS_InteractiveObject)>();
     if (!anAISIO.IsNull() && aContext->IsDisplayed(anAISIO)) {
-      aContext->Remove(anAISIO, theUpdateViewer);
+      aContext->Remove(anAISIO, false/*update viewer*/);
       aErased = true;
     }
   }
index 5ad16e6bcc00bcbca8be10123dc301481f67ff87..5a325fc8c4994ebd90f1305d6a963b736f216111 100644 (file)
@@ -137,12 +137,14 @@ class XGUI_EXPORT XGUI_Displayer: public QObject
   void removeFilters();
 
   /// Sets a flag to the displayer whether the internal viewer can be updated by 
-  /// the updateViewer method call. If it is not enabled, this method do nothing
+  /// the updateViewer method call. If it is not enabled, this method do nothing.
+  /// This state maintain recurse, if the update is blocked twice or three times, the
+  /// viewer will not be updated until it is unblocked necessary times(twice or three in the example).
   /// \param isEnabled a boolean value
   bool enableUpdateViewer(const bool isEnabled);
 
-  /// Returns myEnableUpdateViewer flag
-  bool isUpdateEnabled() const { return myEnableUpdateViewer; }
+  /// Returns true if the viewer update is not blocked
+  bool isUpdateEnabled() const;
 
   /// Updates the viewer
   void updateViewer() const;
@@ -327,8 +329,8 @@ private:
   /// Selection modes installed for external objects in local context
   QIntList myActiveSelectionModes;
 
-  /// the enable update viewer flag
-  bool myEnableUpdateViewer; 
+  /// Number of blocking of the viewer update. The viewer is updated only if it equals zero
+  int myViewerBlockedRecursiveCount;
 
   // Flag: use trihedgon for selection or not
   bool myIsTrihedronActive;