Salome HOME
refs #568: use ordered list view with selection synchronized with object browser...
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_LandCoverOp.cxx
index 492e871d1512400d072cc0c42061df009d02c98e..5240b42d86bdcbdbcd2879078db995073d854b55 100644 (file)
@@ -35,6 +35,9 @@
 
 #include <LightApp_Application.h>
 
+#include <SUIT_MessageBox.h>
+#include <SUIT_Desktop.h>
+
 #include <TopoDS.hxx>
 #include <TopoDS_Face.hxx>
 #include <TopoDS_Wire.hxx>
@@ -69,7 +72,7 @@ void HYDROGUI_LandCoverOp::startOperation()
 
   QString anObjectName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_LAND_COVER_NAME" ) );
 
-  QStringList aSelectedPolylines;
+  HYDROGUI_ListModel::Object2VisibleList aSelectedPolylines;
   QString     aSelectedStricklerType;
 
   if ( myIsEdit )
@@ -84,7 +87,7 @@ void HYDROGUI_LandCoverOp::startOperation()
       for ( int i = aRefPolylines.Lower(); i <= aRefPolylines.Upper(); i++ ) {
         Handle(HYDROData_PolylineXY) aPolyline = Handle(HYDROData_PolylineXY)::DownCast( aRefPolylines.Value( i ) );
         if ( !aPolyline.IsNull() ) {
-          aSelectedPolylines.append( aPolyline->GetName() );
+          aSelectedPolylines.append( HYDROGUI_ListModel::Object2Visible( aPolyline, true ) );
         }
       }
     }
@@ -93,7 +96,6 @@ void HYDROGUI_LandCoverOp::startOperation()
   }
 
   aPanel->setObjectName( anObjectName );
-  aPanel->setPolylineNames( HYDROGUI_Tool::FindExistingObjectsNames( doc(), KIND_POLYLINEXY ) );
   // Construct a list of unique names of all Strickler types defined within the data model
   QStringList aStricklerTypes;
   HYDROData_Iterator anIterator( doc(), KIND_STRICKLER_TABLE );
@@ -103,17 +105,11 @@ void HYDROGUI_LandCoverOp::startOperation()
       Handle(HYDROData_StricklerTable)::DownCast( anIterator.Current() );      
     if ( !aStricklerTableObj.IsNull() )
     {
-      // TODO: implement GetTypes method in data model
-      //QStringList aTypes = aStricklerTableObj->GetTypes();
-      // The code below is a sample of data filling list of Strickler types
-      QStringList aTypes;
-      aTypes.append("Zones de champs, prairies, sans cultures");
-      aTypes.append("Canaux naturels");
-      aTypes.append("Zones à faible urbanization (bourg)");
-      QStringList::const_iterator anIt = aTypes.begin(), aLast = aTypes.end();
-      for( ; anIt!=aLast; anIt++ )
+      // Get Strickler table data from the data model
+      TColStd_SequenceOfExtendedString aTypes = aStricklerTableObj->GetTypes();
+      for ( int i = 1; i <= aTypes.Length(); i++ )
       {
-        QString aType = *anIt;
+        QString aType = HYDROGUI_Tool::ToQString( aTypes.Value( i ) );
         if ( !aType.isEmpty() && !aStricklerTypes.contains( aType ))
           aStricklerTypes.append( aType );
       }
@@ -124,7 +120,7 @@ void HYDROGUI_LandCoverOp::startOperation()
 
   aPanel->blockSignals( false );
 
-  aPanel->setSelectedPolylineNames( aSelectedPolylines );
+  aPanel->includePolylines( aSelectedPolylines );
   aPanel->setSelectedAdditionalParamName( aSelectedStricklerType );
 }
 
@@ -147,6 +143,8 @@ HYDROGUI_InputPanel* HYDROGUI_LandCoverOp::createInputPanel() const
   HYDROGUI_LandCoverDlg* aPanel = new HYDROGUI_LandCoverDlg( module(), getName() );
   connect( aPanel, SIGNAL( CreatePreview( const QStringList& ) ),
            this,   SLOT( onCreatePreview( const QStringList& ) ) );
+  connect( aPanel, SIGNAL( addPolylines() ), SLOT( onAddPolylines() ) );
+  connect( aPanel, SIGNAL( removePolylines() ), SLOT( onRemovePolylines() ) );
   return aPanel;
 }
 
@@ -179,7 +177,7 @@ bool HYDROGUI_LandCoverOp::processApply( int& theUpdateFlags,
   HYDROData_SequenceOfObjects aZonePolylines;
   QString aStricklerType;
 
-  QStringList aSelectedPolylineNames = aPanel->getSelectedPolylineNames();
+  QStringList aSelectedPolylineNames = aPanel->getPolylineNames();
   QStringList::const_iterator anIt = aSelectedPolylineNames.begin(), aLast = aSelectedPolylineNames.end();
   for( ; anIt!=aLast; anIt++ )
   {
@@ -275,9 +273,6 @@ void HYDROGUI_LandCoverOp::onCreatePreview( const QStringList& thePolylineNames
 
   if ( aViewManager && myPreviewPrs )
   {
-    // TODO: Temporary commented until GetFillingColor, DefaultFillingColor,
-    // GetBorderColor and DefaultBorderColor data model methods will be implemented
-    /*
     QColor aFillingColor = HYDROData_LandCover::DefaultFillingColor();
     QColor aBorderColor = HYDROData_LandCover::DefaultBorderColor();
     if ( !myEditedObject.IsNull() ) {
@@ -287,7 +282,6 @@ void HYDROGUI_LandCoverOp::onCreatePreview( const QStringList& thePolylineNames
 
     myPreviewPrs->setFillingColor( aFillingColor, false, false );
     myPreviewPrs->setBorderColor( aBorderColor, false, false );
-    */
 
     TopoDS_Face aFace;
     if( !aZoneShape.IsNull() )
@@ -298,6 +292,57 @@ void HYDROGUI_LandCoverOp::onCreatePreview( const QStringList& thePolylineNames
   QApplication::restoreOverrideCursor();
 }
 
+void HYDROGUI_LandCoverOp::onAddPolylines()
+{
+  HYDROGUI_LandCoverDlg* aPanel = ::qobject_cast<HYDROGUI_LandCoverDlg*>( inputPanel() );
+  if ( !aPanel )
+    return;
+
+  // Add polylines selected in the module browser
+  Handle(HYDROData_PolylineXY) aPolyXY;
+  HYDROGUI_ListModel::Object2VisibleList aSelectedPolylines;
+  HYDROData_SequenceOfObjects aSeq = HYDROGUI_Tool::GetSelectedObjects( module() );
+
+  if ( aSeq.IsEmpty() || !confirmPolylinesChange() )
+    return;
+
+  for( int anIndex = 1, aLength = aSeq.Length(); anIndex <= aLength; anIndex++ )
+  {
+    aPolyXY = Handle(HYDROData_PolylineXY)::DownCast( aSeq.Value( anIndex ));
+    if (!aPolyXY.IsNull())
+      aSelectedPolylines.append( HYDROGUI_ListModel::Object2Visible( aPolyXY, true ) );
+  }
+  
+  aPanel->includePolylines( aSelectedPolylines );
+  // TODO: create preview of included polylines
+}
+
+void HYDROGUI_LandCoverOp::onRemovePolylines()
+{
+  // Remove selected polylines from the calculation case
+  HYDROGUI_LandCoverDlg* aPanel = ::qobject_cast<HYDROGUI_LandCoverDlg*>( inputPanel() );
+  if ( !aPanel )
+    return;
+
+  QStringList aSelectedList = aPanel->getSelectedPolylineNames();
+  if ( aSelectedList.isEmpty() || !confirmPolylinesChange() )
+    return;
+  
+  HYDROGUI_ListModel::Object2VisibleList aSelectedPolylines;
+  for (int i = 0; i < aSelectedList.length(); i++)
+  {
+    Handle(HYDROData_PolylineXY) anObject = Handle(HYDROData_PolylineXY)::DownCast( 
+      HYDROGUI_Tool::FindObjectByName( module(), aSelectedList.at(i) ) );
+    if ( anObject.IsNull() )
+      continue;
+
+    aSelectedPolylines.append( HYDROGUI_ListModel::Object2Visible( anObject, true ) );
+  }
+
+  module()->update( UF_OCCViewer );
+  aPanel->excludePolylines( aSelectedPolylines );
+}
+
 void HYDROGUI_LandCoverOp::closePreview()
 {
   if( myPreviewPrs )
@@ -306,3 +351,31 @@ void HYDROGUI_LandCoverOp::closePreview()
     myPreviewPrs = 0;
   }
 }
+
+bool HYDROGUI_LandCoverOp::confirmPolylinesChange() const
+{
+  if ( myEditedObject.IsNull() )
+    return true;
+
+  // Check if the land cover object is already modified or not
+  bool isConfirmed = myEditedObject->IsMustBeUpdated();
+  if ( !isConfirmed )
+  {
+    // If not modified check if the land cover has already defined polylines
+    HYDROData_SequenceOfObjects aSeq = myEditedObject->GetPolylines();
+    if ( aSeq.Length() > 0 )
+    {
+      // If there are already defined polylines then ask a user to confirm land cover recalculation
+      isConfirmed = ( SUIT_MessageBox::question( module()->getApp()->desktop(),
+                      tr( "POLYLINES_CHANGED" ),
+                      tr( "CONFIRM_LAND_COVER_RECALCULATION" ),
+                      QMessageBox::Yes | QMessageBox::No,
+                      QMessageBox::No ) == QMessageBox::Yes );
+    }
+    else
+    {
+      isConfirmed = true; // No polylines - nothing to recalculate
+    }
+  }
+  return isConfirmed;
+}