X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_GeoreferencementDlg.cxx;h=082505cbab9c0883f84c6ab00767830cde82f100;hb=81c9f5cdf82909d0aebd2c491c50fa7516cc80b7;hp=1e9db0737b31a7c31922d34714344cbdda7f3025;hpb=76b254e749b5fcb49f860cbdaa69e7bdd239a587;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_GeoreferencementDlg.cxx b/src/HYDROGUI/HYDROGUI_GeoreferencementDlg.cxx index 1e9db073..082505cb 100644 --- a/src/HYDROGUI/HYDROGUI_GeoreferencementDlg.cxx +++ b/src/HYDROGUI/HYDROGUI_GeoreferencementDlg.cxx @@ -22,16 +22,115 @@ #include "HYDROGUI_GeoreferencementDlg.h" +#include "HYDROGUI_Tool.h" + +#include + +#include +#include +#include + +#include + #include +#include #include #include +#include #include #include #include #include +#include + +//! Profile data structre constructor +HYDROGUI_GeoreferencementDlg::ProfileGeoData::ProfileGeoData( + const QString& theName, + const QString& theXg, const QString& theYg, + const QString& theXd, const QString& theYd) +{ + this->Name = theName; + this->isEmpty = theXg.isEmpty() && theYg.isEmpty() && + theXd.isEmpty() && theYd.isEmpty(); + this->isIncomplete = !isEmpty; + + if ( isIncomplete ) { + bool isOk = false; + + this->Xg= theXg.toDouble( &isOk ); + if ( isOk ) { + this->Yg = theYg.toDouble( &isOk ); + if ( isOk ) { + this->Xd = theXd.toDouble( &isOk ); + if ( isOk ) { + this->Yd = theYd.toDouble( &isOk ); + this->isIncomplete = !isOk; + } + } + } + } +} + +//! Custom item delegate (line edit with double validator) +class HYDROGUI_GeoreferencementDlg::Delegate : public QItemDelegate +{ +public: + Delegate( QObject* = 0 ); + + QWidget* createEditor( QWidget*, const QStyleOptionViewItem&, + const QModelIndex& ) const; + + void setEditorData( QWidget*, const QModelIndex& ) const; + void setModelData( QWidget*, QAbstractItemModel*, const QModelIndex& ) const; +}; + +HYDROGUI_GeoreferencementDlg::Delegate::Delegate( QObject* theParent ) + : QItemDelegate( theParent ) +{ +} + +QWidget* HYDROGUI_GeoreferencementDlg::Delegate::createEditor( + QWidget* theParent, const QStyleOptionViewItem& theOption, + const QModelIndex& theIndex ) const +{ + QWidget* anEditor = 0; + + if ( theIndex.column() > 0 ) { + QLineEdit* aLineEdit = new QLineEdit( theParent ); + QDoubleValidator* aDoubleValidator = new QDoubleValidator(); + aDoubleValidator->setNotation( QDoubleValidator::StandardNotation ); + aDoubleValidator->setDecimals( 2 ); + aLineEdit->setValidator( aDoubleValidator ); + anEditor = aLineEdit; + } else { + anEditor = QItemDelegate::createEditor( theParent, theOption, theIndex ); + } + + return anEditor; +} + +void HYDROGUI_GeoreferencementDlg::Delegate::setEditorData( + QWidget* theEditor, const QModelIndex& theIndex ) const +{ + if ( QLineEdit* aLineEdit = dynamic_cast( theEditor ) ) { + aLineEdit->setText( theIndex.data( Qt::EditRole ).toString() ); + } else { + QItemDelegate::setEditorData( theEditor, theIndex ); + } +} + +void HYDROGUI_GeoreferencementDlg::Delegate::setModelData( + QWidget* theEditor, QAbstractItemModel* theModel, const QModelIndex& theIndex) const +{ + if ( QLineEdit* aLineEdit = dynamic_cast( theEditor ) ) { + theModel->setData( theIndex, aLineEdit->text() ); + } else { + QItemDelegate::setModelData( theEditor, theModel, theIndex ); + } +} HYDROGUI_GeoreferencementDlg::HYDROGUI_GeoreferencementDlg( HYDROGUI_Module* theModule, const QString& theTitle ) -: HYDROGUI_InputPanel( theModule, theTitle ) +: HYDROGUI_InputPanel( theModule, theTitle ), myIsModified( false ) { // Mode selector (all/selected) QGroupBox* aModeGroup = new QGroupBox( tr( "PROFILES" ), this ); @@ -49,8 +148,16 @@ HYDROGUI_GeoreferencementDlg::HYDROGUI_GeoreferencementDlg( HYDROGUI_Module* the aModeSelectorLayout->addWidget( anAllRB ); aModeSelectorLayout->addWidget( aSelectedRB ); + // Update selection button + myUpdateSelBtn = new QPushButton( mainFrame() ); + myUpdateSelBtn->setText( tr("UPDATE_SELECTION") ); + QBoxLayout* anUpdateSelLayout = new QHBoxLayout( mainFrame() ); + anUpdateSelLayout->addWidget( myUpdateSelBtn ); + anUpdateSelLayout->addStretch(); + // Table myTable = new QTableWidget( mainFrame() ); + myTable->setItemDelegate( new Delegate( this ) ); myTable->verticalHeader()->setVisible( false ); myTable->setSelectionBehavior( QAbstractItemView::SelectItems ); myTable->setSelectionMode( QAbstractItemView::SingleSelection ); @@ -62,10 +169,14 @@ HYDROGUI_GeoreferencementDlg::HYDROGUI_GeoreferencementDlg( HYDROGUI_Module* the // Layout addWidget( aModeGroup ); + addLayout( anUpdateSelLayout ); addWidget( myTable ); // Connect signals and slots connect( myModeButtons, SIGNAL( buttonClicked( int ) ), this, SLOT( onModeActivated( int ) ) ); + connect( myUpdateSelBtn, SIGNAL( clicked() ), this, SIGNAL( updateSelection() ) ); + connect( myTable->model(), SIGNAL( dataChanged ( const QModelIndex&, const QModelIndex& ) ), + this, SLOT( onDataChanged() ) ); } HYDROGUI_GeoreferencementDlg::~HYDROGUI_GeoreferencementDlg() @@ -74,6 +185,7 @@ HYDROGUI_GeoreferencementDlg::~HYDROGUI_GeoreferencementDlg() void HYDROGUI_GeoreferencementDlg::onModeActivated( int theMode ) { + myUpdateSelBtn->setEnabled( theMode == SelectedProfiles ); emit modeActivated( theMode ); } @@ -86,11 +198,6 @@ void HYDROGUI_GeoreferencementDlg::reset() myTable->setRowCount( 0 ); } -void HYDROGUI_GeoreferencementDlg::onProfilesSelectionChanged() -{ - // MZN TODO -} - void HYDROGUI_GeoreferencementDlg::setMode( const int theMode ) { bool isBlocked = myModeButtons->blockSignals( true ); @@ -100,27 +207,31 @@ void HYDROGUI_GeoreferencementDlg::setMode( const int theMode ) aModeButton->setChecked( true ); } + myUpdateSelBtn->setEnabled( theMode == SelectedProfiles ); + myModeButtons->blockSignals( isBlocked ); } -void HYDROGUI_GeoreferencementDlg::setData( const ProfilesGeoDataMap& theMap ) +void HYDROGUI_GeoreferencementDlg::setData( const ProfilesGeoDataList& theData ) { + disconnect( myTable->model(), SIGNAL( dataChanged ( const QModelIndex&, const QModelIndex& ) ), + this, SLOT( onDataChanged() ) ); + myTable->setRowCount( 0 ); - foreach ( const QString& aProfileName, theMap.keys() ) { + foreach ( const ProfileGeoData& aGeoData, theData ) { // Check the current profile name - if ( aProfileName.isEmpty() ) { + if ( aGeoData.Name.isEmpty() ) { continue; } // Get georeferencement data for the current profile - ProfileGeoData aGeoData = theMap.value( aProfileName ); QString aXg, anYg, aXd, anYd; - if ( aGeoData.isValid ) { - aXg = QString::number( aGeoData.Xg ); - anYg = QString::number( aGeoData.Yg ); - aXd = QString::number( aGeoData.Xd ); - anYd = QString::number( aGeoData.Yd ); + if ( !aGeoData.isEmpty ) { + aXg = HYDROGUI_Tool::GetCoordinateString( aGeoData.Xg, false ); + anYg = HYDROGUI_Tool::GetCoordinateString( aGeoData.Yg, false ); + aXd = HYDROGUI_Tool::GetCoordinateString( aGeoData.Xd, false ); + anYd = HYDROGUI_Tool::GetCoordinateString( aGeoData.Yd, false ); } // Insert row with the data @@ -128,66 +239,95 @@ void HYDROGUI_GeoreferencementDlg::setData( const ProfilesGeoDataMap& theMap ) myTable->insertRow( aRow ); // "Profile" column - QTableWidgetItem* aNameItem = new QTableWidgetItem( aProfileName ); - aNameItem->setFlags( Qt::ItemIsEnabled ); + QTableWidgetItem* aNameItem = new QTableWidgetItem( aGeoData.Name ); + aNameItem->setFlags( aNameItem->flags() & ~Qt::ItemIsEnabled ); + /* Bold font is not used in other tables. Keep the common style. + QFont aFont = aNameItem->font(); + aFont.setBold( true ); + aNameItem->setFont( aFont ); + */ myTable->setItem( aRow, 0, aNameItem ); // "Xg" column - QLineEdit* aXgEdit = new QLineEdit( aXg ); - aXgEdit->setValidator( new QDoubleValidator( aXgEdit ) ); - myTable->setCellWidget( aRow, 1, aXgEdit ); + myTable->setItem( aRow, 1, new QTableWidgetItem( aXg ) ); // "Yg" column - QLineEdit* anYgEdit = new QLineEdit( anYg ); - anYgEdit->setValidator( new QDoubleValidator( anYgEdit ) ); - myTable->setCellWidget( aRow, 2, anYgEdit ); + myTable->setItem( aRow, 2, new QTableWidgetItem( anYg ) ); // "Xd" column - QLineEdit* aXdEdit = new QLineEdit( aXd ); - aXdEdit->setValidator( new QDoubleValidator( aXdEdit ) ); - myTable->setCellWidget( aRow, 3, aXdEdit ); + myTable->setItem( aRow, 3, new QTableWidgetItem( aXd ) ); // "Yd" column - QLineEdit* anYdEdit = new QLineEdit( anYd ); - anYdEdit->setValidator( new QDoubleValidator( anYdEdit ) ); - myTable->setCellWidget( aRow, 4, anYdEdit ); + myTable->setItem( aRow, 4, new QTableWidgetItem( anYd ) ); } + + myTable->resizeColumnToContents( 0 ); + myTable->resizeRowsToContents(); + + myIsModified = false; + + connect( myTable->model(), SIGNAL( dataChanged ( const QModelIndex&, const QModelIndex& ) ), + this, SLOT( onDataChanged() ) ); } -void HYDROGUI_GeoreferencementDlg::getData( ProfilesGeoDataMap& theMap ) +void HYDROGUI_GeoreferencementDlg::getData( ProfilesGeoDataList& theData ) const { - // Clear the map - theMap.clear(); + // Clear the list + theData.clear(); // Fill the map bool isOk = false; + QString aXg, anYg, aXd, anYd; for ( int aRow = 0; aRow < myTable->rowCount(); aRow++ ) { QString aProfileName = myTable->item( aRow, 0 )->text(); - theMap.insert( aProfileName, ProfileGeoData() ); - - double aXg, anYg, aXd, anYd; - - QLineEdit* aLineEdit = qobject_cast( myTable->cellWidget( aRow, 1 ) ); - QString aCellText = aLineEdit ? aLineEdit->text() : ""; - aXg = aCellText.toDouble( &isOk ); - if ( !isOk ) continue; - - aLineEdit = qobject_cast( myTable->cellWidget( aRow, 2 ) ); - aCellText = aLineEdit ? aLineEdit->text() : ""; - anYg = aCellText.toDouble( &isOk ); - if ( !isOk ) continue; - - aLineEdit = qobject_cast( myTable->cellWidget( aRow, 3 ) ); - aCellText = aLineEdit ? aLineEdit->text() : ""; - aXd = aCellText.toDouble( &isOk ); - if ( !isOk ) continue; - - aLineEdit = qobject_cast( myTable->cellWidget( aRow, 4 ) ); - aCellText = aLineEdit ? aLineEdit->text() : ""; - anYd = aCellText.toDouble( &isOk ); - if ( !isOk ) continue; + aXg = myTable->item( aRow, 1 )->text(); + anYg = myTable->item( aRow, 2 )->text(); + aXd = myTable->item( aRow, 3 )->text(); + anYd = myTable->item( aRow, 4 )->text(); - theMap[aProfileName] = ProfileGeoData( aXg, anYg, aXd, anYd ); + theData.append( ProfileGeoData( aProfileName, aXg, anYg, aXd, anYd ) ); } } + +void HYDROGUI_GeoreferencementDlg::onMousePress( + SUIT_ViewWindow* theViewWindow, QMouseEvent* theEvent ) +{ + // Check the parameters + OCCViewer_ViewWindow* anOCCViewWindow = + dynamic_cast(theViewWindow); + if ( !anOCCViewWindow || (theEvent->button() != Qt::LeftButton) ) { + return; + } + + // Check for current cell + int aRow = myTable->currentRow(); + int aColumn = myTable->currentColumn(); + if ( aRow < 0 || aColumn <= 0 ) { + return; + } + + // Get the selected point coordinates + OCCViewer_ViewPort3d* aViewPort = anOCCViewWindow->getViewPort(); + gp_Pnt aPnt = CurveCreator_Utils::ConvertClickToPoint( theEvent->x(), theEvent->y(), + aViewPort->getView() ); + + // Set the coordinates to the corresponding cells of the table + int aColumnX = aColumn < 3 ? 1 : 3; + int aColumnY = aColumnX + 1; + + QString aXStr = HYDROGUI_Tool::GetCoordinateString( aPnt.X(), false ); + QString anYStr = HYDROGUI_Tool::GetCoordinateString( aPnt.Y(), false ); + myTable->item( aRow, aColumnX )->setText( aXStr ); + myTable->item( aRow, aColumnY )->setText( anYStr ); +} + +void HYDROGUI_GeoreferencementDlg::onDataChanged() +{ + myIsModified = true; +} + +bool HYDROGUI_GeoreferencementDlg::isModified() const +{ + return myIsModified; +} \ No newline at end of file