Salome HOME
refs #640: correct width for non-georeferenced profile
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_CalculationDlg.cxx
index 889e811462ce568708534b5a5a5693d765d837f1..6a6e60f09f9c528f7577d344bce32d3d729da412 100644 (file)
@@ -30,6 +30,7 @@
 #include "HYDROGUI_Zone.h"
 #include "HYDROGUI_OrderedListWidget.h"
 #include "HYDROGUI_PriorityWidget.h"
+#include "HYDROGUI_PriorityTableModel.h"
 
 #include <HYDROData_Document.h>
 #include <HYDROData_Entity.h>
@@ -72,7 +73,7 @@ HYDROGUI_CalculationDlg::HYDROGUI_CalculationDlg( HYDROGUI_Module* theModule, co
   addPage( createGroupsPage() );
   addPage( createLandCoversPage() );
   addPage( createZonesPage() );
-  addPage( createLandCoversPartitionPage() );
+  addPage( createLandCoverZonesPage() );
 }
 
 HYDROGUI_CalculationDlg::~HYDROGUI_CalculationDlg()
@@ -95,8 +96,9 @@ void HYDROGUI_CalculationDlg::reset()
   setLandCoverMode( HYDROData_CalculationCase::AUTOMATIC );
 
   // Reset the priority widget state
-  QList<Handle(HYDROData_Object)> anObjects;
+  QList<Handle(HYDROData_Entity)> anObjects;
   myPriorityWidget->setObjects( anObjects );
+  myLandCoverPriorityWidget->setObjects( anObjects );
 }
 
 QWizardPage* HYDROGUI_CalculationDlg::createObjectsPage() {
@@ -243,6 +245,8 @@ QWizardPage* HYDROGUI_CalculationDlg::createObjectsPage() {
 
   connect( myGeomObjects, SIGNAL( orderChanged() ), SLOT( onOrderChanged() ) );
 
+  connect( myPriorityWidget, SIGNAL( ruleChanged() ), SLOT( onRuleChanged() ) );
+
   return aPage;
 }
 
@@ -405,6 +409,10 @@ QWizardPage* HYDROGUI_CalculationDlg::createLandCoversPage() {
 
   // Bottom of the page
   myLandCoverPriorityWidget = new HYDROGUI_PriorityWidget( mainFrame() );
+  HYDROGUI_PriorityTableModel* aModel = 
+    dynamic_cast<HYDROGUI_PriorityTableModel*>( myLandCoverPriorityWidget->getTable()->model() );
+  if ( aModel )
+    aModel->setColumnCount( 3 );
 
   QGroupBox* aPriorityGroup = new QGroupBox( tr( "PRIORITY" ) );
   QBoxLayout* aPriorityLayout = new QHBoxLayout;
@@ -437,7 +445,9 @@ QWizardPage* HYDROGUI_CalculationDlg::createLandCoversPage() {
   connect( anAddBtn, SIGNAL( clicked() ), SIGNAL( addLandCovers() ) );
   connect( aRemoveBtn, SIGNAL( clicked() ), SIGNAL( removeLandCovers() ) );
 
-  connect( myLandCovers, SIGNAL( orderLandCoverChanged() ), SLOT( onOrderLandCoverChanged() ) );
+  connect( myLandCovers, SIGNAL( orderChanged() ), SLOT( onOrderLandCoverChanged() ) );
+
+  connect( myLandCoverPriorityWidget, SIGNAL( ruleChanged() ), SLOT( onLandCoverRuleChanged() ) );
 
   return aPage;
 }
@@ -447,13 +457,16 @@ QWizardPage* HYDROGUI_CalculationDlg::createZonesPage() {
   QFrame* aFrame = new QFrame( aPage );
 
   QGridLayout* aLayout = new QGridLayout( aPage );
+
+  QLabel* aResultsOnGeomObjectsLabel = new QLabel( tr( "RESULTS_ON_GEOMETRY_OBJECTS" ), aFrame );
   
   myBrowser = new HYDROGUI_DataBrowser( module(), NULL, aPage );
   myBrowser->setAutoOpenLevel( 3 );
   aLayout->setMargin( 5 );
   aLayout->setSpacing( 5 );
 
-  aLayout->addWidget( myBrowser, 0, 0, 1, 2 );
+  aLayout->addWidget( aResultsOnGeomObjectsLabel, 0, 0 );
+  aLayout->addWidget( myBrowser, 1, 0, 1, 2 );
 
   myBathymetryLabel = new QLabel( tr( "BATHYMETRY" ), aFrame );
   myBathymetryChoice = new QComboBox( aFrame );
@@ -461,8 +474,11 @@ QWizardPage* HYDROGUI_CalculationDlg::createZonesPage() {
   myBathymetryChoice->setVisible( false );
   myBathymetryLabel->setVisible( false );
 
-  aLayout->addWidget( myBathymetryLabel, 1, 0 );
-  aLayout->addWidget( myBathymetryChoice, 1, 1 );
+  aLayout->addWidget( myBathymetryLabel, 2, 0 );
+  aLayout->addWidget( myBathymetryChoice, 2, 1 );
+
+  QPushButton* aRegenerateBtn = new QPushButton( tr( "REGENERATE_COLORS" ), this );
+  aLayout->addWidget( aRegenerateBtn, 3, 0 );
 
   aPage->setLayout( aLayout );
 
@@ -474,27 +490,46 @@ QWizardPage* HYDROGUI_CalculationDlg::createZonesPage() {
       SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
       SLOT( onZonesDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
   connect( myBrowser, SIGNAL( newRegion() ), this, SLOT( OnNewRegion() ) );
-
+  connect( aRegenerateBtn, SIGNAL( clicked() ), this, SIGNAL( regenerateColors() ) );
   return aPage;
 }
 
-QWizardPage* HYDROGUI_CalculationDlg::createLandCoversPartitionPage() {
+QWizardPage* HYDROGUI_CalculationDlg::createLandCoverZonesPage() {
   QWizardPage* aPage = new QWizardPage( mainFrame() );
   QFrame* aFrame = new QFrame( aPage );
 
   QGridLayout* aLayout = new QGridLayout( aPage );
   
-  myLandCoverBrowser = new HYDROGUI_DataBrowser( module(), NULL, aPage );
+  QLabel* aResultsOnLandCoversLabel = new QLabel( tr( "RESULTS_ON_LAND_COVERS" ), aFrame );
+
+  myLandCoverBrowser = new HYDROGUI_DataBrowser( module(), NULL, aPage, true );
   myLandCoverBrowser->setAutoOpenLevel( 3 );
   aLayout->setMargin( 5 );
   aLayout->setSpacing( 5 );
 
-  aLayout->addWidget( myLandCoverBrowser, 0, 0, 1, 2 );
+  aLayout->addWidget( aResultsOnLandCoversLabel, 0, 0 );
+  aLayout->addWidget( myLandCoverBrowser, 1, 0, 1, 2 );
+
+  myStricklerTypeLabel = new QLabel( tr( "STRICKLER_TYPE" ), aFrame );
+  myStricklerTypeChoice = new QComboBox( aFrame );
+
+  myStricklerTypeLabel->setVisible( false );
+  myStricklerTypeChoice->setVisible( false );  
+
+  aLayout->addWidget( myStricklerTypeLabel, 2, 0 );
+  aLayout->addWidget( myStricklerTypeChoice, 2, 1 );
 
   aPage->setLayout( aLayout );
 
   // Connections
-  //...
+  connect( myLandCoverBrowser, SIGNAL( dataChanged() ), SLOT( onDataLandCoverChanged() ) );
+  connect( myLandCoverBrowser, SIGNAL( clicked( SUIT_DataObject* ) ), SIGNAL( clickedInZonesBrowser( SUIT_DataObject* ) ) );
+  connect( myLandCoverBrowser, SIGNAL( clicked( SUIT_DataObject* ) ), SLOT( onLandCoverZoneSelected( SUIT_DataObject* ) ) );
+  connect( myStricklerTypeChoice, SIGNAL( activated( int ) ), SLOT( onMergeStricklerTypeSelected( int ) ) );
+  connect( myLandCoverBrowser, 
+      SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
+      SLOT( onLandCoverZonesDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
+  connect( myLandCoverBrowser, SIGNAL( newRegion() ), this, SLOT( OnNewLandCoverRegion() ) );
 
   return aPage;
 }
@@ -563,7 +598,7 @@ void HYDROGUI_CalculationDlg::onZonesDropped( const QList<SUIT_DataObject*>& the
       HYDROGUI_Region* aRegion = dynamic_cast<HYDROGUI_Region*>(theTargetParent);
       if ( aRegion )
       {
-        emit moveZones( theTargetParent, aZonesList );
+        emit moveZones( theTargetParent, aZonesList, false );
       }
     }
   }
@@ -574,6 +609,11 @@ void HYDROGUI_CalculationDlg::OnNewRegion()
   emit createRegion( myBrowser->getSelected() );
 }
 
+void HYDROGUI_CalculationDlg::OnNewLandCoverRegion()
+{
+  emit createLandCoverRegion( myLandCoverBrowser->getSelected() );
+}
+
 void HYDROGUI_CalculationDlg::onMergeTypeSelected( int theIndex )
 {
   int aType = myBathymetryChoice->itemData( theIndex ).toInt();
@@ -599,7 +639,7 @@ void HYDROGUI_CalculationDlg::onSelected( SUIT_DataObject* theObject )
     myBathymetryChoice->addItem( tr("MERGE_UNKNOWN"), HYDROData_Zone::Merge_UNKNOWN );
     myBathymetryChoice->addItem( tr("MERGE_ZMIN"), HYDROData_Zone::Merge_ZMIN );
     myBathymetryChoice->addItem( tr("MERGE_ZMAX"), HYDROData_Zone::Merge_ZMAX );
-    QStringList aList = aZone->getAltitudes();
+    QStringList aList = aZone->getObjects();
     for ( int i = 0; i < aList.length(); i++ )
     {
       myBathymetryChoice->addItem( aList.at( i ), HYDROData_Zone::Merge_Object );
@@ -629,6 +669,87 @@ void HYDROGUI_CalculationDlg::onSelected( SUIT_DataObject* theObject )
   myBathymetryLabel->setVisible( doShow );
 }
 
+void HYDROGUI_CalculationDlg::onLandCoverZoneSelected( SUIT_DataObject* theObject )
+{
+  bool doShow = false;
+  HYDROGUI_Zone* aZone = dynamic_cast<HYDROGUI_Zone*>( theObject );
+  if ( aZone )
+  {
+    doShow = aZone->isMergingNeed();
+  }
+
+  if ( doShow )
+  {
+    // Fill the merge type combo box
+    bool prevBlock = myStricklerTypeChoice->blockSignals( true );
+    myCurrentZone = aZone;
+    myStricklerTypeChoice->clear();
+    myStricklerTypeChoice->addItem( tr("MERGE_UNKNOWN"), HYDROData_Zone::Merge_UNKNOWN );
+    QStringList aList = aZone->getObjects();
+    for ( int i = 0; i < aList.length(); i++ )
+    {
+      myStricklerTypeChoice->addItem( aList.at( i ), HYDROData_Zone::Merge_Object );
+    }
+    // Select the current choice if any
+    int aCurIndex = 0;
+    switch ( aZone->getMergeType() )
+    {
+      case HYDROData_Zone::Merge_Object:
+        aCurIndex = 1 + aList.indexOf( aZone->text( HYDROGUI_DataObject::AltitudeObjId ) );
+        break;
+      default:
+        aCurIndex = 0; // Select unknown by default
+    }
+    myStricklerTypeChoice->setCurrentIndex( aCurIndex );
+    myStricklerTypeChoice->blockSignals( prevBlock );
+  }
+
+  myStricklerTypeChoice->setVisible( doShow );
+  myStricklerTypeChoice->setEnabled( getLandCoverMode() == HYDROData_CalculationCase::MANUAL );
+  myStricklerTypeLabel->setVisible( doShow );
+}
+
+void HYDROGUI_CalculationDlg::onMergeStricklerTypeSelected( int theIndex )
+{
+  int aType = myStricklerTypeChoice->itemData( theIndex ).toInt();
+  QString aText = myStricklerTypeChoice->itemText( theIndex );
+  emit setMergeStricklerType( aType, aText );
+}
+
+void HYDROGUI_CalculationDlg::onLandCoverZonesDropped( const QList<SUIT_DataObject*>& theList, 
+    SUIT_DataObject* theTargetParent, int theTargetRow, Qt::DropAction theDropAction )
+{
+  QList<SUIT_DataObject*> aZonesList;
+  HYDROGUI_Zone* aZone;
+  // Get a list of dropped land cover zones
+  for ( int i = 0; i < theList.length(); i++ )
+  {
+    aZone = dynamic_cast<HYDROGUI_Zone*>( theList.at( i ) );
+    if ( aZone )
+    {
+      aZonesList.append( aZone );
+    }
+  }
+  if ( aZonesList.length() > 0 )
+  {
+    // Get the target region
+    HYDROGUI_NamedObject* aRegionsRoot = dynamic_cast<HYDROGUI_NamedObject*>(theTargetParent);
+    if ( aRegionsRoot )
+    {
+      // Create a new region
+      emit createLandCoverRegion( aZonesList );
+    }
+    else
+    {
+      HYDROGUI_Region* aRegion = dynamic_cast<HYDROGUI_Region*>(theTargetParent);
+      if ( aRegion )
+      {
+        emit moveZones( theTargetParent, aZonesList, true );
+      }
+    }
+  }
+}
+
 void HYDROGUI_CalculationDlg::setObjectName( const QString& theName )
 {
   myObjectName->setText( theName );
@@ -662,7 +783,6 @@ void moveItems( QListWidget* theSource, QListWidget* theDest, const QStringList&
 
 void HYDROGUI_CalculationDlg::includeGeomObjects( const QStringList& theObjects )
 {
-  HYDROGUI_ListModel::Object2VisibleList anObjectsToInclude;
   QList<QListWidgetItem*> aFoundItems;
   foreach ( const QString& anObjName, theObjects ) {
     // Hide the object in the available objects list
@@ -800,13 +920,22 @@ void HYDROGUI_CalculationDlg::setEditedObject( const Handle(HYDROData_Calculatio
   myValidator->setEditedObject( theCase );
 
   // Build the calculation case subtree
-  module()->getDataModel()->buildCaseTree( myBrowser->root(), myEditedObject );
+  module()->getDataModel()->buildCaseTree( myBrowser->root(), myEditedObject, false );
 
   myBrowser->updateTree();
   myBrowser->openLevels();
   myBrowser->adjustColumnsWidth();
   myBrowser->setAutoUpdate( true );
   myBrowser->setUpdateModified( true );
+
+  // Build the calculation case subtree for Land Cover regions
+  module()->getDataModel()->buildCaseTree( myLandCoverBrowser->root(), myEditedObject, true );
+
+  myLandCoverBrowser->updateTree();
+  myLandCoverBrowser->openLevels();
+  myLandCoverBrowser->adjustColumnsWidth();
+  myLandCoverBrowser->setAutoUpdate( true );
+  myLandCoverBrowser->setUpdateModified( true );
 }
 
 HYDROGUI_Zone* HYDROGUI_CalculationDlg::getCurrentZone() const
@@ -818,14 +947,14 @@ void HYDROGUI_CalculationDlg::refreshZonesBrowser()
 {
   SUIT_DataObject* aRoot = myBrowser->root();
   module()->getDataModel()->updateObjectTree( myEditedObject );
-  module()->getDataModel()->buildCaseTree( aRoot, myEditedObject );
+  module()->getDataModel()->buildCaseTree( aRoot, myEditedObject, false );
   myBrowser->updateTree( aRoot );
 }
 
 void HYDROGUI_CalculationDlg::onDataChanged()
 {
   SUIT_DataObject* aRoot = myBrowser->root();
-  module()->getDataModel()->buildCaseTree( aRoot, myEditedObject );
+  module()->getDataModel()->buildCaseTree( aRoot, myEditedObject, false );
   myBrowser->updateTree( aRoot );
 }
 
@@ -926,7 +1055,7 @@ void HYDROGUI_CalculationDlg::setEditZonesEnabled( const bool theIsEnabled )
   Enable/disable land covers drag'n'drop and renaming.
   @param theIsEnabled if true - land covers drag'n'drop and renaming will be enabled
 */
-void HYDROGUI_CalculationDlg::setEditLandCoversEnabled( const bool theIsEnabled )
+void HYDROGUI_CalculationDlg::setEditLandCoverZonesEnabled( const bool theIsEnabled )
 {
   myLandCoverBrowser->setReadOnly( !theIsEnabled );
 }
@@ -935,10 +1064,10 @@ void HYDROGUI_CalculationDlg::setEditLandCoversEnabled( const bool theIsEnabled
   Get included geometry objects.
   @return the list of geometry objects
  */
-QList<Handle(HYDROData_Object)> HYDROGUI_CalculationDlg::getGeometryObjects()
+QList<Handle(HYDROData_Entity)> HYDROGUI_CalculationDlg::getGeometryObjects()
 {
   QList<Handle(HYDROData_Entity)> anEntities = myGeomObjects->getObjects();
-  QList<Handle(HYDROData_Object)> anObjects;
+  QList<Handle(HYDROData_Entity)> anObjects;
 
   foreach ( Handle(HYDROData_Entity) anEntity, anEntities ) {
     Handle(HYDROData_Object) anObj = Handle(HYDROData_Object)::DownCast( anEntity );
@@ -956,10 +1085,10 @@ QList<Handle(HYDROData_Object)> HYDROGUI_CalculationDlg::getGeometryObjects()
   Get included land covers.
   @return the list of land covers
  */
-QList<Handle(HYDROData_LandCover)> HYDROGUI_CalculationDlg::getLandCovers()
+QList<Handle(HYDROData_Entity)> HYDROGUI_CalculationDlg::getLandCovers()
 {
   QList<Handle(HYDROData_Entity)> anEntities = myLandCovers->getObjects();
-  QList<Handle(HYDROData_LandCover)> aLandCovers;
+  QList<Handle(HYDROData_Entity)> aLandCovers;
 
   foreach ( Handle(HYDROData_Entity) anEntity, anEntities ) {
     Handle(HYDROData_LandCover) aLandCover = Handle(HYDROData_LandCover)::DownCast( anEntity );
@@ -991,6 +1120,24 @@ void  HYDROGUI_CalculationDlg::setRules( const HYDROData_ListOfRules& theRules )
   myPriorityWidget->setRules( theRules );
 }
 
+/**
+  Get rules defined for land covers.
+  @return the list of rules
+ */
+HYDROData_ListOfRules HYDROGUI_CalculationDlg::getLandCoverRules() const
+{
+  return myLandCoverPriorityWidget->getRules();
+}
+
+/**
+  Set rules for land covers.
+  @param theRules the list of rules
+ */
+void  HYDROGUI_CalculationDlg::setLandCoverRules( const HYDROData_ListOfRules& theRules ) const
+{
+  myLandCoverPriorityWidget->setRules( theRules );
+}
+
 /**
   Slot called when objects order is changed.
  */
@@ -1004,16 +1151,39 @@ void HYDROGUI_CalculationDlg::onOrderChanged()
     myGeomObjects->undoLastMove();
 }
 
-void HYDROGUI_CalculationDlg::setStricklerTable( const QString& theStricklerTableName )
+/**
+  Slot called when priority rule for geometry objects is changed.
+ */
+void HYDROGUI_CalculationDlg::onRuleChanged()
+{
+  bool isConfirmed = true;
+  emit ruleChanged( isConfirmed );
+  if( !isConfirmed )
+    myPriorityWidget->undoLastChange();
+}
+
+void HYDROGUI_CalculationDlg::setStricklerTable( const QString& theStricklerTableName, bool theBlockSignals )
 {
-  bool isBlocked = myStricklerTableName->blockSignals( true );
+  bool isBlocked;
+  if ( theBlockSignals )
+    isBlocked = myStricklerTableName->blockSignals( true );
+  
   myStricklerTableName->setCurrentIndex( myStricklerTableName->findText( theStricklerTableName ) );
-  myStricklerTableName->blockSignals( isBlocked );
+
+  if ( theBlockSignals )
+    myStricklerTableName->blockSignals( isBlocked );
+  else
+    emit StricklerTableSelected( theStricklerTableName );
 }
 
-void HYDROGUI_CalculationDlg::includeLandCovers( const QStringList& theLandCovers )
+void HYDROGUI_CalculationDlg::includeLandCovers( const QStringList& theLandCovers, bool theReset )
 {
-  HYDROGUI_ListModel::Object2VisibleList anObjectsToInclude;
+  if ( theReset )
+  {
+    HYDROGUI_ListModel::Object2VisibleList anObject2VisibleList;
+    myLandCovers->setObjects(anObject2VisibleList);
+  }
+        
   QList<QListWidgetItem*> aFoundItems;
   foreach ( const QString& anObjName, theLandCovers ) {
     // Hide the land cover in the available land covers list
@@ -1028,8 +1198,7 @@ void HYDROGUI_CalculationDlg::includeLandCovers( const QStringList& theLandCover
     myLandCovers->addObject( HYDROGUI_ListModel::Object2Visible( anObject, true ) );
   }
 
-  // TODO: adapt HYDROGUI_PriorityWidget to process land covers
-  //myLandCoverPriorityWidget->setObjects( getLandCovers() );
+  myLandCoverPriorityWidget->setObjects( getLandCovers() );
 }
 
 void HYDROGUI_CalculationDlg::excludeLandCovers( const QStringList& theLandCovers )
@@ -1046,8 +1215,25 @@ void HYDROGUI_CalculationDlg::excludeLandCovers( const QStringList& theLandCover
     myLandCovers->removeObjectByName( anObjName );
   }
 
-  // TODO: adapt HYDROGUI_PriorityWidget to process land covers
-  //myLandCoverPriorityWidget->setObjects( getLandCovers() );
+  myLandCoverPriorityWidget->setObjects( getLandCovers() );
+}
+
+void HYDROGUI_CalculationDlg::refreshLandCoverZonesBrowser()
+{
+  SUIT_DataObject* aRoot = myLandCoverBrowser->root();
+  module()->getDataModel()->updateObjectTree( myEditedObject );
+  module()->getDataModel()->buildCaseTree( aRoot, myEditedObject, true );
+  myLandCoverBrowser->updateTree( aRoot );
+}
+
+/**
+  Slot called when zones created on land covers are changed.
+ */
+void HYDROGUI_CalculationDlg::onDataLandCoverChanged()
+{
+  SUIT_DataObject* aRoot = myLandCoverBrowser->root();
+  module()->getDataModel()->buildCaseTree( aRoot, myEditedObject, true );
+  myLandCoverBrowser->updateTree( aRoot );
 }
 
 /**
@@ -1057,9 +1243,19 @@ void HYDROGUI_CalculationDlg::onOrderLandCoverChanged()
 {
   bool isConfirmed = true;
   emit orderLandCoverChanged( isConfirmed );
-  // TODO: adapt HYDROGUI_PriorityWidget to process land covers
-  /*if( isConfirmed )
+  if( isConfirmed )
     myLandCoverPriorityWidget->setObjects( getLandCovers() );
-  else*/
+  else
     myLandCovers->undoLastMove();  
 }
+
+/**
+  Slot called when priority rule for land covers is changed.
+ */
+void HYDROGUI_CalculationDlg::onLandCoverRuleChanged()
+{
+  bool isConfirmed = true;
+  emit ruleLandCoverChanged( isConfirmed );
+  if( !isConfirmed )
+    myLandCoverPriorityWidget->undoLastChange();
+}