Salome HOME
refs #417: showing new objects
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_CalculationOp.cxx
index e12aa5fc0496b1f34a63751419d9d85f97fce25f..954e789f45028ac10c404ea4ff7056d38026ace0 100644 (file)
@@ -92,7 +92,6 @@ void HYDROGUI_CalculationOp::startOperation()
     }
   }
 
-
   aPanel->reset();
   QStringList aList;
   QStringList anEntryList;
@@ -145,6 +144,7 @@ void HYDROGUI_CalculationOp::startOperation()
         aPolylineName = aPolylineObj->GetName();
         aPanel->setBoundary( aPolylineName );
       }
+
       aSeq = myEditedObject->GetGeometryObjects();
       getNamesAndEntries( aSeq, aList, anEntryList );
       aPanel->includeGeomObjects( aList );
@@ -173,8 +173,8 @@ void HYDROGUI_CalculationOp::getNamesAndEntries( const HYDROData_SequenceOfObjec
   for ( ; anIter.More(); anIter.Next() )
   {
     Handle(HYDROData_Entity) anEntity = anIter.Value();
-    if ( !HYDROData_Tool::IsGeometryObject( anEntity ) )
-      continue;
+    //if ( !HYDROData_Tool::IsGeometryObject( anEntity ) )
+    //  continue;
 
     theNames.append( anEntity->GetName() );
     theEntries.append( HYDROGUI_DataObject::dataObjectEntry( anEntity ) );
@@ -234,7 +234,7 @@ void HYDROGUI_CalculationOp::onBoundarySelected ( const QString & theObjName )
     myEditedObject->GetBoundaryPolyline();
   if ( !aPrevPolyline.IsNull() )
   {
-    module()->removeObjectShape( HYDROGUI_Module::VMR_PreviewCaseZones, aPrevPolyline );
+    setObjectVisibility( aPrevPolyline, false );
     anIsToUpdateViewer = true;
   }
 
@@ -253,13 +253,13 @@ void HYDROGUI_CalculationOp::onBoundarySelected ( const QString & theObjName )
         Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext();
         if ( !aCtx.IsNull() )
         {
-          showObject( aNewPolyline, aCtx );
+          setObjectVisibility( aNewPolyline, true );
           anIsToUpdateViewer = true;
         }
       }
 
       if ( anIsToUpdateViewer )
-        aViewer->update();
+        module()->update( UF_OCCViewer );
     }
   }
 }
@@ -394,7 +394,7 @@ void HYDROGUI_CalculationOp::onCreateRegion( const QList<SUIT_DataObject*>& theZ
   }
 }
 
-void HYDROGUI_CalculationOp::onSetMergeType( int theMergeType, QString& theBathymetryName )
+void HYDROGUI_CalculationOp::onSetMergeType( int theMergeType, QString& theAltitudeName )
 {
   HYDROGUI_CalculationDlg* aPanel = 
     ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
@@ -403,7 +403,7 @@ void HYDROGUI_CalculationOp::onSetMergeType( int theMergeType, QString& theBathy
     HYDROGUI_Zone* aZone = aPanel->getCurrentZone();
     if ( aZone )
     {
-      aZone->setMergeType( theMergeType, theBathymetryName );
+      aZone->setMergeType( theMergeType, theAltitudeName );
       HYDROGUI_Shape* aShape = module()->getObjectShape( HYDROGUI_Module::VMR_PreviewCaseZones, aZone->modelObject() );
       if ( aShape )
       {
@@ -464,10 +464,11 @@ void HYDROGUI_CalculationOp::onRemoveObjects()
     if ( anObject.IsNull() )
       continue;
 
-    module()->removeObjectShape( HYDROGUI_Module::VMR_PreviewCaseZones, anObject );
+    setObjectVisibility( anObject, false );
     myEditedObject->RemoveGeometryObject( anObject );
   }
 
+  module()->update( UF_OCCViewer );
   aPanel->excludeGeomObjects( aSelectedList );
 }
 
@@ -497,14 +498,21 @@ bool HYDROGUI_CalculationOp::confirmRegionsChange() const
 }
 
 bool HYDROGUI_CalculationOp::processApply( int&     theUpdateFlags,
-                                           QString& theErrorMsg )
+                                           QString& theErrorMsg,
+                                           QStringList& theBrowseObjectsEntries )
 {
   HYDROGUI_CalculationDlg* aPanel = 
     ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
   if ( !aPanel )
     return false;
 
-  theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced;
+  if( !myIsEdit )
+  {
+    QString anEntry = HYDROGUI_DataObject::dataObjectEntry( myEditedObject );
+    theBrowseObjectsEntries.append( anEntry );
+  }
+
+  theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced | UF_VTKViewer | UF_VTK_Forced | UF_VTK_Init;
 
   return true;
 }
@@ -515,12 +523,13 @@ void HYDROGUI_CalculationOp::onApply()
 
   int anUpdateFlags = 0;
   QString anErrorMsg;
+  QStringList aBrowseObjectsEntries;
 
   bool aResult = false;
   
   try
   {
-    aResult = processApply( anUpdateFlags, anErrorMsg );
+    aResult = processApply( anUpdateFlags, anErrorMsg, aBrowseObjectsEntries );
   }
   catch ( Standard_Failure )
   {
@@ -539,6 +548,7 @@ void HYDROGUI_CalculationOp::onApply()
   {
     module()->update( anUpdateFlags );
     commit();
+    browseObjects( aBrowseObjectsEntries );
   }
   else
   {
@@ -626,20 +636,13 @@ void HYDROGUI_CalculationOp::setZonesVisible( bool theIsVisible )
             HYDROData_SequenceOfObjects::Iterator aZonesIter( aZones );
             for ( ; aZonesIter.More(); aZonesIter.Next() )
             {
-              if ( theIsVisible )
-              {
-                showObject( aZonesIter.Value(), aCtx );
-              }
-              else
-              {
-                module()->removeObjectShape( HYDROGUI_Module::VMR_PreviewCaseZones, aZonesIter.Value() );
-              }
+              setObjectVisibility( aZonesIter.Value(), theIsVisible );
             }
           }
         }
       }
 
-      aViewer->update();
+      module()->update( UF_OCCViewer );
     }
   }
 }
@@ -710,30 +713,28 @@ void HYDROGUI_CalculationOp::createPreview()
       HYDROData_SequenceOfObjects::Iterator anIter( aSeq );
       for ( ; anIter.More(); anIter.Next() )
       {
-        showObject( anIter.Value(), aCtx );
+        setObjectVisibility( anIter.Value(), true );
       }
 
       //Process the draw events for viewer
-      QApplication::processEvents();
+      QApplication::processEvents( QEventLoop::ExcludeUserInputEvents );
       if ( OCCViewer_ViewWindow* vw = (OCCViewer_ViewWindow*)myPreviewViewManager->getActiveView() )
         vw->onTopView();
     }
 
-    aViewer->update();
+    module()->update( UF_OCCViewer | UF_FitAll );
   }
 }
 
-void HYDROGUI_CalculationOp::showObject( Handle(HYDROData_Entity) theEntity, Handle(AIS_InteractiveContext) theCtx )
+void HYDROGUI_CalculationOp::setObjectVisibility( Handle(HYDROData_Entity) theEntity, const bool theIsVisible )
 {
-  if ( !theEntity.IsNull() )
-  {
-    HYDROGUI_Shape* aShape = module()->getObjectShape( HYDROGUI_Module::VMR_PreviewCaseZones, theEntity );
-    if ( !aShape )
-    {
-      aShape = new HYDROGUI_Shape( theCtx, theEntity );
-      module()->setObjectShape( HYDROGUI_Module::VMR_PreviewCaseZones, theEntity, aShape );
-    }
-    aShape->update( false );
+  if ( theEntity.IsNull() || !myPreviewViewManager ) {
+    return;
+  }
+
+  OCCViewer_Viewer* aViewer = myPreviewViewManager->getOCCViewer();
+  if ( aViewer ) {
+    module()->setObjectVisible( (size_t)aViewer, theEntity, theIsVisible );
   }
 }
 
@@ -760,6 +761,19 @@ void HYDROGUI_CalculationOp::closePreview()
 
   if( myPreviewViewManager )
   {
+    // Hide all the displayed objects in the preview view
+    OCCViewer_Viewer* aViewer = myPreviewViewManager->getOCCViewer();
+    if ( aViewer ) {
+      size_t aViewId = (size_t)aViewer;
+      HYDROData_Iterator anIterator( doc() );
+      for( ; anIterator.More(); anIterator.Next() ) {
+        Handle(HYDROData_Entity) anObject = anIterator.Current();
+        if( !anObject.IsNull() ) {
+          module()->setObjectVisible( aViewId, anObject, false );
+        }
+      }
+    }
+
     disconnect( myPreviewViewManager, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
                 this, SLOT( onLastViewClosed( SUIT_ViewManager* ) ) );
 
@@ -777,7 +791,11 @@ void HYDROGUI_CalculationOp::closePreview()
 void HYDROGUI_CalculationOp::setAvailableGroups()
 {
   HYDROGUI_CalculationDlg* aPanel = 
-    ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
+      ::qobject_cast<HYDROGUI_CalculationDlg*>( inputPanel() );
+
+  HYDROData_SequenceOfObjects aSeq = myEditedObject->GetGeometryGroups();
+  QStringList aList, anEntryList;
+  getNamesAndEntries( aSeq, aList, anEntryList );
 
   QStringList aGroupsNames;
 
@@ -792,8 +810,20 @@ void HYDROGUI_CalculationOp::setAvailableGroups()
       aGroupsNames.append( aGroup->GetName() );
     }
   }
-  myEditedObject->RemoveGeometryGroups();
+  if( myEditedObject->IsMustBeUpdated() ) {
+    for( int anIndex = 1, aLength = aSeq.Length(); anIndex <= aLength; anIndex++ ) {
+      Handle(HYDROData_ShapesGroup) aGeomGroup =
+        Handle(HYDROData_ShapesGroup)::DownCast( aSeq.Value( anIndex ) );
+      if ( !aGeomGroup.IsNull() && !aGroupsNames.contains( aGeomGroup->GetName() ) ) {
+        myEditedObject->RemoveGeometryGroup( aGeomGroup );
+      }
+    }
+  }
+
   aPanel->setAvailableGroups( aGroupsNames );
+  aPanel->includeGroups( aList );
+
+  bool isUpdated = myEditedObject->IsMustBeUpdated();
 }
 
 void HYDROGUI_CalculationOp::onAddGroups()