X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_Operation.cxx;h=e40ff69de68a57e55bf94a9137603fe1e5d04a0f;hb=a53349567d67f4df0ef737798a25c24d9dc8f08e;hp=5fe0773011920a6249b00a52e8eb911453bc1ebb;hpb=ff20e1dd36e9bd6e9c6a394d18b740cd5ea63393;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Operation.cxx b/src/HYDROGUI/HYDROGUI_Operation.cxx index 5fe07730..e40ff69d 100644 --- a/src/HYDROGUI/HYDROGUI_Operation.cxx +++ b/src/HYDROGUI/HYDROGUI_Operation.cxx @@ -1,12 +1,8 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// +// Copyright (C) 2014-2015 EDF-R&D // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -38,6 +34,10 @@ #include #include +#include +#include +#include + #include HYDROGUI_Operation::HYDROGUI_Operation( HYDROGUI_Module* theModule ) @@ -45,8 +45,10 @@ HYDROGUI_Operation::HYDROGUI_Operation( HYDROGUI_Module* theModule ) myModule( theModule ), myPanel( 0 ), myIsPrintErrorMessage( true ), + myIsTransactionOpened( false ), myPreviewManager( 0 ), - myPreviewZLayer( -1 ) + myPreviewZLayer( -1 ), + myIsApplyAndClose( true ) { connect( this, SIGNAL( helpContextModule( const QString&, const QString&, const QString& ) ), @@ -73,6 +75,7 @@ HYDROGUI_InputPanel* HYDROGUI_Operation::inputPanel() const if( !myPanel ) { ( ( HYDROGUI_Operation* )this )->myPanel = createInputPanel(); + connect( myPanel, SIGNAL( panelApplyAndClose() ), this, SLOT( onApplyAndClose() ) ); connect( myPanel, SIGNAL( panelApply() ), this, SLOT( onApply() ) ); connect( myPanel, SIGNAL( panelCancel() ), this, SLOT( onCancel() ) ); connect( myPanel, SIGNAL( panelHelp() ), this, SLOT( onHelp() ) ); @@ -143,13 +146,125 @@ OCCViewer_ViewManager* HYDROGUI_Operation::getPreviewManager() */ void HYDROGUI_Operation::setPreviewManager( OCCViewer_ViewManager* theManager ) { - if ( !theManager && myPreviewManager ) - module()->getOCCDisplayer()->RemoveZLayer( myPreviewManager, getPreviewZLayer() ); + //No good: preview Z layer could be used by usual presentations + //if ( !theManager && myPreviewManager ) + // module()->getOCCDisplayer()->RemoveZLayer( myPreviewManager, getPreviewZLayer() ); myPreviewManager = theManager; if ( myPreviewManager ) - setPreviewZLayer( module()->getOCCDisplayer()->AddTopZLayer( myPreviewManager ) ); + setPreviewZLayer( module()->getOCCDisplayer()->AddPreviewZLayer( myPreviewManager ) ); +} + +void HYDROGUI_Operation::setCursor() +{ + if ( myPreviewManager ) + { + QVector winList = myPreviewManager->getViews(); + for ( QVector::iterator it = winList.begin(); it != winList.end(); ++it ) + { + OCCViewer_ViewWindow* occWin = ::qobject_cast( *it ); + if ( occWin ) + { + OCCViewer_ViewPort3d* vp = occWin->getViewPort(); + if ( vp ) + { + // Save old cursor + myCursor = vp->cursor(); + // Set specific cursor chosen in preferences + QCursor aCursor = module()->getPrefEditCursor(); + vp->setDefaultCursor( aCursor.shape() ); + vp->setCursor( *vp->getDefaultCursor() ); + } + } + } + } +} + +void HYDROGUI_Operation::restoreCursor() +{ + if ( myPreviewManager ) + { + QVector winList = myPreviewManager->getViews(); + for ( QVector::iterator it = winList.begin(); it != winList.end(); ++it ) + { + OCCViewer_ViewWindow* occWin = ::qobject_cast( *it ); + if ( occWin ) + { + OCCViewer_ViewPort3d* vp = occWin->getViewPort(); + if ( vp ) + { + // Restore old cursor + vp->setDefaultCursor( myCursor.shape() ); + vp->setCursor( myCursor ); + } + } + } + } +} + +void HYDROGUI_Operation::setIsApplyAndClose( const bool theFlag ) +{ + myIsApplyAndClose = theFlag; +} + +bool HYDROGUI_Operation::isApplyAndClose() const +{ + return myIsApplyAndClose; +} + +void HYDROGUI_Operation::apply() +{ + QApplication::setOverrideCursor( Qt::WaitCursor ); + + startDocOperation(); + + int anUpdateFlags = 0; + QString anErrorMsg; + + bool aResult = false; + QStringList aBrowseObjectsEntries; + + try + { + aResult = processApply( anUpdateFlags, anErrorMsg, aBrowseObjectsEntries ); + } + catch ( Standard_Failure ) + { + Handle(Standard_Failure) aFailure = Standard_Failure::Caught(); + anErrorMsg = aFailure->GetMessageString(); + aResult = false; + } + catch ( ... ) + { + aResult = false; + } + + QApplication::restoreOverrideCursor(); + + if ( aResult ) + { + module()->update( anUpdateFlags ); + commitDocOperation(); + commit(); + browseObjects( aBrowseObjectsEntries, myIsApplyAndClose ); + + if ( !myIsApplyAndClose && inputPanel() ) + start(); + } + else if( !anErrorMsg.isEmpty() ) + { + // Abort document opeartion only if requested + if ( isToAbortOnApply() ) + abortDocOperation(); + + printErrorMessage( anErrorMsg ); + + // If the operation has no input panel - do abort + if ( !inputPanel() ) { + abort(); + } + } } void HYDROGUI_Operation::startOperation() @@ -157,7 +272,7 @@ void HYDROGUI_Operation::startOperation() LightApp_Operation::startOperation(); myModule->getActiveOperations().push( this ); - if( inputPanel() ) + if( myIsApplyAndClose && inputPanel() ) { myModule->getApp()->desktop()->addDockWidget( Qt::RightDockWidgetArea, inputPanel() ); inputPanel()->show(); @@ -173,7 +288,8 @@ void HYDROGUI_Operation::abortOperation() void HYDROGUI_Operation::commitOperation() { LightApp_Operation::commitOperation(); - closeInputPanel(); + if ( myIsApplyAndClose ) + closeInputPanel(); } void HYDROGUI_Operation::stopOperation() @@ -182,20 +298,21 @@ void HYDROGUI_Operation::stopOperation() // pop the operation from the cached map of active operations QStack& anOperations = myModule->getActiveOperations(); - if ( anOperations.top() == this ) - { - anOperations.pop(); - } - else { - // find in the stack the current operation and remove it from the stack - QVectorIterator aVIt( anOperations ); - aVIt.toBack(); - aVIt.previous(); // skip the top show/hide operation - while ( aVIt.hasPrevious() ) + if ( !anOperations.empty() ) { + if ( anOperations.top() == this ) + anOperations.pop(); + else { - HYDROGUI_Operation* anOp = aVIt.previous(); - if ( anOp == this ) - anOperations.remove( anOperations.lastIndexOf( anOp ) ); + // find in the stack the current operation and remove it from the stack + QVectorIterator aVIt( anOperations ); + aVIt.toBack(); + aVIt.previous(); // skip the top show/hide operation + while ( aVIt.hasPrevious() ) + { + HYDROGUI_Operation* anOp = aVIt.previous(); + if ( anOp == this ) + anOperations.remove( anOperations.lastIndexOf( anOp ) ); + } } } // release the preview manager with removing the added preview Z layer @@ -230,7 +347,8 @@ void HYDROGUI_Operation::closeInputPanel() } bool HYDROGUI_Operation::processApply( int& theUpdateFlags, - QString& theErrorMsg ) + QString& theErrorMsg, + QStringList& theBrowseObjectsEntries ) { return false; } @@ -241,23 +359,35 @@ void HYDROGUI_Operation::processCancel() void HYDROGUI_Operation::startDocOperation() { - // Open transaction in the model document + // Open transaction in the model document only if it not + // already opened by other operation (intended for nested operations) if ( !doc()->IsOperation() ) + { doc()->StartOperation(); + myIsTransactionOpened = true; + } } void HYDROGUI_Operation::abortDocOperation() { - // Abort transaction in the model document - if ( doc()->IsOperation() ) + // Abort transaction in the model document only if it was + // opened by this operation (intended for nested operations) + if ( myIsTransactionOpened && doc()->IsOperation() ) + { doc()->AbortOperation(); + myIsTransactionOpened = false; + } } void HYDROGUI_Operation::commitDocOperation() { - // Commit transaction in the model document - if ( doc()->IsOperation() ) + // Commit transaction in the model document only if it was + // opened by this operation (intended for nested operations) + if ( myIsTransactionOpened && doc()->IsOperation() ) + { doc()->CommitOperation( HYDROGUI_Tool::ToExtString( getName() ) ); + myIsTransactionOpened = false; + } } Handle_HYDROData_Document HYDROGUI_Operation::doc() const @@ -265,53 +395,16 @@ Handle_HYDROData_Document HYDROGUI_Operation::doc() const return HYDROData_Document::Document( myModule->getStudyId() ); } -void HYDROGUI_Operation::onApply() +void HYDROGUI_Operation::onApplyAndClose() { - QApplication::setOverrideCursor( Qt::WaitCursor ); - - startDocOperation(); - - int anUpdateFlags = 0; - QString anErrorMsg; - - bool aResult = false; - - try - { - aResult = processApply( anUpdateFlags, anErrorMsg ); - } - catch ( Standard_Failure ) - { - Handle(Standard_Failure) aFailure = Standard_Failure::Caught(); - anErrorMsg = aFailure->GetMessageString(); - aResult = false; - } - catch ( ... ) - { - aResult = false; - } - - QApplication::restoreOverrideCursor(); - - if ( aResult ) - { - module()->update( anUpdateFlags ); - commitDocOperation(); - commit(); - } - else - { - // Abort document opeartion only if requested - if ( isToAbortOnApply() ) - abortDocOperation(); + myIsApplyAndClose = true; + apply(); +} - printErrorMessage( anErrorMsg ); - - // If the operation has no input panel - do abort - if ( !inputPanel() ) { - abort(); - } - } +void HYDROGUI_Operation::onApply() +{ + myIsApplyAndClose = false; + apply(); } void HYDROGUI_Operation::setPrintErrorMessage( const bool theIsPrint ) @@ -339,6 +432,9 @@ void HYDROGUI_Operation::onCancel() { processCancel(); abort(); + if ( myPanel ) + abortOperation(); + myIsApplyAndClose = true; } void HYDROGUI_Operation::onHelp() @@ -362,4 +458,9 @@ QString HYDROGUI_Operation::getHelpContext() const return QString(); } - +void HYDROGUI_Operation::browseObjects( const QStringList& theBrowseObjectsEntries, + const bool theIsApplyAndClose/* = true*/ ) +{ + bool isOptimizedBrowse = true; + module()->getApp()->browseObjects( theBrowseObjectsEntries, theIsApplyAndClose, isOptimizedBrowse ); +}