X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_StricklerTableDlg.cxx;h=4282490f65b55dd5dfe3d92d7287b3f883ddfca4;hb=d6bfe7c45ecf0dc6ed9819a40ce28b73b49d9592;hp=1d13f24f407041f1216a5bc3e7983759951fa4cc;hpb=35d2822e3e33ca225dcc1ba24e6684a43e3bb2d1;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_StricklerTableDlg.cxx b/src/HYDROGUI/HYDROGUI_StricklerTableDlg.cxx index 1d13f24f..4282490f 100644 --- a/src/HYDROGUI/HYDROGUI_StricklerTableDlg.cxx +++ b/src/HYDROGUI/HYDROGUI_StricklerTableDlg.cxx @@ -16,122 +16,405 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -#include "HYDROGUI_StricklerTableDlg.h" -#include "HYDROGUI_Module.h" - -#include - -#include -#include +#include +#include +#include +#include #include -#include -#include - +#ifndef LIGHT_MODE +#include +#include +#endif +#include +#include #include +#include +#include #include +#include +#include #include -#include -#include -HYDROGUI_StricklerTableDlg::HYDROGUI_StricklerTableDlg( HYDROGUI_Module* theModule, const QString& theTitle ) -: HYDROGUI_InputPanel( theModule, theTitle ), myName(NULL) +HYDROGUI_ColorDelegate::HYDROGUI_ColorDelegate( QWidget* theParent ) +{ +} + +HYDROGUI_ColorDelegate::~HYDROGUI_ColorDelegate() +{ +} + +void HYDROGUI_ColorDelegate::paint( QPainter* thePainter, const QStyleOptionViewItem& theOption, + const QModelIndex& theIndex ) const +{ + QColor aColor = qVariantValue( theIndex.data( Qt::BackgroundColorRole ) ); + thePainter->fillRect( theOption.rect, aColor ); +} + +QWidget* HYDROGUI_ColorDelegate::createEditor( QWidget* theParent, + const QStyleOptionViewItem& theOption, + const QModelIndex& theIndex ) const +{ + QColor aColor = qVariantValue( theIndex.data( Qt::BackgroundColorRole ) ); + QColor aNewColor = QColorDialog::getColor( aColor ); + if( aNewColor.isValid() ) + { + QAbstractItemModel* aModel = const_cast( theIndex.model() ); + QVariant aValue = qVariantFromValue( aNewColor ); + aModel->setData( theIndex, aValue, Qt::BackgroundColorRole ); + } + return 0; +} + +void HYDROGUI_ColorDelegate::setEditorData( QWidget* theEditor, const QModelIndex& theIndex ) const +{ +} + +void HYDROGUI_ColorDelegate::setModelData( QWidget* theEditor, QAbstractItemModel* theModel, + const QModelIndex& theIndex ) const +{ +} + +QSize HYDROGUI_ColorDelegate::sizeHint( const QStyleOptionViewItem& theOption, const QModelIndex& theIndex ) const +{ + return theOption.rect.size(); +} + + + +const int COLUMNS_COUNT = 4; + + +HYDROGUI_StricklerTableDlg::HYDROGUI_StricklerTableDlg( HYDROGUI_Module* theModule, const QString& theTitle, int theType ) +: HYDROGUI_InputPanel( theModule, theTitle ), + myType( theType ) { - SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); + QString fileGroupTitle = theType == Export ? tr( "EXPORT_STRICKLER_TABLE_FILE" ) : tr( "IMPORT_STRICKLER_TABLE_FILE" ); + + // Import Strickler table from file + QGroupBox* aFileNameGroup = new QGroupBox( fileGroupTitle, this ); + aFileNameGroup->setVisible( theType != Edit ); + + QLabel* aFileNameLabel = new QLabel( tr( "FILE_NAME" ), aFileNameGroup ); + + myFileName = new QLineEdit( aFileNameGroup ); + myFileName->setReadOnly( true ); + + QToolButton* aBrowseBtn = new QToolButton( aFileNameGroup ); +#ifndef LIGHT_MODE + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); + aBrowseBtn->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "BROWSE_ICO" ) ) ); +#endif + + QBoxLayout* aFileNameLayout = new QHBoxLayout( aFileNameGroup ); + aFileNameLayout->setMargin( 5 ); + aFileNameLayout->setSpacing( 5 ); + aFileNameLayout->addWidget( aFileNameLabel ); + aFileNameLayout->addWidget( myFileName ); + aFileNameLayout->addWidget( aBrowseBtn ); - // Import Strickler table from file - myFileNameGroup = new QGroupBox( tr( "IMPORT_STRICKLER_TABLE_FROM_FILE" ), this ); + // Strickler table name + QGroupBox* aNameGroup = new QGroupBox( tr( "STRICKLER_TABLE_NAME" ), this ); - QLabel* aFileNameLabel = new QLabel( tr( "FILE_NAME" ), myFileNameGroup ); + QLabel* anImageNameLabel = new QLabel( tr( "NAME" ), aNameGroup ); + myName = new QLineEdit( aNameGroup ); - myFileName = new QLineEdit( myFileNameGroup ); - myFileName->setReadOnly( true ); + QGroupBox* aAttrNameGroup = new QGroupBox( tr( "STRICKLER_TABLE_ATTR_NAME" ), this ); + QLabel* aAttrNameLabel = new QLabel( tr( "ATTR_NAME" ), aAttrNameGroup ); + myAttrName = new QLineEdit( aAttrNameGroup ); - myBrowseBtn = new QToolButton( myFileNameGroup ); - myBrowseBtn->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "BROWSE_ICO" ) ) ); + QBoxLayout* anImageNameLayout = new QHBoxLayout( aNameGroup ); + anImageNameLayout->setMargin( 5 ); + anImageNameLayout->setSpacing( 5 ); + anImageNameLayout->addWidget( anImageNameLabel ); + anImageNameLayout->addWidget( myName ); - QBoxLayout* aFileNameLayout = new QHBoxLayout( myFileNameGroup ); - aFileNameLayout->setMargin( 5 ); - aFileNameLayout->setSpacing( 5 ); - aFileNameLayout->addWidget( aFileNameLabel ); - aFileNameLayout->addWidget( myFileName ); - aFileNameLayout->addWidget( myBrowseBtn ); + QBoxLayout* anAttrNameLayout = new QHBoxLayout( aAttrNameGroup ); + anAttrNameLayout->setMargin( 5 ); + anAttrNameLayout->setSpacing( 5 ); + anAttrNameLayout->addWidget( aAttrNameLabel ); + anAttrNameLayout->addWidget( myAttrName ); - // Strickler table name - myNameGroup = new QGroupBox( tr( "STRICKLER_TABLE_NAME" ), this ); + // Strickler table + QGroupBox* aTableGroup = new QGroupBox( tr( "STRICKLER_TABLE_TABLE" ), this ); + aTableGroup->setVisible( theType == Edit ); - QLabel* anImageNameLabel = new QLabel( tr( "NAME" ), myNameGroup ); - myName = new QLineEdit( myNameGroup ); + // Main layout + QVBoxLayout* aTableLayout = new QVBoxLayout( aTableGroup ); + aTableLayout->setMargin( 5 ); + aTableLayout->setSpacing( 5 ); - QBoxLayout* anImageNameLayout = new QHBoxLayout( myNameGroup ); - anImageNameLayout->setMargin( 5 ); - anImageNameLayout->setSpacing( 5 ); - anImageNameLayout->addWidget( anImageNameLabel ); - anImageNameLayout->addWidget( myName ); + // Buttons + myAddBtn = new QToolButton; + myAddBtn->setText( tr( "ADD" ) ); + myRemoveBtn = new QToolButton; + myRemoveBtn->setText( tr( "REMOVE" ) ); + myClearBtn = new QToolButton; + myClearBtn->setText( tr( "CLEAR_ALL" ) ); - // Strickler table - //... + // Table + myTable = new QTableWidget( mainFrame() ); + myTable->setItemDelegateForColumn( 1, new HYDROGUI_LineEditDoubleValidator( this ) ); + myTable->setItemDelegateForColumn( 3, new HYDROGUI_ColorDelegate( this ) ); + myTable->setEditTriggers( QAbstractItemView::DoubleClicked | + QAbstractItemView::SelectedClicked | + QAbstractItemView::EditKeyPressed ); - // Common - addWidget( myFileNameGroup ); - addWidget( myNameGroup ); - //addWidget( myTableGroup ); - addStretch(); + myTable->setColumnCount( COLUMNS_COUNT ); + QStringList aColumnNames; + aColumnNames << tr( "STRICKLER_TYPE" ) << tr( "STRICKLER_COEFFICIENT" ) << tr( "ATTR_VALUE" ) << tr( "COLOR" ); + myTable->setHorizontalHeaderLabels( aColumnNames ); - connect( myBrowseBtn, SIGNAL( clicked() ), this, SLOT( onBrowse() ) ); + myTable->horizontalHeader()->setStretchLastSection( false ); + myTable->horizontalHeader()->setResizeMode( 0, QHeaderView::ResizeToContents ); + myTable->horizontalHeader()->setResizeMode( 1, QHeaderView::ResizeToContents ); + myTable->horizontalHeader()->setResizeMode( 2, QHeaderView::ResizeToContents ); + myTable->horizontalHeader()->setResizeMode( 3, QHeaderView::Stretch ); + myTable->horizontalHeader()->setMinimumSectionSize( 15 ); - setMinimumWidth( 350 ); + myTable->verticalHeader()->setResizeMode( QHeaderView::ResizeToContents ); + + // Layout + // buttons + QHBoxLayout* aButtonsLayout = new QHBoxLayout(); + aButtonsLayout->addWidget( myAddBtn ); + aButtonsLayout->addWidget( myRemoveBtn ); + aButtonsLayout->addStretch( 1 ); + aButtonsLayout->addWidget( myClearBtn ); + + // main + aTableLayout->addLayout( aButtonsLayout ); + aTableLayout->addWidget( myTable ); + + // Common + addWidget( aFileNameGroup ); + addWidget( aNameGroup ); + addWidget( aAttrNameGroup ); + addWidget( aTableGroup ); + + // Update controls + updateControls(); + + // Connections + connect( aBrowseBtn, SIGNAL( clicked() ), this, SLOT( onBrowse() ) ); + connect( myAddBtn, SIGNAL( clicked() ), this, SLOT( onAddCoefficient() ) ); + connect( myRemoveBtn, SIGNAL( clicked() ), this, SLOT( onRemoveCoefficient() ) ); + connect( myClearBtn, SIGNAL( clicked() ), this, SLOT( onClearCoefficients() ) ); + connect( myTable->selectionModel(), SIGNAL( selectionChanged( QItemSelection, QItemSelection ) ), + this, SLOT( onSelectionChanged() ) ); + + setMinimumWidth( 450 ); + + if ( theType != Edit ) + addStretch(); } HYDROGUI_StricklerTableDlg::~HYDROGUI_StricklerTableDlg() { } -void HYDROGUI_StricklerTableDlg::setIsEdit( const bool theIsEdit ) +void HYDROGUI_StricklerTableDlg::reset() { - myFileNameGroup->setVisible( !theIsEdit ); - myNameGroup->setEnabled( theIsEdit ); - //myTableGroup->setEnabled( theIsEdit ); + myFileName->clear(); + + myName->clear(); } -void HYDROGUI_StricklerTableDlg::reset() +QString HYDROGUI_StricklerTableDlg::getFileName() const { - myFileName->clear(); + return myFileName->text(); +} - myName->clear(); - myNameGroup->setEnabled( false ); - - //myTableGroup->setEnabled( false ); +void HYDROGUI_StricklerTableDlg::setFileName( const QString& theName ) +{ + myFileName->setText( theName ); +} - //myIsInitialized = false; +void HYDROGUI_StricklerTableDlg::setTableName( const QString& theName ) +{ + myName->setText(theName); } -QString HYDROGUI_StricklerTableDlg::getFileName() const +QString HYDROGUI_StricklerTableDlg::getTableName() const { - return myFileName->text(); + return myName->text(); } -void HYDROGUI_StricklerTableDlg::setFileName( const QString& theName ) +bool HYDROGUI_StricklerTableDlg::isTableNameReadOnly() const { - myFileName->setText( theName ); + return myName->isReadOnly(); } -void HYDROGUI_StricklerTableDlg::setStricklerTableName( const QString& theName ) +void HYDROGUI_StricklerTableDlg::setTableNameReadOnly( bool on ) { - myName->setText(theName); + myName->setReadOnly( on ); } -QString HYDROGUI_StricklerTableDlg::getStricklerTableName() const +void HYDROGUI_StricklerTableDlg::getGuiData( Handle_HYDROData_StricklerTable& theTable ) const { - return myName->text(); + if( theTable.IsNull() ) + return; + + theTable->SetAttrName( myAttrName->text() ); + theTable->Clear(); + for ( int i = 0; i < myTable->rowCount(); i++ ) + { + QTableWidgetItem* typeItem = myTable->item( i, 0 ); + QString aType = typeItem->data( Qt::DisplayRole ).toString(); + + QTableWidgetItem* coeffItem = myTable->item( i, 1 ); + QString aCoeffStr = coeffItem->data( Qt::DisplayRole ).toString(); + double aCoeff = aCoeffStr.toDouble(); + + QTableWidgetItem* attrValueItem = myTable->item( i, 2 ); + QString anAttrValue = attrValueItem->data( Qt::DisplayRole ).toString(); + + QTableWidgetItem* colorItem = myTable->item( i, 3 ); + QColor aColor = colorItem->backgroundColor(); + + theTable->Set( aType, aCoeff ); + theTable->SetAttrValue( aType, anAttrValue ); + theTable->SetColor( aType, aColor ); + } } -void HYDROGUI_StricklerTableDlg::onBrowse() +void HYDROGUI_StricklerTableDlg::setGuiData( const Handle_HYDROData_StricklerTable& theTable ) { - QString aFilter( tr( "STRICKLER_TABLE_FILTER" ) ); - QString aFileName = SUIT_FileDlg::getFileName( this, "", aFilter, tr( "IMPORT_STRICKLER_TABLE_FROM_FILE" ), true ); - if( !aFileName.isEmpty() ) + myAttrName->setText( theTable->GetAttrName() ); + + if( theTable.IsNull() ) { - setFileName( aFileName ); - emit fileSelected( aFileName ); + myTable->setRowCount( 0 ); + return; } + + QStringList aTypes = theTable->GetTypes(); + myTable->setRowCount( 0 ); + foreach( QString aType, aTypes ) + { + // Check the current Strickler type + if( aType.isEmpty() ) + continue; + + // Get Strickler data for the current Strickler type + QString aCoefficient = HYDROGUI_Tool::GetCoordinateString( theTable->Get( aType, 0.0 ), false ); + QString anAttrValue = theTable->GetAttrValue( aType ); + QColor aColor = theTable->GetColor( aType ); + + // Insert row with the data + int aRow = myTable->rowCount(); + myTable->insertRow( aRow ); + + // "Type" column + QTableWidgetItem* aTypeItem = new QTableWidgetItem( aType ); + myTable->setItem( aRow, 0, aTypeItem ); + + // "Coefficient" column + myTable->setItem( aRow, 1, new QTableWidgetItem( aCoefficient ) ); + + // "Attribute value" column + myTable->setItem( aRow, 2, new QTableWidgetItem( anAttrValue ) ); + + // "Color" column + QTableWidgetItem* anItem = new QTableWidgetItem(); + anItem->setBackgroundColor( aColor ); + myTable->setItem( aRow, 3, anItem ); + } + + myTable->resizeColumnToContents( 0 ); + myTable->resizeRowsToContents(); + + updateControls(); +} + +void HYDROGUI_StricklerTableDlg::updateControls() +{ + bool isTableNotEmpty = myTable->rowCount() > 0; + myClearBtn->setEnabled( isTableNotEmpty ); + onSelectionChanged(); +} + +void HYDROGUI_StricklerTableDlg::removeRows( const QList theRows ) +{ + QList aSortedRows = theRows; + qSort( aSortedRows ); + + int aRowToRemove = -1; + int aNbRemoved = 0; + foreach ( int aRow, aSortedRows ) { + aRowToRemove = aRow - aNbRemoved; + if ( myTable->model()->removeRow( aRowToRemove ) ) { + aNbRemoved++; + } + } + + if ( aNbRemoved > 0 ) + updateControls(); +} + +void HYDROGUI_StricklerTableDlg::onBrowse() +{ + QString aFilter( tr( "STRICKLER_TABLE_FILTER" ) ); + QString aFileName = SUIT_FileDlg::getFileName( this, "", aFilter, myFileName->parent()->property( "title" ).toString(), myType == Import ); + if ( !aFileName.isEmpty() ) + { + setFileName( aFileName ); + emit fileSelected( aFileName ); + } +} + +/** +Add the new default constructed Strickler coefficient. +*/ +void HYDROGUI_StricklerTableDlg::onAddCoefficient() +{ + int aRow = myTable->rowCount(); + myTable->insertRow( aRow ); + + for( int i=0; isetItem( aRow, i, new QTableWidgetItem() ); + } + + // Set default type (=> generate unique type name) and coefficient + //... + + updateControls(); +} + +/** +Remove the selected Strickler coefficient. +*/ +void HYDROGUI_StricklerTableDlg::onRemoveCoefficient() +{ + QList aRows; + QModelIndexList aSelectedIndexes = myTable->selectionModel()->selectedIndexes(); + foreach ( const QModelIndex& anIndex, aSelectedIndexes ) { + int aRowIndex = anIndex.row(); + if ( !aRows.contains( aRowIndex ) ) + aRows << aRowIndex; + } + + removeRows( aRows ); +} + +/** +Clear all Strickler coefficients. +*/ +void HYDROGUI_StricklerTableDlg::onClearCoefficients() +{ + QList aRows; + for ( int i=0; i< myTable->rowCount(); i++ ) { + aRows << i; + } + + removeRows( aRows ); +} + +/** +Slot called on table selection change. +*/ +void HYDROGUI_StricklerTableDlg::onSelectionChanged() +{ + QModelIndexList aSelectedIndexes = myTable->selectionModel()->selectedIndexes(); + myRemoveBtn->setEnabled( aSelectedIndexes.count() > 0 ); }