X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FHYDROGUI%2FHYDROGUI_Operation.cxx;h=761083b8b64e90628ba81754c8d740b1d8119a6c;hb=4e1b53167581be7e084a3d71c075507bc6699c06;hp=bdbd6fa05ffd1c86b4ea310a681dbf3f63b3ac1a;hpb=fd7bc8b6aff2f236893c3c549e3338668bd6bec3;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Operation.cxx b/src/HYDROGUI/HYDROGUI_Operation.cxx index bdbd6fa0..761083b8 100644 --- a/src/HYDROGUI/HYDROGUI_Operation.cxx +++ b/src/HYDROGUI/HYDROGUI_Operation.cxx @@ -25,6 +25,8 @@ #include "HYDROGUI_InputPanel.h" #include "HYDROGUI_Module.h" #include "HYDROGUI_Tool.h" +#include "HYDROGUI_OCCDisplayer.h" +#include "HYDROGUI_Shape.h" #include #include @@ -42,7 +44,10 @@ HYDROGUI_Operation::HYDROGUI_Operation( HYDROGUI_Module* theModule ) : LightApp_Operation(), myModule( theModule ), myPanel( 0 ), - myIsPrintErrorMessage( true ) + myIsPrintErrorMessage( true ), + myIsTransactionOpened( false ), + myPreviewManager( 0 ), + myPreviewZLayer( -1 ) { connect( this, SIGNAL( helpContextModule( const QString&, const QString&, const QString& ) ), @@ -86,9 +91,72 @@ HYDROGUI_Module* HYDROGUI_Operation::module() const return myModule; } +/** + * Returns Z layer of the operation preview. + \ returns a layer position + */ +int HYDROGUI_Operation::getPreviewZLayer() const +{ + return myPreviewZLayer; +} + +/** + * Update Z layer for the operation preview. + \param theLayer a layer position + */ +void HYDROGUI_Operation::updatePreviewZLayer( int theLayer ) +{ + setPreviewZLayer( theLayer ); + + HYDROGUI_Shape* aPreview = getPreviewShape(); + if ( aPreview ) + aPreview->setZLayer( getPreviewZLayer() ); +} + +/** + * Set Z layer for the operation preview. + \param theLayer a layer position + */ +void HYDROGUI_Operation::setPreviewZLayer( int theLayer ) +{ + if ( theLayer != myPreviewZLayer ) + myPreviewZLayer = theLayer; +} + +/** + * Returns a shape preview of the operation + */ +HYDROGUI_Shape* HYDROGUI_Operation::getPreviewShape() const +{ + return 0; +} + +/** + * Return the operation preview manager + */ +OCCViewer_ViewManager* HYDROGUI_Operation::getPreviewManager() +{ + return myPreviewManager; +} + +/** + * Set the preview manager + */ +void HYDROGUI_Operation::setPreviewManager( OCCViewer_ViewManager* theManager ) +{ + if ( !theManager && myPreviewManager ) + module()->getOCCDisplayer()->RemoveZLayer( myPreviewManager, getPreviewZLayer() ); + + myPreviewManager = theManager; + + if ( myPreviewManager ) + setPreviewZLayer( module()->getOCCDisplayer()->AddTopZLayer( myPreviewManager ) ); +} + void HYDROGUI_Operation::startOperation() { LightApp_Operation::startOperation(); + myModule->getActiveOperations().push( this ); if( inputPanel() ) { @@ -109,6 +177,33 @@ void HYDROGUI_Operation::commitOperation() closeInputPanel(); } +void HYDROGUI_Operation::stopOperation() +{ + LightApp_Operation::stopOperation(); + + // pop the operation from the cached map of active operations + QStack& anOperations = myModule->getActiveOperations(); + if ( !anOperations.empty() ) { + 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() ) + { + HYDROGUI_Operation* anOp = aVIt.previous(); + if ( anOp == this ) + anOperations.remove( anOperations.lastIndexOf( anOp ) ); + } + } + } + // release the preview manager with removing the added preview Z layer + setPreviewManager( 0 ); +} + void HYDROGUI_Operation::setDialogActive( const bool active ) { LightApp_Operation::setDialogActive( active ); @@ -148,23 +243,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 @@ -208,7 +315,10 @@ void HYDROGUI_Operation::onApply() } else { - abortDocOperation(); + // Abort document opeartion only if requested + if ( isToAbortOnApply() ) + abortDocOperation(); + printErrorMessage( anErrorMsg ); // If the operation has no input panel - do abort