From 5cdade9a100cf8d3fdd10e3d7fed6e4128a4759b Mon Sep 17 00:00:00 2001 From: mzn Date: Fri, 29 Nov 2013 14:51:10 +0000 Subject: [PATCH] Add update selection button, add confirmation message on modes switch. --- src/HYDROGUI/HYDROGUI_GeoreferencementDlg.cxx | 36 +++++- src/HYDROGUI/HYDROGUI_GeoreferencementDlg.h | 8 ++ src/HYDROGUI/HYDROGUI_GeoreferencementOp.cxx | 118 ++++++++++++------ src/HYDROGUI/HYDROGUI_GeoreferencementOp.h | 4 + src/HYDROGUI/resources/HYDROGUI_msg_en.ts | 12 ++ 5 files changed, 141 insertions(+), 37 deletions(-) diff --git a/src/HYDROGUI/HYDROGUI_GeoreferencementDlg.cxx b/src/HYDROGUI/HYDROGUI_GeoreferencementDlg.cxx index feb21b29..57bfafb6 100644 --- a/src/HYDROGUI/HYDROGUI_GeoreferencementDlg.cxx +++ b/src/HYDROGUI/HYDROGUI_GeoreferencementDlg.cxx @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -122,7 +123,7 @@ void HYDROGUI_GeoreferencementDlg::Delegate::setModelData( } 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 ); @@ -140,6 +141,13 @@ 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 ) ); @@ -154,10 +162,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() @@ -166,6 +178,7 @@ HYDROGUI_GeoreferencementDlg::~HYDROGUI_GeoreferencementDlg() void HYDROGUI_GeoreferencementDlg::onModeActivated( int theMode ) { + myUpdateSelBtn->setEnabled( theMode == SelectedProfiles ); emit modeActivated( theMode ); } @@ -187,11 +200,16 @@ void HYDROGUI_GeoreferencementDlg::setMode( const int theMode ) aModeButton->setChecked( true ); } + myUpdateSelBtn->setEnabled( theMode == SelectedProfiles ); + myModeButtons->blockSignals( isBlocked ); } void HYDROGUI_GeoreferencementDlg::setData( const ProfilesGeoDataMap& theMap ) { + disconnect( myTable->model(), SIGNAL( dataChanged ( const QModelIndex&, const QModelIndex& ) ), + this, SLOT( onDataChanged() ) ); + myTable->setRowCount( 0 ); foreach ( const QString& aProfileName, theMap.keys() ) { @@ -236,6 +254,12 @@ void HYDROGUI_GeoreferencementDlg::setData( const ProfilesGeoDataMap& theMap ) } 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 ) @@ -291,4 +315,14 @@ void HYDROGUI_GeoreferencementDlg::onMousePress( QString HYDROGUI_GeoreferencementDlg::getString( const double theNumber ) const { return QString::number( theNumber, 'g', 12 ); +} + +void HYDROGUI_GeoreferencementDlg::onDataChanged() +{ + myIsModified = true; +} + +bool HYDROGUI_GeoreferencementDlg::isModified() const +{ + return myIsModified; } \ No newline at end of file diff --git a/src/HYDROGUI/HYDROGUI_GeoreferencementDlg.h b/src/HYDROGUI/HYDROGUI_GeoreferencementDlg.h index 428cf1c7..8ac5f6d9 100644 --- a/src/HYDROGUI/HYDROGUI_GeoreferencementDlg.h +++ b/src/HYDROGUI/HYDROGUI_GeoreferencementDlg.h @@ -30,6 +30,7 @@ class SUIT_ViewWindow; class QGroupBox; class QButtonGroup; class QTableWidget; +class QPushButton; class HYDROGUI_GeoreferencementDlg : public HYDROGUI_InputPanel { @@ -73,21 +74,28 @@ public: void setData( const ProfilesGeoDataMap& theMap ); void getData( ProfilesGeoDataMap& theMap ); + bool isModified() const; + public slots: void onMousePress( SUIT_ViewWindow*, QMouseEvent* ); protected slots: void onModeActivated( int ); + void onDataChanged(); signals: void modeActivated( int ); + void updateSelection(); private: QString getString( const double theNumber ) const; private: QButtonGroup* myModeButtons; + QPushButton* myUpdateSelBtn; QTableWidget* myTable; + + bool myIsModified; }; #endif diff --git a/src/HYDROGUI/HYDROGUI_GeoreferencementOp.cxx b/src/HYDROGUI/HYDROGUI_GeoreferencementOp.cxx index 15595b60..53128386 100644 --- a/src/HYDROGUI/HYDROGUI_GeoreferencementOp.cxx +++ b/src/HYDROGUI/HYDROGUI_GeoreferencementOp.cxx @@ -67,13 +67,11 @@ void HYDROGUI_GeoreferencementOp::startOperation() aPanel->reset(); if ( myInitialMode == All ) { - int anAllMode = HYDROGUI_GeoreferencementDlg::AllProfiles; - aPanel->setMode( anAllMode ); - onModeActivated( anAllMode ); + //@MZN aPanel->setMode( anAllMode ); + onModeActivated( HYDROGUI_GeoreferencementDlg::AllProfiles ); } else if ( myInitialMode == Selected ) { - int aSelectionMode = HYDROGUI_GeoreferencementDlg::SelectedProfiles; - aPanel->setMode( aSelectionMode ); - onModeActivated( aSelectionMode ); + //@MZN aPanel->setMode( aSelectionMode ); + onModeActivated( HYDROGUI_GeoreferencementDlg::SelectedProfiles ); } LightApp_Application* anApp = module()->getApp(); @@ -102,6 +100,7 @@ HYDROGUI_InputPanel* HYDROGUI_GeoreferencementOp::createInputPanel() const { HYDROGUI_InputPanel* aPanel = new HYDROGUI_GeoreferencementDlg( module(), getName() ); connect( aPanel, SIGNAL( modeActivated( int ) ), SLOT( onModeActivated( int ) ) ); + connect( aPanel, SIGNAL( updateSelection() ), SLOT( onUpdateSelection() ) ); return aPanel; } @@ -109,7 +108,7 @@ HYDROGUI_InputPanel* HYDROGUI_GeoreferencementOp::createInputPanel() const bool HYDROGUI_GeoreferencementOp::processApply( int& theUpdateFlags, QString& theErrorMsg ) { - theUpdateFlags = UF_Model; + theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced; return store( theErrorMsg ); } @@ -125,12 +124,26 @@ void HYDROGUI_GeoreferencementOp::onModeActivated( const int theActualMode ) return; } - // Store the dialog data to the data model - if ( !store( anErrorMsg ) ) { - aPanel->setMode( theActualMode == HYDROGUI_GeoreferencementDlg::AllProfiles ? - HYDROGUI_GeoreferencementDlg::SelectedProfiles : - HYDROGUI_GeoreferencementDlg::AllProfiles); + aPanel->setMode( theActualMode == HYDROGUI_GeoreferencementDlg::AllProfiles ? + HYDROGUI_GeoreferencementDlg::SelectedProfiles : + HYDROGUI_GeoreferencementDlg::AllProfiles); + // Store the dialog data to the data model + bool isToStore = false; + // Check if modifications exists + if ( aPanel->isModified() ) { + // Show confirmation dialog + SUIT_MessageBox::StandardButtons aButtons = + SUIT_MessageBox::Yes | SUIT_MessageBox::No; + + isToStore = SUIT_MessageBox::question( module()->getApp()->desktop(), + tr( "CONFIRMATION" ), + tr( "CONFIRM_STORE" ), + aButtons, + SUIT_MessageBox::Yes) == SUIT_MessageBox::Yes; + } + // Store modifications if needed + if ( isToStore && !store( anErrorMsg ) ) { anErrorMsg.append( "\n" + tr( "INPUT_VALID_DATA" ) ); SUIT_MessageBox::critical( module()->getApp()->desktop(), tr( "INSUFFICIENT_INPUT_DATA" ), @@ -138,8 +151,9 @@ void HYDROGUI_GeoreferencementOp::onModeActivated( const int theActualMode ) return; } - // Get georeferencement data from the data model - HYDROGUI_GeoreferencementDlg::ProfilesGeoDataMap aDataMap; + aPanel->setMode( theActualMode ); + + // Get the list of profiles HYDROData_SequenceOfObjects aSeqOfProfiles; if( theActualMode == HYDROGUI_GeoreferencementDlg::AllProfiles ) { @@ -152,28 +166,8 @@ void HYDROGUI_GeoreferencementOp::onModeActivated( const int theActualMode ) aSeqOfProfiles = HYDROGUI_Tool::GetSelectedObjects( module() ); } - HYDROData_SequenceOfObjects::Iterator anIter( aSeqOfProfiles ); - for ( ; anIter.More(); anIter.Next() ) { - Handle(HYDROData_Profile) aProfile = - Handle(HYDROData_Profile)::DownCast( anIter.Value() ); - if ( aProfile.IsNull() ) { - continue; - } - - HYDROGUI_GeoreferencementDlg::ProfileGeoData aGeoData; - - gp_XY aFirstPoint, aLastPoint; - if ( aProfile->GetFirstPoint( aFirstPoint ) && aProfile->GetLastPoint( aLastPoint ) ) { - aGeoData = - HYDROGUI_GeoreferencementDlg::ProfileGeoData( aFirstPoint.X(), aFirstPoint.Y(), - aLastPoint.X(), aLastPoint.Y() ); - } - - aDataMap.insert( aProfile->GetName(), aGeoData ); - } - - // Set the collected data to the dialog - aPanel->setData( aDataMap ); + // Set the profiles to the panel + setPanelData( aSeqOfProfiles ); } void HYDROGUI_GeoreferencementOp::onWindowActivated( SUIT_ViewWindow* theViewWindow ) @@ -239,8 +233,60 @@ bool HYDROGUI_GeoreferencementOp::store( QString& theErrorMsg ) } else { aProfile->Invalidate(); } + + aProfile->Update(); } } + module()->update( UF_Model | UF_OCCViewer | UF_OCC_Forced ); + commitDocOperation(); // TODO: analyze the consequences + return true; } + +void HYDROGUI_GeoreferencementOp::onUpdateSelection() +{ + // Get the selected profiles + HYDROData_SequenceOfObjects aSeqOfProfiles = + HYDROGUI_Tool::GetSelectedObjects( module() ); + + // Set them to the dialog + setPanelData( aSeqOfProfiles ); +} + +void HYDROGUI_GeoreferencementOp::setPanelData( + const HYDROData_SequenceOfObjects& theProfiles ) +{ + // Get the panel + HYDROGUI_GeoreferencementDlg* aPanel = + ::qobject_cast( inputPanel() ); + if ( !aPanel ) { + return; + } + + // Get georeferencement data from the data model + HYDROGUI_GeoreferencementDlg::ProfilesGeoDataMap aDataMap; + + HYDROData_SequenceOfObjects::Iterator anIter( theProfiles ); + for ( ; anIter.More(); anIter.Next() ) { + Handle(HYDROData_Profile) aProfile = + Handle(HYDROData_Profile)::DownCast( anIter.Value() ); + if ( aProfile.IsNull() ) { + continue; + } + + HYDROGUI_GeoreferencementDlg::ProfileGeoData aGeoData; + + gp_XY aFirstPoint, aLastPoint; + if ( aProfile->GetFirstPoint( aFirstPoint ) && aProfile->GetLastPoint( aLastPoint ) ) { + aGeoData = + HYDROGUI_GeoreferencementDlg::ProfileGeoData( aFirstPoint.X(), aFirstPoint.Y(), + aLastPoint.X(), aLastPoint.Y() ); + } + + aDataMap.insert( aProfile->GetName(), aGeoData ); + } + + // Set the collected data to the dialog + aPanel->setData( aDataMap ); +} \ No newline at end of file diff --git a/src/HYDROGUI/HYDROGUI_GeoreferencementOp.h b/src/HYDROGUI/HYDROGUI_GeoreferencementOp.h index e76cbd12..6fa244c0 100644 --- a/src/HYDROGUI/HYDROGUI_GeoreferencementOp.h +++ b/src/HYDROGUI/HYDROGUI_GeoreferencementOp.h @@ -25,6 +25,8 @@ #include "HYDROGUI_Operation.h" +#include + class SUIT_ViewWindow; class HYDROGUI_GeoreferencementOp : public HYDROGUI_Operation @@ -49,9 +51,11 @@ protected: protected slots: void onModeActivated( const int theActualMode ); + void onUpdateSelection(); void onWindowActivated( SUIT_ViewWindow* theViewWindow ); private: + void setPanelData( const HYDROData_SequenceOfObjects& theProfiles ); bool store( QString& theErrorMsg ); private: diff --git a/src/HYDROGUI/resources/HYDROGUI_msg_en.ts b/src/HYDROGUI/resources/HYDROGUI_msg_en.ts index 27f7350c..9a1cba46 100644 --- a/src/HYDROGUI/resources/HYDROGUI_msg_en.ts +++ b/src/HYDROGUI/resources/HYDROGUI_msg_en.ts @@ -1323,6 +1323,10 @@ file cannot be correctly imported for an Obstacle definition. SELECTED_MODE Selected + + UPDATE_SELECTION + Update selection + PROFILE_HEADER Profile @@ -1355,6 +1359,14 @@ file cannot be correctly imported for an Obstacle definition. INCOMPLETE_DATA Incomplete data is set for '%1'. + + CONFIRMATION + Confirmation + + + CONFIRM_STORE + Do you want to store table data in the data model? + -- 2.39.2