X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_CalculationDlg.cxx;h=b796efb14921937be1e489beb132b2614e166457;hb=d6e19029f8b41f295db878e9aecf451c2edda4af;hp=49d6188827c69f86837afd2322ef17ba0e9c8110;hpb=439579ec24edd8b147cab07f688d446d59029a1e;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_CalculationDlg.cxx b/src/HYDROGUI/HYDROGUI_CalculationDlg.cxx index 49d61888..b796efb1 100644 --- a/src/HYDROGUI/HYDROGUI_CalculationDlg.cxx +++ b/src/HYDROGUI/HYDROGUI_CalculationDlg.cxx @@ -30,6 +30,7 @@ #include "HYDROGUI_Zone.h" #include "HYDROGUI_OrderedListWidget.h" #include "HYDROGUI_PriorityWidget.h" +#include "HYDROGUI_PriorityTableModel.h" #include #include @@ -70,7 +71,9 @@ HYDROGUI_CalculationDlg::HYDROGUI_CalculationDlg( HYDROGUI_Module* theModule, co { addPage( createObjectsPage() ); addPage( createGroupsPage() ); + addPage( createLandCoversPage() ); addPage( createZonesPage() ); + addPage( createLandCoversPartitionPage() ); } HYDROGUI_CalculationDlg::~HYDROGUI_CalculationDlg() @@ -82,15 +85,20 @@ void HYDROGUI_CalculationDlg::reset() myObjectName->clear(); HYDROGUI_ListModel::Object2VisibleList anObject2VisibleList; myGeomObjects->setObjects(anObject2VisibleList); + myLandCovers->setObjects(anObject2VisibleList); myPolylineName->clear(); + myStricklerTableName->clear(); myAvailableGeomObjects->clear(); + myAvailableLandCovers->clear(); // Activate the automatic mode setMode( HYDROData_CalculationCase::AUTOMATIC ); + setLandCoverMode( HYDROData_CalculationCase::AUTOMATIC ); // Reset the priority widget state - QList anObjects; + QList anObjects; myPriorityWidget->setObjects( anObjects ); + myLandCoverPriorityWidget->setObjects( anObjects ); } QWizardPage* HYDROGUI_CalculationDlg::createObjectsPage() { @@ -303,6 +311,143 @@ QWizardPage* HYDROGUI_CalculationDlg::createGroupsPage() { return aPage; } +QWizardPage* HYDROGUI_CalculationDlg::createLandCoversPage() { + QWizardPage* aPage = new QWizardPage( mainFrame() ); + QFrame* aFrame = new QFrame( aPage ); + + // Splitter + myLandCoverSplitter = new QSplitter(Qt::Vertical); + + // Top of the page + QWidget* aTopContainer = new QWidget; + + // Combo-box to choose Strickler table name + QLabel* aStricklerTableLabel = new QLabel( tr( "STRICKLER_TABLE" ), aPage ); + myStricklerTableName = new QComboBox( aPage ); + myStricklerTableName->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + connect( myStricklerTableName, SIGNAL( activated( const QString & ) ), + SIGNAL( StricklerTableSelected( const QString & ) ) ); + + // Mode selector (auto/manual) + QGroupBox* aModeGroup = new QGroupBox( tr( "MODE" ) ); + + QRadioButton* aManualRB = new QRadioButton( tr( "MANUAL" ), mainFrame() ); + QRadioButton* anAutoRB = new QRadioButton( tr( "AUTO" ), mainFrame() ); + + myLandCoverModeButtons = new QButtonGroup( mainFrame() ); + myLandCoverModeButtons->addButton( anAutoRB, HYDROData_CalculationCase::AUTOMATIC ); + myLandCoverModeButtons->addButton( aManualRB, HYDROData_CalculationCase::MANUAL ); + + QBoxLayout* aModeSelectorLayout = new QHBoxLayout; + aModeSelectorLayout->setMargin( 5 ); + aModeSelectorLayout->setSpacing( 5 ); + aModeSelectorLayout->addWidget( anAutoRB ); + aModeSelectorLayout->addWidget( aManualRB ); + aModeGroup->setLayout( aModeSelectorLayout ); + + // Available land covers + QLabel* aLandCoversLabel = new QLabel( tr( "CALCULATION_REFERENCE_LAND_COVERS" ) ); + myAvailableLandCovers = new QListWidget( aPage ); + myAvailableLandCovers->setSelectionMode( QListWidget::ExtendedSelection ); + myAvailableLandCovers->setEditTriggers( QListWidget::NoEditTriggers ); + myAvailableLandCovers->setViewMode( QListWidget::ListMode ); + myAvailableLandCovers->setSortingEnabled( true ); + + // Included land covers + QLabel* anIncludedLabel = new QLabel( tr( "INCLUDED_LAND_COVERS" ) ); + myLandCovers = new HYDROGUI_OrderedListWidget( aPage, 16 ); + myLandCovers->setHiddenObjectsShown(true); + myLandCovers->setVisibilityIconShown(false); + myLandCovers->setContentsMargins(QMargins()); + + // Include/Exclude buttons + QFrame* aBtnsFrame = new QFrame; + QVBoxLayout* aBtnsLayout = new QVBoxLayout( aBtnsFrame ); + aBtnsLayout->setMargin( 5 ); + aBtnsLayout->setSpacing( 5 ); + aBtnsFrame->setLayout( aBtnsLayout ); + QPushButton* anAddBtn = new QPushButton( tr("INCLUDE"), aBtnsFrame ); + QPushButton* aRemoveBtn = new QPushButton( tr("EXCLUDE"), aBtnsFrame ); + + // Fill the butons frame with two buttons + aBtnsLayout->addWidget( anAddBtn ); + aBtnsLayout->addWidget( aRemoveBtn ); + aBtnsLayout->addStretch( 1 ); + + // Land covers frame + QFrame* aLandCoversFrame = new QFrame( aPage ); + aLandCoversFrame->setFrameStyle( QFrame::Panel | QFrame::Raised ); + QGridLayout* aLandCoversLayout = new QGridLayout( aLandCoversFrame ); + aLandCoversLayout->setMargin( 5 ); + aLandCoversLayout->setSpacing( 5 ); + aLandCoversFrame->setLayout( aLandCoversLayout ); + + // Fill the land covers frame with two lists, two labels and with buttons frame + aLandCoversLayout->addWidget( aLandCoversLabel, 0, 0, Qt::AlignHCenter ); + aLandCoversLayout->addWidget( anIncludedLabel, 0, 2, Qt::AlignHCenter ); + aLandCoversLayout->addWidget( myAvailableLandCovers, 1, 0 ); + aLandCoversLayout->addWidget( aBtnsFrame, 1, 1, Qt::AlignHCenter ); + aLandCoversLayout->addWidget( myLandCovers, 1, 2 ); + + // Fill the top layout of the page + QGridLayout* aTopLayout = new QGridLayout; + aTopLayout->setMargin( 5 ); + aTopLayout->setSpacing( 5 ); + aTopLayout->setVerticalSpacing( 10 ); + aTopLayout->addWidget( aStricklerTableLabel, 0, 0, Qt::AlignHCenter ); + aTopLayout->addWidget( myStricklerTableName, 0, 1 ); + aTopLayout->addWidget( aModeGroup, 1, 0, 1, 2 ); + aTopLayout->addWidget( aLandCoversFrame, 2, 0, 1, 2 ); + + aTopContainer->setLayout( aTopLayout ); + + // Add the top of the page to the splitter + myLandCoverSplitter->insertWidget(0, aTopContainer); + myLandCoverSplitter->setStretchFactor(0, 2); + + // Bottom of the page + myLandCoverPriorityWidget = new HYDROGUI_PriorityWidget( mainFrame() ); + HYDROGUI_PriorityTableModel* aModel = + dynamic_cast( myLandCoverPriorityWidget->getTable()->model() ); + if ( aModel ) + aModel->setColumnCount( 3 ); + + QGroupBox* aPriorityGroup = new QGroupBox( tr( "PRIORITY" ) ); + QBoxLayout* aPriorityLayout = new QHBoxLayout; + aPriorityLayout->setMargin( 5 ); + aPriorityLayout->setSpacing( 5 ); + aPriorityLayout->addWidget( myLandCoverPriorityWidget ); + aPriorityGroup->setLayout( aPriorityLayout ); + + // Add the bottom of the page to the splitter + myLandCoverSplitter->insertWidget(1, aPriorityGroup); + myLandCoverSplitter->setStretchFactor(1, 1); + + // Page layout + QVBoxLayout* aPageLayout = new QVBoxLayout; + aPageLayout->setMargin( 5 ); + aPageLayout->setSpacing( 5 ); + aPageLayout->addWidget( myLandCoverSplitter ); + + aPage->setLayout( aPageLayout ); + + // Create selector + if ( module() ) { + HYDROGUI_ListSelector* aListSelector = + new HYDROGUI_ListSelector( myLandCovers, module()->getApp()->selectionMgr() ); + aListSelector->setAutoBlock( true ); + } + + // Connections + connect( myLandCoverModeButtons, SIGNAL( buttonClicked( int ) ), SIGNAL( changeLandCoverMode( int ) ) ); + connect( anAddBtn, SIGNAL( clicked() ), SIGNAL( addLandCovers() ) ); + connect( aRemoveBtn, SIGNAL( clicked() ), SIGNAL( removeLandCovers() ) ); + + connect( myLandCovers, SIGNAL( orderLandCoverChanged() ), SLOT( onOrderLandCoverChanged() ) ); + + return aPage; +} + QWizardPage* HYDROGUI_CalculationDlg::createZonesPage() { QWizardPage* aPage = new QWizardPage( mainFrame() ); QFrame* aFrame = new QFrame( aPage ); @@ -339,6 +484,27 @@ QWizardPage* HYDROGUI_CalculationDlg::createZonesPage() { return aPage; } +QWizardPage* HYDROGUI_CalculationDlg::createLandCoversPartitionPage() { + QWizardPage* aPage = new QWizardPage( mainFrame() ); + QFrame* aFrame = new QFrame( aPage ); + + QGridLayout* aLayout = new QGridLayout( aPage ); + + myLandCoverBrowser = new HYDROGUI_DataBrowser( module(), NULL, aPage ); + myLandCoverBrowser->setAutoOpenLevel( 3 ); + aLayout->setMargin( 5 ); + aLayout->setSpacing( 5 ); + + aLayout->addWidget( myLandCoverBrowser, 0, 0, 1, 2 ); + + aPage->setLayout( aLayout ); + + // Connections + //... + + return aPage; +} + bool HYDROGUI_CalculationDlg::acceptCurrent() const { @@ -502,7 +668,6 @@ void moveItems( QListWidget* theSource, QListWidget* theDest, const QStringList& void HYDROGUI_CalculationDlg::includeGeomObjects( const QStringList& theObjects ) { - HYDROGUI_ListModel::Object2VisibleList anObjectsToInclude; QList aFoundItems; foreach ( const QString& anObjName, theObjects ) { // Hide the object in the available objects list @@ -554,6 +719,17 @@ void HYDROGUI_CalculationDlg::setPolylineNames( const QStringList& theObjects, c myPolylineName->addItem( theObjects.at( i ), theObjectsEntries.at( i ) ); } } + +void HYDROGUI_CalculationDlg::setStricklerTableNames( const QStringList& theObjects, const QStringList& theObjectsEntries ) +{ + myStricklerTableName->clear(); + + for ( int i = 0, n = theObjects.length(); i < n; ++i ) + { + myStricklerTableName->addItem( theObjects.at( i ), theObjectsEntries.at( i ) ); + } +} + void HYDROGUI_CalculationDlg::setAllGeomObjects( const QStringList& theObjects, const QStringList& theObjectsEntries ) { myAvailableGeomObjects->clear(); @@ -568,6 +744,20 @@ void HYDROGUI_CalculationDlg::setAllGeomObjects( const QStringList& theObjects, } } +void HYDROGUI_CalculationDlg::setAllLandCovers( const QStringList& theObjects, const QStringList& theObjectsEntries ) +{ + myAvailableLandCovers->clear(); + + for ( int i = 0, n = theObjects.length(); i < n; ++i ) + { + QString anObjName = theObjects.at( i ); + + QListWidgetItem* aListItem = new QListWidgetItem( anObjName, myAvailableLandCovers ); + aListItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable ); + aListItem->setData( Qt::UserRole, theObjectsEntries.at( i ) ); + } +} + QStringList getSelected( QListWidget* theWidget ) { QStringList aResList; @@ -584,16 +774,31 @@ QStringList HYDROGUI_CalculationDlg::getSelectedGeomObjects() const return myGeomObjects->getSelectedNames(); } +QStringList HYDROGUI_CalculationDlg::getSelectedLandCovers() const +{ + return myLandCovers->getSelectedNames(); +} + QStringList HYDROGUI_CalculationDlg::getAllGeomObjects() const { return myGeomObjects->getAllNames(); } +QStringList HYDROGUI_CalculationDlg::getAllLandCovers() const +{ + return myLandCovers->getAllNames(); +} + QStringList HYDROGUI_CalculationDlg::getSelectedAvailableGeomObjects() const { return getSelected( myAvailableGeomObjects ); } +QStringList HYDROGUI_CalculationDlg::getSelectedAvailableLandCovers() const +{ + return getSelected( myAvailableLandCovers ); +} + void HYDROGUI_CalculationDlg::setEditedObject( const Handle(HYDROData_CalculationCase) theCase ) { myEditedObject = theCase; @@ -685,6 +890,34 @@ void HYDROGUI_CalculationDlg::setMode( int theMode ) } } +/** + Get creation mode for land covers panel. + @param theMode the mode +*/ +int HYDROGUI_CalculationDlg::getLandCoverMode() const +{ + return myLandCoverModeButtons->checkedId(); +} + +/** + Set creation mode for land cover panel. + @param theMode the mode +*/ +void HYDROGUI_CalculationDlg::setLandCoverMode( int theMode ) +{ + bool isBlocked = myLandCoverModeButtons->blockSignals( true ); + myLandCoverModeButtons->button( theMode )->setChecked( true ); + myLandCoverModeButtons->blockSignals( isBlocked ); + + bool isAuto = ( theMode == HYDROData_CalculationCase::AUTOMATIC ); + + myLandCovers->setOrderingEnabled( isAuto ); + QWidget* aWidget = myLandCoverSplitter->widget( 1 ); + if ( aWidget ) { + aWidget->setVisible( isAuto ); + } +} + /** Enable/disable zones drag'n'drop and renaming. @param theIsEnabled if true - zones drag'n'drop and renaming will be enabled @@ -694,14 +927,23 @@ void HYDROGUI_CalculationDlg::setEditZonesEnabled( const bool theIsEnabled ) myBrowser->setReadOnly( !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 ) +{ + myLandCoverBrowser->setReadOnly( !theIsEnabled ); +} + /** Get included geometry objects. @return the list of geometry objects */ -QList HYDROGUI_CalculationDlg::getGeometryObjects() +QList HYDROGUI_CalculationDlg::getGeometryObjects() { QList anEntities = myGeomObjects->getObjects(); - QList anObjects; + QList anObjects; foreach ( Handle(HYDROData_Entity) anEntity, anEntities ) { Handle(HYDROData_Object) anObj = Handle(HYDROData_Object)::DownCast( anEntity ); @@ -715,6 +957,27 @@ QList HYDROGUI_CalculationDlg::getGeometryObjects() return anObjects; } +/** + Get included land covers. + @return the list of land covers + */ +QList HYDROGUI_CalculationDlg::getLandCovers() +{ + QList anEntities = myLandCovers->getObjects(); + QList aLandCovers; + + foreach ( Handle(HYDROData_Entity) anEntity, anEntities ) { + Handle(HYDROData_LandCover) aLandCover = Handle(HYDROData_LandCover)::DownCast( anEntity ); + if ( aLandCover.IsNull() ) { + continue; + } + + aLandCovers << aLandCover; + } + + return aLandCovers; +} + /** Get rules. @return the list of rules @@ -733,10 +996,102 @@ 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. */ void HYDROGUI_CalculationDlg::onOrderChanged() { - myPriorityWidget->setObjects( getGeometryObjects() ); + bool isConfirmed = true; + emit orderChanged( isConfirmed ); + if( isConfirmed ) + myPriorityWidget->setObjects( getGeometryObjects() ); + else + myGeomObjects->undoLastMove(); +} + +void HYDROGUI_CalculationDlg::setStricklerTable( const QString& theStricklerTableName, bool theBlockSignals ) +{ + bool isBlocked; + if ( theBlockSignals ) + isBlocked = myStricklerTableName->blockSignals( true ); + + myStricklerTableName->setCurrentIndex( myStricklerTableName->findText( theStricklerTableName ) ); + + if ( theBlockSignals ) + myStricklerTableName->blockSignals( isBlocked ); + else + emit StricklerTableSelected( theStricklerTableName ); +} + +void HYDROGUI_CalculationDlg::includeLandCovers( const QStringList& theLandCovers, bool theReset ) +{ + if ( theReset ) + { + HYDROGUI_ListModel::Object2VisibleList anObject2VisibleList; + myLandCovers->setObjects(anObject2VisibleList); + } + + QList aFoundItems; + foreach ( const QString& anObjName, theLandCovers ) { + // Hide the land cover in the available land covers list + aFoundItems = myAvailableLandCovers->findItems( anObjName, Qt::MatchExactly ); + foreach ( QListWidgetItem* anItem, aFoundItems ) { + anItem->setHidden( true ); + } + + // Add the land cover to the list of included objects + Handle(HYDROData_Entity) anObject = + HYDROGUI_Tool::FindObjectByName( module(), anObjName ); + myLandCovers->addObject( HYDROGUI_ListModel::Object2Visible( anObject, true ) ); + } + + myLandCoverPriorityWidget->setObjects( getLandCovers() ); +} + +void HYDROGUI_CalculationDlg::excludeLandCovers( const QStringList& theLandCovers ) +{ + QList aFoundItems; + foreach ( const QString& anObjName, theLandCovers ) { + // Set visible the land cover in the available objects list + aFoundItems = myAvailableLandCovers->findItems( anObjName, Qt::MatchExactly ); + foreach ( QListWidgetItem* anItem, aFoundItems ) { + anItem->setHidden( false ); + } + + // Remove the land cover from the list of included objects + myLandCovers->removeObjectByName( anObjName ); + } + + myLandCoverPriorityWidget->setObjects( getLandCovers() ); +} + +/** + Slot called when land covers order is changed. + */ +void HYDROGUI_CalculationDlg::onOrderLandCoverChanged() +{ + bool isConfirmed = true; + emit orderLandCoverChanged( isConfirmed ); + if( isConfirmed ) + myLandCoverPriorityWidget->setObjects( getLandCovers() ); + else + myLandCovers->undoLastMove(); }