X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_Module.cxx;h=c355b51cc17d09b81ec638636f5c95c53e4c5e58;hb=07343abeab6a4c4d86bf836b59aff6fbe34b683a;hp=bad6da24a1fa6a190d6cf1beaa8a05d38a17b2e5;hpb=c66fbd26a75a044039dc2b2f8dea2249582deabc;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Module.cxx b/src/HYDROGUI/HYDROGUI_Module.cxx index bad6da24..c355b51c 100644 --- a/src/HYDROGUI/HYDROGUI_Module.cxx +++ b/src/HYDROGUI/HYDROGUI_Module.cxx @@ -1,26 +1,82 @@ +// 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 +// +// 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. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#include "HYDROGUI_Module.h" + +#include "HYDROGUI.h" +#include "HYDROGUI_DataModel.h" +#include "HYDROGUI_Displayer.h" +#include "HYDROGUI_GVSelector.h" +#include "HYDROGUI_InputPanel.h" +#include "HYDROGUI_ObjSelector.h" +#include "HYDROGUI_Operations.h" +#include "HYDROGUI_PrsImage.h" +#include "HYDROGUI_Tool.h" +#include "HYDROGUI_UpdateFlags.h" + +#include + +#include -#include -#include -#include -#include -#include #include +#include #include +#include + +#include +#include +#include + +#include #include +#include +#include + +#include + +#include #include -#include + +#include #include -#include -#include -#include +#include +#include + +static int ViewManagerId = 0; extern "C" HYDRO_EXPORT CAM_Module* createModule() { return new HYDROGUI_Module(); } +extern "C" HYDRO_EXPORT char* getModuleVersion() +{ + return (char*)HYDRO_VERSION; +} + HYDROGUI_Module::HYDROGUI_Module() -: LightApp_Module( "HYDRO GUI" ) +: LightApp_Module( "HYDRO" ), + myDisplayer( 0 ), + myIsUpdateEnabled( true ) { } @@ -28,26 +84,56 @@ HYDROGUI_Module::~HYDROGUI_Module() { } +int HYDROGUI_Module::getStudyId() const +{ + LightApp_Application* anApp = getApp(); + return anApp ? anApp->activeStudy()->id() : 0; +} + void HYDROGUI_Module::initialize( CAM_Application* theApp ) { - printf( "Initialization of the HYDROGUI module\n" ); LightApp_Module::initialize( theApp ); - CreateActions(); - CreateMenus(); - CreatePopups(); - CreateToolbars(); + createActions(); + createUndoRedoActions(); + createMenus(); + createPopups(); + createToolbars(); setMenuShown( false ); + setToolShown( false ); - //startOperation( ImportImageId ); - startOperation( FuseId ); + myDisplayer = new HYDROGUI_Displayer( this ); } bool HYDROGUI_Module::activateModule( SUIT_Study* theStudy ) { + bool aRes = LightApp_Module::activateModule( theStudy ); + setMenuShown( true ); - return LightApp_Module::activateModule( theStudy ); + setToolShown( true ); + + update( UF_All ); + + updateCommandsStatus(); + + return aRes; +} + +bool HYDROGUI_Module::deactivateModule( SUIT_Study* theStudy ) +{ + ViewManagerMapIterator anIter( myViewManagerMap ); + while( anIter.hasNext() ) + if( SUIT_ViewManager* aViewManager = anIter.next().value().first ) + getApp()->removeViewManager( aViewManager ); + myViewManagerMap.clear(); + + myObjectStateMap.clear(); + + setMenuShown( false ); + setToolShown( false ); + + return LightApp_Module::deactivateModule( theStudy ); } void HYDROGUI_Module::windows( QMap& theMap ) const @@ -62,38 +148,478 @@ void HYDROGUI_Module::viewManagers( QStringList& theTypesList ) const theTypesList << GraphicsView_Viewer::Type(); } -void HYDROGUI_Module::onViewManagerAdded( SUIT_ViewManager* theMgr ) +void HYDROGUI_Module::contextMenuPopup( const QString& theClient, + QMenu* theMenu, + QString& theTitle ) +{ + HYDROGUI_DataModel* aModel = getDataModel(); + + size_t aViewId = HYDROGUI_Tool::GetActiveGraphicsViewId( this ); + + bool anIsSelection = false; + bool anIsVisibleInSelection = false; + bool anIsHiddenInSelection = false; + + bool anIsImage = false; + bool anIsImportedImage = false; + bool anIsCompositeImage = false; + bool anIsFusedImage = false; + bool anIsCutImage = false; + bool anIsSplittedImage = false; + bool anIsMustBeUpdatedImage = false; + bool anIsPolyline = false; + bool anIsVisualState = false; + + HYDROData_SequenceOfObjects aSeq = HYDROGUI_Tool::GetSelectedObjects( this ); + for( Standard_Integer anIndex = 1, aLength = aSeq.Length(); anIndex <= aLength; anIndex++ ) + { + Handle(HYDROData_Object) anObject = aSeq.Value( anIndex ); + if( !anObject.IsNull() ) + { + anIsSelection = true; + + bool aVisibility = isObjectVisible( aViewId, anObject ); + anIsVisibleInSelection |= aVisibility; + anIsHiddenInSelection |= !aVisibility; + + if( anObject->GetKind() == KIND_IMAGE ) + { + anIsImage = true; + Handle(HYDROData_Image) anImage = Handle(HYDROData_Image)::DownCast( anObject ); + if( !anImage.IsNull() ) + { + anIsImportedImage = anImage->HasTrsfPoints() && !anImage->IsSelfSplitted(); + anIsCompositeImage = anImage->NbReferences() > 0; + if( HYDROOperations_Factory* aFactory = HYDROOperations_Factory::Factory() ) + { + if( ImageComposer_Operator* anOperator = aFactory->Operator( anImage ) ) + { + if( dynamic_cast( anOperator ) ) + anIsFusedImage = true; + else if( dynamic_cast( anOperator ) ) + anIsCutImage = true; + else if( dynamic_cast( anOperator ) ) + anIsSplittedImage = true; + } + } + anIsMustBeUpdatedImage = anImage->MustBeUpdated(); + } + } + else if( anObject->GetKind() == KIND_POLYLINE ) + anIsPolyline = true; + else if( anObject->GetKind() == KIND_VISUAL_STATE ) + anIsVisualState = true; + } + } + + if( aSeq.IsEmpty() ) + { + theMenu->addAction( action( SaveVisualStateId ) ); + theMenu->addSeparator(); + } + + if( anIsSelection && anIsMustBeUpdatedImage ) + { + theMenu->addAction( action( UpdateImageId ) ); + theMenu->addSeparator(); + } + + if( anIsSelection && aSeq.Length() == 1 ) + { + if( anIsImage ) + { + if( anIsImportedImage ) + theMenu->addAction( action( EditImportedImageId ) ); + else if( anIsCompositeImage ) + { + if( anIsFusedImage ) + theMenu->addAction( action( EditFusedImageId ) ); + else if( anIsCutImage ) + theMenu->addAction( action( EditCutImageId ) ); + else if( anIsSplittedImage ) + theMenu->addAction( action( EditSplittedImageId ) ); + } + + theMenu->addAction( action( ObserveImageId ) ); + theMenu->addAction( action( ExportImageId ) ); + theMenu->addSeparator(); + } + else if( anIsPolyline ) + { + theMenu->addAction( action( EditPolylineId ) ); + theMenu->addSeparator(); + } + else if( anIsVisualState ) + { + theMenu->addAction( action( SaveVisualStateId ) ); + theMenu->addAction( action( LoadVisualStateId ) ); + theMenu->addSeparator(); + } + } + + if( anIsSelection ) + { + theMenu->addAction( action( DeleteId ) ); + theMenu->addSeparator(); + } + + if( anIsSelection && ( anIsImage || anIsPolyline ) ) + { + if( anIsHiddenInSelection ) + theMenu->addAction( action( ShowId ) ); + theMenu->addAction( action( ShowOnlyId ) ); + if( anIsVisibleInSelection ) + theMenu->addAction( action( HideId ) ); + theMenu->addSeparator(); + } + + theMenu->addAction( action( ShowAllId ) ); + theMenu->addAction( action( HideAllId ) ); + theMenu->addSeparator(); +} + +void HYDROGUI_Module::update( const int flags ) { - LightApp_Module::onViewManagerAdded( theMgr ); - connect( theMgr, SIGNAL( viewCreated( SUIT_ViewWindow* ) ), - this, SLOT( onViewWindowAdded( SUIT_ViewWindow* ) ) ); + if( !isUpdateEnabled() ) + return; + + QApplication::setOverrideCursor( Qt::WaitCursor ); + + // To prevent calling this method recursively + // from one of the methods called below + setUpdateEnabled( false ); + + if( ( flags & UF_Viewer ) ) + updateGV( flags & UF_GV_Init, + flags & UF_GV_Forced ); + + if( ( flags & UF_Model ) && getDataModel() && getApp() ) + { + getDataModel()->update( getStudyId() ); + + // Temporary workaround to prevent breaking + // the selection in the object browser. + // Note: processEvents() should be called after updateGV(), + // otherwise the application crashes from time to time. + qApp->processEvents(); + getApp()->updateObjectBrowser( true ); + } + + // Object browser is currently updated by using UF_Model flag + //if( ( flags & UF_ObjBrowser ) && getApp() ) + // getApp()->updateObjectBrowser( true ); + + if( ( flags & UF_Controls ) && getApp() ) + getApp()->updateActions(); + + setUpdateEnabled( true ); + + QApplication::restoreOverrideCursor(); } -void HYDROGUI_Module::onViewWindowAdded( SUIT_ViewWindow* theWnd ) +void HYDROGUI_Module::updateCommandsStatus() { - GraphicsView_ViewFrame* aViewFrame = dynamic_cast( theWnd ); + LightApp_Module::updateCommandsStatus(); - LightApp_SelectionMgr* aSelMgr = getApp()->selectionMgr(); - LightApp_GVSelector* aSelector = new LightApp_GVSelector( aViewFrame->getViewer(), aSelMgr ); + updateUndoRedoControls(); - GraphicsView_ViewPort* aViewPort = aViewFrame->getViewPort(); + // to do + //action( ... )->setEnabled( ... ); +} + +HYDROGUI_DataModel* HYDROGUI_Module::getDataModel() const +{ + return (HYDROGUI_DataModel*)dataModel(); +} - GraphicsView_PrsImage* aPrs1 = new GraphicsView_PrsImage(); - QImage anImage1( "W:/Work/HYDRO/data/samples/1.bmp" ); - aPrs1->setImage( anImage1 ); - aPrs1->setName( "example_1" ); - aPrs1->compute(); - aViewPort->addItem( aPrs1 ); +HYDROGUI_Displayer* HYDROGUI_Module::getDisplayer() const +{ + return myDisplayer; +} + +GraphicsView_Viewer* HYDROGUI_Module::getViewer( const int theId ) const +{ + if( myViewManagerMap.contains( theId ) ) + { + ViewManagerInfo anInfo = myViewManagerMap[ theId ]; + GraphicsView_ViewManager* aViewManager = + dynamic_cast( anInfo.first ); + if( aViewManager ) + return aViewManager->getViewer(); + } + return NULL; +} + +int HYDROGUI_Module::getViewManagerId( SUIT_ViewManager* theViewManager ) +{ + ViewManagerMapIterator anIter( myViewManagerMap ); + while( anIter.hasNext() ) + { + int anId = anIter.next().key(); + const ViewManagerInfo& anInfo = anIter.value(); + if( anInfo.first == theViewManager ) + return anId; + } + return -1; +} - GraphicsView_PrsImage* aPrs2 = new GraphicsView_PrsImage(); - QImage anImage2( "W:/Work/HYDRO/data/samples/2.bmp" ); - aPrs2->setImage( anImage2 ); - aPrs2->setName( "example_2" ); - aPrs2->setRotationAngle( 30 ); - aPrs2->setPosition( 200, 50 ); - aPrs2->compute(); - aViewPort->addItem( aPrs2 ); - - //qApp->processEvents(); - aViewPort->fitAll(); +HYDROGUI_Module::ViewManagerRole HYDROGUI_Module::getViewManagerRole( SUIT_ViewManager* theViewManager ) +{ + int anId = getViewManagerId( theViewManager ); + if( anId != -1 ) + { + const ViewManagerInfo& anInfo = myViewManagerMap[ anId ]; + return anInfo.second; + } + return VMR_Unknown; +} + +void HYDROGUI_Module::setViewManagerRole( SUIT_ViewManager* theViewManager, + const ViewManagerRole theRole ) +{ + int anId = getViewManagerId( theViewManager ); + if( anId != -1 ) + { + ViewManagerInfo& anInfo = myViewManagerMap[ anId ]; + anInfo.second = theRole; + } +} + +bool HYDROGUI_Module::isObjectVisible( const int theViewId, + const Handle(HYDROData_Object)& theObject ) +{ + if( theObject.IsNull() ) + return false; + + ViewId2Name2ObjectStateMap::const_iterator anIter1 = myObjectStateMap.find( theViewId ); + if( anIter1 != myObjectStateMap.end() ) + { + const Name2ObjectStateMap& aName2ObjectStateMap = anIter1.value(); + Name2ObjectStateMap::const_iterator anIter2 = aName2ObjectStateMap.find( theObject->GetName()); + if( anIter2 != aName2ObjectStateMap.end() ) + { + const ObjectState& anObjectState = anIter2.value(); + return anObjectState.Visibility; + } + } + return false; +} + +void HYDROGUI_Module::setObjectVisible( const int theViewId, + const Handle(HYDROData_Object)& theObject, + const bool theState ) +{ + if( !theObject.IsNull() ) + { + Name2ObjectStateMap& aName2ObjectStateMap = myObjectStateMap[ theViewId ]; + ObjectState& anObjectState = aName2ObjectStateMap[ theObject->GetName() ]; + anObjectState.Visibility = theState; + } +} + +CAM_DataModel* HYDROGUI_Module::createDataModel() +{ + return new HYDROGUI_DataModel( this ); +} + +void HYDROGUI_Module::customEvent( QEvent* e ) +{ + int aType = e->type(); + if ( aType == NewViewEvent ) + { + SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e; + if( GraphicsView_ViewFrame* aViewFrame = ( GraphicsView_ViewFrame* )ce->data() ) + { + if( GraphicsView_Viewer* aViewer = dynamic_cast( aViewFrame->getViewer() ) ) + { + if( GraphicsView_ViewPort* aViewPort = aViewer->getActiveViewPort() ) + { + aViewPort->setInteractionFlag( GraphicsView_ViewPort::TraceBoundingRect ); + aViewPort->setInteractionFlag( GraphicsView_ViewPort::ImmediateContextMenu ); + aViewPort->setInteractionFlag( GraphicsView_ViewPort::ImmediateSelection ); + + //ouv: temporarily commented + //aViewPort->setViewLabelPosition( GraphicsView_ViewPort::VLP_BottomLeft, true ); + } + + SUIT_ViewManager* aViewManager = aViewer->getViewManager(); + ViewManagerRole aRole = getViewManagerRole( aViewManager ); + if( aRole != VMR_TransformImage ) + update( UF_Viewer ); + + aViewer->activateTransform( GraphicsView_Viewer::FitAll ); + } + } + } +} + +bool HYDROGUI_Module::eventFilter( QObject* theObj, QEvent* theEvent ) +{ + QEvent::Type aType = theEvent->type(); + if( theObj->inherits( "GraphicsView_ViewFrame" ) ) + { + if( aType == QEvent::Show ) + { + SALOME_CustomEvent* e = new SALOME_CustomEvent( NewViewEvent ); + e->setData( theObj ); + QApplication::postEvent( this, e ); + theObj->removeEventFilter( this ); + } + } + return LightApp_Module::eventFilter( theObj, theEvent ); +} + +void HYDROGUI_Module::onViewManagerAdded( SUIT_ViewManager* theViewManager ) +{ + LightApp_Module::onViewManagerAdded( theViewManager ); + + if( theViewManager->getType() == GraphicsView_Viewer::Type() ) + { + createSelector( theViewManager ); // replace the default selector + + connect( theViewManager, SIGNAL( viewCreated( SUIT_ViewWindow* ) ), + this, SLOT( onViewCreated( SUIT_ViewWindow* ) ) ); + } + + ViewManagerInfo anInfo( theViewManager, VMR_General ); + myViewManagerMap.insert( ViewManagerId++, anInfo ); +} + +void HYDROGUI_Module::onViewManagerRemoved( SUIT_ViewManager* theViewManager ) +{ + LightApp_Module::onViewManagerRemoved( theViewManager ); + + createSelector( theViewManager ); // replace the default selector + + int anId = getViewManagerId( theViewManager ); + if( anId != -1 ) + myViewManagerMap.remove( anId ); +} + +void HYDROGUI_Module::onViewCreated( SUIT_ViewWindow* theViewWindow ) +{ + if( theViewWindow && theViewWindow->inherits( "GraphicsView_ViewFrame" ) ) + { + if( GraphicsView_ViewFrame* aViewFrame = dynamic_cast( theViewWindow ) ) + { + aViewFrame->installEventFilter( this ); + + GraphicsView_ViewPort* aViewPort = aViewFrame->getViewPort(); + + connect( aViewPort, SIGNAL( vpMouseEvent( QGraphicsSceneMouseEvent* ) ), + this, SLOT( onViewPortMouseEvent( QGraphicsSceneMouseEvent* ) ) ); + return; + } + } +} + +void HYDROGUI_Module::onViewPortMouseEvent( QGraphicsSceneMouseEvent* theEvent ) +{ + if( GraphicsView_ViewPort* aViewPort = qobject_cast( sender() ) ) + { + SUIT_ViewManager* aViewManager = 0; + + QObject* aParent = aViewPort; + while( aParent = aParent->parent() ) + { + if( GraphicsView_ViewFrame* aViewFrame = dynamic_cast( aParent ) ) + { + if( GraphicsView_Viewer* aViewer = aViewFrame->getViewer() ) + { + aViewManager = aViewer->getViewManager(); + break; + } + } + } + + if( !aViewManager ) + return; + + double aMouseX = theEvent->scenePos().x(); + double aMouseY = theEvent->scenePos().y(); + + ViewManagerRole aRole = getViewManagerRole( aViewManager ); + if( aRole == VMR_General ) + { + int aXDeg = 0, aYDeg = 0; + int aXMin = 0, aYMin = 0; + double aXSec = 0, aYSec = 0; + HYDROGUI_Tool::DoubleToLambert( aMouseX, aXDeg, aXMin, aXSec ); + HYDROGUI_Tool::DoubleToLambert( aMouseY, aYDeg, aYMin, aYSec ); + + QString aDegSymbol( QChar( 0x00B0 ) ); + QString aXStr = QString( "%1%2 %3' %4\"" ).arg( aXDeg ).arg( aDegSymbol ).arg( aXMin ).arg( aXSec ); + QString aYStr = QString( "%1%2 %3' %4\"" ).arg( aYDeg ).arg( aDegSymbol ).arg( aYMin ).arg( aYSec ); + + aViewPort->setViewLabelText( QString( "X: %1\nY: %2" ).arg( aXStr ).arg( aYStr ) ); + } + else if( aRole == VMR_TransformImage ) + aViewPort->setViewLabelText( QString( "X: %1\nY: %2" ).arg( (int)aMouseX ).arg( (int)aMouseY ) ); + } +} + +void HYDROGUI_Module::updateGV( const bool theIsInit, + const bool theIsForced ) +{ + if( !getDisplayer() ) + return; + + QList aViewManagerIdList; + + // currently, all views are updated + ViewManagerMapIterator anIter( myViewManagerMap ); + while( anIter.hasNext() ) + { + int anId = anIter.next().key(); + aViewManagerIdList.append( anId ); + } + + QListIterator anIdIter( aViewManagerIdList ); + while( anIdIter.hasNext() ) + getDisplayer()->UpdateAll( anIdIter.next(), theIsInit, theIsForced ); +} + +void HYDROGUI_Module::createSelector( SUIT_ViewManager* theViewManager ) +{ + if( !theViewManager ) + return; + + LightApp_SelectionMgr* aSelectionMgr = getApp()->selectionMgr(); + if( !aSelectionMgr ) + return; + + QString aViewType = theViewManager->getType(); + if( aViewType != GraphicsView_Viewer::Type() ) + return; + + GraphicsView_ViewManager* aViewManager = + dynamic_cast( theViewManager ); + if( !aViewManager ) + return; + + QList aSelectorList; + aSelectionMgr->selectors( aViewType, aSelectorList ); + + // disable all alien selectors + QList::iterator anIter, anIterEnd = aSelectorList.end(); + for( anIter = aSelectorList.begin(); anIter != anIterEnd; anIter++ ) + { + SUIT_Selector* aSelector = *anIter; + if( aSelector && !dynamic_cast( aSelector ) ) + aSelector->setEnabled( false ); + } + + new HYDROGUI_GVSelector( this, aViewManager->getViewer(), aSelectionMgr ); +} + +bool HYDROGUI_Module::setUpdateEnabled( const bool theState ) +{ + bool aPrevState = myIsUpdateEnabled; + myIsUpdateEnabled = theState; + return aPrevState; +} + +bool HYDROGUI_Module::isUpdateEnabled() const +{ + return myIsUpdateEnabled; }