Salome HOME
refs #585: polylines operations (split/merge)
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_CalculationOp.cxx
index e00d3a44acbb29fafcf7050786eb0a17c078ecf7..6c6aa8e8afcce538cf5b01b22ff2c96810ad2530 100644 (file)
@@ -55,7 +55,10 @@ HYDROGUI_CalculationOp::HYDROGUI_CalculationOp( HYDROGUI_Module* theModule, bool
 : HYDROGUI_Operation( theModule ),
   myIsEdit( theIsEdit ),
   myActiveViewManager( NULL ),
-  myPreviewViewManager( NULL )
+  myPreviewViewManager( NULL ),
+  myShowGeomObjects( true ),
+  myShowLandCovers( false ),
+  myShowZones( false )
 {
   setName( myIsEdit ? tr( "EDIT_CALCULATION" ) : tr( "CREATE_CALCULATION" ) );
 }
@@ -723,28 +726,52 @@ bool HYDROGUI_CalculationOp::confirmContinueWithWarning( const HYDROData_Warning
   return ( anAnswer == QMessageBox::Yes );
 }
 
+bool HYDROGUI_CalculationOp::confirmLandCoverRegionsChange() const
+{
+  // Check if the case is already modified or not
+  bool isConfirmed = myEditedObject->IsMustBeUpdated();
+  if ( !isConfirmed )
+  {
+    // If not modified check if the case has already defined regions with land cover zones
+    HYDROData_SequenceOfObjects aSeq = myEditedObject->GetRegions( true );
+    if ( aSeq.Length() > 0 )
+    {
+      // If there are already defined land cover zones then ask a user to confirm land cover zones recalculation
+      isConfirmed = ( SUIT_MessageBox::question( module()->getApp()->desktop(),
+                               tr( "REGIONS_CHANGED" ),
+                               tr( "CONFIRM_LAND_COVER_PARTITION_RECALCULATION_REGIONS" ),
+                               QMessageBox::Yes | QMessageBox::No,
+                               QMessageBox::No ) == QMessageBox::Yes );
+    }
+    else
+    {
+      isConfirmed = true; // No regions - no land cover zones - nothing to recalculate
+    }
+  }
+  return isConfirmed;
+}
+
 bool HYDROGUI_CalculationOp::confirmLandCoverModeChange() const
 {
   // Check if the case is already modified or not
   bool isConfirmed = myEditedObject->IsMustBeUpdated();
   if ( !isConfirmed )
   {
-    // If not modified check if the case has already defined regions with zones
-    // TODO: adapt HYDROData_CalculationCase class to process regions constructed for land covers
-    /*HYDROData_SequenceOfObjects aSeq = myEditedObject->GetLandCoverRegions();
+    // If not modified check if the case has already defined regions with land cover zones
+    HYDROData_SequenceOfObjects aSeq = myEditedObject->GetRegions( true );
     if ( aSeq.Length() > 0 )
-    {*/
-      // If there are already defined zones then ask a user to confirm zones recalculation
+    {
+      // If there are already defined land cover zones then ask a user to confirm land cover zones recalculation
       isConfirmed = ( SUIT_MessageBox::question( module()->getApp()->desktop(),
                                tr( "MODE_CHANGED" ),
                                tr( "CONFIRM_LAND_COVER_PARTITION_RECALCULATION_MODE" ),
                                QMessageBox::Yes | QMessageBox::No,
                                QMessageBox::No ) == QMessageBox::Yes );
-    /*}
+    }
     else
     {
-      isConfirmed = true; // No regions - no zones - nothing to recalculate
-    }*/
+      isConfirmed = true; // No regions - no land cover zones - nothing to recalculate
+    }
   }
   return isConfirmed;
 }
@@ -755,22 +782,21 @@ bool HYDROGUI_CalculationOp::confirmLandCoverOrderChange() const
   bool isConfirmed = myEditedObject->IsMustBeUpdated();
   if ( !isConfirmed )
   {
-    // If not modified check if the case has already defined regions with zones
-    // TODO: adapt HYDROData_CalculationCase class to process regions constructed for land covers
-    /*HYDROData_SequenceOfObjects aSeq = myEditedObject->GetLandCoverRegions();
+    // If not modified check if the case has already defined regions with land cover zones
+    HYDROData_SequenceOfObjects aSeq = myEditedObject->GetRegions( true );
     if ( aSeq.Length() > 0 )
-    {*/
-      // If there are already defined zones then ask a user to confirm zones recalculation
+    {
+      // If there are already defined land cover zones then ask a user to confirm land cover zones recalculation
       isConfirmed = ( SUIT_MessageBox::question( module()->getApp()->desktop(),
                                tr( "ORDER_CHANGED" ),
                                tr( "CONFIRM_LAND_COVER_PARTITION_RECALCULATION_REGIONS" ),
                                QMessageBox::Yes | QMessageBox::No,
                                QMessageBox::No ) == QMessageBox::Yes );
-    /*}
+    }
     else
     {
-      isConfirmed = true; // No regions - no zones - nothing to recalculate
-    }*/
+      isConfirmed = true; // No regions - no land cover zones - nothing to recalculate
+    }
   }
   return isConfirmed;
 }
@@ -876,6 +902,8 @@ void HYDROGUI_CalculationOp::onNext( const int theIndex )
     if ( !aPanel )
       return;
 
+    setLandCoversVisible( true );
+
     QStringList aList;
     QStringList anEntryList;
     HYDROData_SequenceOfObjects aSeq;
@@ -902,8 +930,10 @@ void HYDROGUI_CalculationOp::onNext( const int theIndex )
       }
     }
     aPanel->setStricklerTableNames( aList, anEntryList );
+    bool anUpdateState = myEditedObject->IsMustBeUpdated();
     if ( !aList.isEmpty() )
       aPanel->setStricklerTable( aList.at( 0 ), false );
+    myEditedObject->SetToUpdate( anUpdateState );
 
     // Fill in list widget with all available land covers
     aSeq = HYDROGUI_Tool::GetLandCovers( module() );
@@ -942,6 +972,9 @@ void HYDROGUI_CalculationOp::onNext( const int theIndex )
         myEditedObject->SetAssignmentLandCoverMode( (HYDROData_CalculationCase::AssignmentMode)aPanel->getLandCoverMode() );
       }
     }
+
+    closePreview( false );
+    createPreview( true );
   }
   else if( theIndex==3 )
   {
@@ -951,7 +984,10 @@ void HYDROGUI_CalculationOp::onNext( const int theIndex )
       return;
 
     QApplication::setOverrideCursor( Qt::WaitCursor );
-  
+
+    setGeomObjectsVisible( false );
+    setLandCoversVisible( false );
+
     QString aNewCaseName = aPanel->getObjectName();
     QString anOldCaseName = myEditedObject->GetName();
     bool isNameChanged = anOldCaseName != aNewCaseName;
@@ -1005,7 +1041,7 @@ void HYDROGUI_CalculationOp::onNext( const int theIndex )
       //aPanel->setEditedObject( myEditedObject );
       aPanel->refreshZonesBrowser();
     
-      closePreview();
+      closePreview( false );
       createPreview( false );
 
       anIsToUpdateOb = true;
@@ -1066,23 +1102,23 @@ void HYDROGUI_CalculationOp::onNext( const int theIndex )
     aPanel->setEditLandCoverZonesEnabled( aMode == HYDROData_CalculationCase::MANUAL );
 
     bool anIsToUpdateOb = false;
-    if ( myEditedObject->IsMustBeUpdated() )
+    bool anIsToUpdate = myEditedObject->IsMustBeUpdated();
+    if ( anIsToUpdate )
     {
       myShowZones = true;
-      myEditedObject->Update();
+      myEditedObject->SetToUpdate( false );
       
       AssignDefaultZonesColors( true );
 
       aPanel->refreshLandCoverZonesBrowser();
-    
-      closePreview();
-      createPreview( true );
 
       anIsToUpdateOb = true;
-
-      myEditedObject->SetToUpdate( true );
     }
-    else
+
+    closePreview( false );
+    createPreview( true );
+    
+    if ( !anIsToUpdate )
     {
       // Hide zones
       setZonesVisible( false, false );
@@ -1103,15 +1139,36 @@ void HYDROGUI_CalculationOp::onNext( const int theIndex )
 
 void HYDROGUI_CalculationOp::onHideZones( const int theIndex )
 {
-  if( theIndex==3 )
+  if( theIndex==1 )
   {
+    setGeomObjectsVisible( true );
+
+    closePreview( false );
+    createPreview( false );
+  }
+  if( theIndex==2 )
+  {
+    setLandCoversVisible( true );
+
+    closePreview( false );
+    createPreview( true );
+
     // Hide zones
     setZonesVisible( false, false );
+    // Hide land covers
+    setZonesVisible( false, true );
   }
-  else if( theIndex==4 )
+  else if( theIndex==3 )
   {
+    AssignDefaultZonesColors( false );
+
+    closePreview( false );
+    createPreview( false );
+
     // Hide land cover zones
     setZonesVisible( false, true );
+    // Show zones
+    setZonesVisible( true, false );
   }
 }
 
@@ -1149,6 +1206,30 @@ void HYDROGUI_CalculationOp::setZonesVisible( bool theIsVisible, const bool theL
   }
 }
 
+void HYDROGUI_CalculationOp::setGeomObjectsVisible( bool theIsVisible )
+{
+  myShowGeomObjects = theIsVisible;
+
+  HYDROData_SequenceOfObjects aSeq = myEditedObject->GetGeometryObjects();
+
+  HYDROData_SequenceOfObjects::Iterator anIter( aSeq );
+  for ( ; anIter.More(); anIter.Next() ) {
+    setObjectVisibility( anIter.Value(), theIsVisible );
+  }
+}
+
+void HYDROGUI_CalculationOp::setLandCoversVisible( bool theIsVisible )
+{
+  myShowLandCovers = theIsVisible;
+
+  HYDROData_SequenceOfObjects aSeq = myEditedObject->GetLandCovers();
+
+  HYDROData_SequenceOfObjects::Iterator anIter( aSeq );
+  for ( ; anIter.More(); anIter.Next() ) {
+    setObjectVisibility( anIter.Value(), theIsVisible );
+  }
+}
+
 void HYDROGUI_CalculationOp::AssignDefaultZonesColors( const bool theLandCover )
 {
   HYDROData_SequenceOfObjects aRegions = myEditedObject->GetRegions( theLandCover );
@@ -1195,7 +1276,7 @@ QColor HYDROGUI_CalculationOp::GenerateDefaultZonesColor( int theIndex,
                                                           float theValue/* = 0.95*/ ) const
 {
   float aGoldenRatioConjugate = (float)(360./582.);
-  float aHue = (float)rand();
+  float aHue = (float)(rand()%100);
   aHue += aGoldenRatioConjugate*theIndex;
   aHue -= floor(aHue);
 
@@ -1282,10 +1363,17 @@ void HYDROGUI_CalculationOp::createPreview( const bool theLandCover )
 {
   LightApp_Application* anApp = module()->getApp();
   HYDROData_SequenceOfObjects aSeq;
-  if ( theLandCover )
-    aSeq = myEditedObject->GetLandCovers();
-  else
-    aSeq = myEditedObject->GetGeometryObjects();
+  if ( theLandCover && myShowLandCovers )
+  {
+    HYDROData_SequenceOfObjects aSeqLC = myEditedObject->GetLandCovers();
+    aSeq.Append( aSeqLC );
+  }
+  else if ( !theLandCover && myShowGeomObjects )
+  {
+    HYDROData_SequenceOfObjects aSeqGO = myEditedObject->GetGeometryObjects();
+    aSeq.Append( aSeqGO );
+  }
+
   Handle(HYDROData_Entity) anEntity;
 
   if ( myShowZones )
@@ -1378,7 +1466,7 @@ void HYDROGUI_CalculationOp::onLastViewClosed( SUIT_ViewManager* theViewManager
   closePreview();
 }
 
-void HYDROGUI_CalculationOp::closePreview()
+void HYDROGUI_CalculationOp::closePreview( bool theRemoveViewManager )
 {
   SUIT_DataBrowser* aOb = ((LightApp_Application*)module()->application())->objectBrowser();
   QList<QShortcut*> aShortcuts = aOb->findChildren<QShortcut*>();
@@ -1409,14 +1497,17 @@ void HYDROGUI_CalculationOp::closePreview()
       }
     }
 
-    disconnect( myPreviewViewManager, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
-                this, SLOT( onLastViewClosed( SUIT_ViewManager* ) ) );
+    if ( theRemoveViewManager )
+    {
+      disconnect( myPreviewViewManager, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
+                  this, SLOT( onLastViewClosed( SUIT_ViewManager* ) ) );
 
-    module()->getApp()->removeViewManager( myPreviewViewManager ); // myPreviewViewManager is deleted here
-    myPreviewViewManager = NULL;
+      module()->getApp()->removeViewManager( myPreviewViewManager ); // myPreviewViewManager is deleted here
+      myPreviewViewManager = NULL;
+    }
   }
 
-  if( myActiveViewManager )
+  if( myActiveViewManager && theRemoveViewManager )
   {
     HYDROGUI_Tool::SetActiveViewManager( module(), myActiveViewManager );
     myActiveViewManager = NULL;
@@ -1541,7 +1632,7 @@ void HYDROGUI_CalculationOp::onAddLandCovers()
 
   // Add land covers selected in the module browser to the calculation case
   QStringList aSelectedList = aPanel->getSelectedAvailableLandCovers();
-  if ( aSelectedList.isEmpty() || !confirmRegionsChange() )
+  if ( aSelectedList.isEmpty() || !confirmLandCoverRegionsChange() )
     return;
 
   QStringList anAddedList;
@@ -1572,7 +1663,7 @@ void HYDROGUI_CalculationOp::onRemoveLandCovers()
     return;
 
   QStringList aSelectedList = aPanel->getSelectedLandCovers();
-  if ( aSelectedList.isEmpty() || !confirmRegionsChange() )
+  if ( aSelectedList.isEmpty() || !confirmLandCoverRegionsChange() )
     return;
 
   for (int i = 0; i < aSelectedList.length(); i++)