X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_Operation.cxx;h=e40ff69de68a57e55bf94a9137603fe1e5d04a0f;hb=a53349567d67f4df0ef737798a25c24d9dc8f08e;hp=3183b3b82b8af70118e8c0409844a9e51e0f5971;hpb=35a75ba275261aff7c8c48c0d16842dafd455007;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Operation.cxx b/src/HYDROGUI/HYDROGUI_Operation.cxx index 3183b3b8..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 @@ -25,6 +21,8 @@ #include "HYDROGUI_InputPanel.h" #include "HYDROGUI_Module.h" #include "HYDROGUI_Tool.h" +#include "HYDROGUI_OCCDisplayer.h" +#include "HYDROGUI_Shape.h" #include #include @@ -36,13 +34,26 @@ #include #include +#include +#include +#include + #include HYDROGUI_Operation::HYDROGUI_Operation( HYDROGUI_Module* theModule ) : LightApp_Operation(), myModule( theModule ), - myPanel( 0 ) + myPanel( 0 ), + myIsPrintErrorMessage( true ), + myIsTransactionOpened( false ), + myPreviewManager( 0 ), + myPreviewZLayer( -1 ), + myIsApplyAndClose( true ) { + connect( this, SIGNAL( helpContextModule( const QString&, const QString&, + const QString& ) ), + theModule->application(), SLOT( onHelpContextModule( const QString&, + const QString&, const QString& ) ) ); } HYDROGUI_Operation::~HYDROGUI_Operation() @@ -64,8 +75,10 @@ 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() ) ); } return myPanel; } @@ -80,72 +93,127 @@ HYDROGUI_Module* HYDROGUI_Operation::module() const return myModule; } -void HYDROGUI_Operation::startOperation() +/** + * Returns Z layer of the operation preview. + \ returns a layer position + */ +int HYDROGUI_Operation::getPreviewZLayer() const { - LightApp_Operation::startOperation(); - - if( inputPanel() ) - { - myModule->getApp()->desktop()->addDockWidget( Qt::RightDockWidgetArea, inputPanel() ); - inputPanel()->show(); - } + return myPreviewZLayer; } -void HYDROGUI_Operation::abortOperation() +/** + * Update Z layer for the operation preview. + \param theLayer a layer position + */ +void HYDROGUI_Operation::updatePreviewZLayer( int theLayer ) { - LightApp_Operation::abortOperation(); + setPreviewZLayer( theLayer ); - if( inputPanel() ) - inputPanel()->hide(); + HYDROGUI_Shape* aPreview = getPreviewShape(); + if ( aPreview ) + aPreview->setZLayer( getPreviewZLayer() ); } -void HYDROGUI_Operation::commitOperation() +/** + * Set Z layer for the operation preview. + \param theLayer a layer position + */ +void HYDROGUI_Operation::setPreviewZLayer( int theLayer ) { - LightApp_Operation::commitOperation(); - - if( inputPanel() ) - inputPanel()->hide(); + if ( theLayer != myPreviewZLayer ) + myPreviewZLayer = theLayer; } -HYDROGUI_InputPanel* HYDROGUI_Operation::createInputPanel() const +/** + * Returns a shape preview of the operation + */ +HYDROGUI_Shape* HYDROGUI_Operation::getPreviewShape() const { - return NULL; + return 0; } -bool HYDROGUI_Operation::processApply( int& theUpdateFlags, - QString& theErrorMsg ) +/** + * Return the operation preview manager + */ +OCCViewer_ViewManager* HYDROGUI_Operation::getPreviewManager() { - return false; + return myPreviewManager; } -void HYDROGUI_Operation::processCancel() +/** + * Set the preview manager + */ +void HYDROGUI_Operation::setPreviewManager( OCCViewer_ViewManager* theManager ) { + //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()->AddPreviewZLayer( myPreviewManager ) ); } -void HYDROGUI_Operation::startDocOperation() +void HYDROGUI_Operation::setCursor() { - // Open transaction in the model document - doc()->StartOperation(); + 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::abortDocOperation() +void HYDROGUI_Operation::restoreCursor() { - // Abort transaction in the model document - doc()->AbortOperation(); + 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::commitDocOperation() +void HYDROGUI_Operation::setIsApplyAndClose( const bool theFlag ) { - // Commit transaction in the model document - doc()->CommitOperation( HYDROGUI_Tool::ToExtString( getName() ) ); + myIsApplyAndClose = theFlag; } -Handle_HYDROData_Document HYDROGUI_Operation::doc() const +bool HYDROGUI_Operation::isApplyAndClose() const { - return HYDROData_Document::Document( myModule->getStudyId() ); + return myIsApplyAndClose; } -void HYDROGUI_Operation::onApply() +void HYDROGUI_Operation::apply() { QApplication::setOverrideCursor( Qt::WaitCursor ); @@ -155,10 +223,11 @@ void HYDROGUI_Operation::onApply() QString anErrorMsg; bool aResult = false; - + QStringList aBrowseObjectsEntries; + try { - aResult = processApply( anUpdateFlags, anErrorMsg ); + aResult = processApply( anUpdateFlags, anErrorMsg, aBrowseObjectsEntries ); } catch ( Standard_Failure ) { @@ -178,21 +247,220 @@ void HYDROGUI_Operation::onApply() module()->update( anUpdateFlags ); commitDocOperation(); commit(); + browseObjects( aBrowseObjectsEntries, myIsApplyAndClose ); + + if ( !myIsApplyAndClose && inputPanel() ) + start(); } - else + 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() +{ + LightApp_Operation::startOperation(); + myModule->getActiveOperations().push( this ); + + if( myIsApplyAndClose && inputPanel() ) + { + myModule->getApp()->desktop()->addDockWidget( Qt::RightDockWidgetArea, inputPanel() ); + inputPanel()->show(); + } +} + +void HYDROGUI_Operation::abortOperation() +{ + LightApp_Operation::abortOperation(); + closeInputPanel(); +} + +void HYDROGUI_Operation::commitOperation() +{ + LightApp_Operation::commitOperation(); + if ( myIsApplyAndClose ) + 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 ); + if( myPanel ) + { + if( active ) + { + myPanel->show(); + } + } +} + +HYDROGUI_InputPanel* HYDROGUI_Operation::createInputPanel() const +{ + return NULL; +} + +void HYDROGUI_Operation::closeInputPanel() +{ + if( myPanel ) + { + myModule->getApp()->desktop()->removeDockWidget( myPanel ); + delete myPanel; + myPanel = 0; + } +} + +bool HYDROGUI_Operation::processApply( int& theUpdateFlags, + QString& theErrorMsg, + QStringList& theBrowseObjectsEntries ) +{ + return false; +} + +void HYDROGUI_Operation::processCancel() +{ +} + +void HYDROGUI_Operation::startDocOperation() +{ + // 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 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 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 +{ + return HYDROData_Document::Document( myModule->getStudyId() ); +} + +void HYDROGUI_Operation::onApplyAndClose() +{ + myIsApplyAndClose = true; + apply(); +} + +void HYDROGUI_Operation::onApply() +{ + myIsApplyAndClose = false; + apply(); +} + +void HYDROGUI_Operation::setPrintErrorMessage( const bool theIsPrint ) +{ + myIsPrintErrorMessage = theIsPrint; +} + +void HYDROGUI_Operation::printErrorMessage( const QString& theErrorMsg ) +{ + if ( myIsPrintErrorMessage ) { - abortDocOperation(); QString aMsg = tr( "INPUT_VALID_DATA" ); - if( !anErrorMsg.isEmpty() ) - aMsg.prepend( anErrorMsg + "\n" ); + if( !theErrorMsg.isEmpty() ) + aMsg.prepend( theErrorMsg + "\n" ); SUIT_MessageBox::critical( module()->getApp()->desktop(), tr( "INSUFFICIENT_INPUT_DATA" ), - aMsg ); + aMsg ); + } + + myIsPrintErrorMessage = true; } void HYDROGUI_Operation::onCancel() { processCancel(); abort(); + if ( myPanel ) + abortOperation(); + myIsApplyAndClose = true; +} + +void HYDROGUI_Operation::onHelp() +{ + emit helpContextModule( getHelpComponent(), getHelpFile(), getHelpContext() ); +} + +QString HYDROGUI_Operation::getHelpComponent() const +{ + return module()->moduleName(); +} + +QString HYDROGUI_Operation::getHelpFile() const +{ + QString aFileName = ((myName.isEmpty())? operationName() : myName); + return aFileName.replace(QRegExp("\\s"), "_").append(".html"); +} + +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 ); }