X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_Module.cxx;h=b36585e22f5de3e928030780271e0b060830d6c4;hb=de7cf9bb0a7a41d6487013c87f4a54d0664cd303;hp=3a87b3745d61362cfd844290038401ebd291a238;hpb=5f1c089db35b75a592625b708921df2320563363;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Module.cxx b/src/HYDROGUI/HYDROGUI_Module.cxx index 3a87b374..b36585e2 100644 --- a/src/HYDROGUI/HYDROGUI_Module.cxx +++ b/src/HYDROGUI/HYDROGUI_Module.cxx @@ -28,38 +28,65 @@ #include "HYDROGUI_GVSelector.h" #include "HYDROGUI_InputPanel.h" #include "HYDROGUI_ObjSelector.h" +#include "HYDROGUI_OCCDisplayer.h" +#include "HYDROGUI_OCCSelector.h" #include "HYDROGUI_Operations.h" #include "HYDROGUI_PrsImage.h" +#include "HYDROGUI_Tool.h" #include "HYDROGUI_UpdateFlags.h" +#include "HYDROGUI_Shape.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 +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" ), myDisplayer( 0 ), + myOCCDisplayer( 0 ), myIsUpdateEnabled( true ) { } @@ -88,15 +115,26 @@ void HYDROGUI_Module::initialize( CAM_Application* theApp ) setToolShown( false ); myDisplayer = new HYDROGUI_Displayer( this ); + myOCCDisplayer = new HYDROGUI_OCCDisplayer( this ); } bool HYDROGUI_Module::activateModule( SUIT_Study* theStudy ) { bool aRes = LightApp_Module::activateModule( theStudy ); + LightApp_Application* anApp = getApp(); + SUIT_Desktop* aDesktop = anApp->desktop(); + + getApp()->setEditEnabled( false ); // hide SalomeApp copy/paste actions + setMenuShown( true ); setToolShown( true ); +#ifndef DISABLE_PYCONSOLE + aDesktop->tabifyDockWidget( HYDROGUI_Tool::WindowDock( anApp->getWindow( LightApp_Application::WT_PyConsole ) ), + HYDROGUI_Tool::WindowDock( anApp->getWindow( LightApp_Application::WT_LogWindow ) ) ); +#endif + update( UF_All ); updateCommandsStatus(); @@ -106,9 +144,23 @@ bool HYDROGUI_Module::activateModule( SUIT_Study* theStudy ) 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(); + myShapesMap.clear(); + + // clear the data model's list of copying objects + HYDROGUI_DataModel::changeCopyingObjects( HYDROData_SequenceOfObjects() ); + setMenuShown( false ); setToolShown( false ); + getApp()->setEditEnabled( true ); // show SalomeApp copy/paste actions + return LightApp_Module::deactivateModule( theStudy ); } @@ -116,12 +168,15 @@ void HYDROGUI_Module::windows( QMap& theMap ) const { theMap.clear(); theMap.insert( LightApp_Application::WT_LogWindow, Qt::BottomDockWidgetArea ); +#ifndef DISABLE_PYCONSOLE + theMap.insert( LightApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea ); +#endif theMap.insert( LightApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea ); } void HYDROGUI_Module::viewManagers( QStringList& theTypesList ) const { - theTypesList << GraphicsView_Viewer::Type(); + theTypesList << OCCViewer_Viewer::Type() << GraphicsView_Viewer::Type(); } void HYDROGUI_Module::contextMenuPopup( const QString& theClient, @@ -130,61 +185,176 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, { HYDROGUI_DataModel* aModel = getDataModel(); - LightApp_SelectionMgr* aSelectionMgr = getApp()->selectionMgr(); - if( !aSelectionMgr ) + bool anIsObjectBrowser = theClient == "ObjectBrowser"; + bool anIsGraphicsView = theClient == GraphicsView_Viewer::Type(); + bool anIsOCCView = theClient == OCCViewer_Viewer::Type(); + if( !anIsObjectBrowser && !anIsGraphicsView && !anIsOCCView ) return; - SUIT_DataOwnerPtrList anOwners; - aSelectionMgr->selected( anOwners ); + size_t anActiveViewId = HYDROGUI_Tool::GetActiveViewId( this ); - bool anIsSelection = false; + bool anIsSelectedDataObjects = false; bool anIsVisibleInSelection = false; bool anIsHiddenInSelection = false; bool anIsImage = false; + bool anIsImportedImage = false; + bool anIsImageHasRefs = false; + bool anIsFusedImage = false; + bool anIsCutImage = false; + bool anIsSplittedImage = false; + bool anIsMustBeUpdatedImage = false; bool anIsPolyline = false; + bool anIsCalculation = false; + bool anIsImmersibleZone = false; + bool anIsVisualState = false; - foreach( SUIT_DataOwner* aSUITOwner, anOwners ) + // check the selected data model objects + HYDROData_SequenceOfObjects aSeq = HYDROGUI_Tool::GetSelectedObjects( this ); + for( Standard_Integer anIndex = 1, aLength = aSeq.Length(); anIndex <= aLength; anIndex++ ) { - if( LightApp_DataOwner* anOwner = dynamic_cast( aSUITOwner ) ) + Handle(HYDROData_Entity) anObject = aSeq.Value( anIndex ); + if( !anObject.IsNull() ) { - Handle(HYDROData_Object) anObject = aModel->objectByEntry( anOwner->entry() ); - if( !anObject.IsNull() ) - { - anIsSelection = true; + anIsSelectedDataObjects = true; - bool aVisibility = anObject->GetVisibility(); - anIsVisibleInSelection |= aVisibility; - anIsHiddenInSelection |= !aVisibility; + bool aVisibility = isObjectVisible( anActiveViewId, anObject ); + anIsVisibleInSelection |= aVisibility; + anIsHiddenInSelection |= !aVisibility; - if( anObject->GetKind() == KIND_IMAGE ) - anIsImage = true; + if( anObject->GetKind() == KIND_IMAGE ) + { + anIsImage = true; + Handle(HYDROData_Image) anImage = Handle(HYDROData_Image)::DownCast( anObject ); + if( !anImage.IsNull() ) + { + anIsImportedImage = anImage->HasLocalPoints() && !anImage->IsSelfSplitted(); + anIsImageHasRefs = anImage->HasReferences(); + if( HYDROData_OperationsFactory* aFactory = HYDROData_OperationsFactory::Factory() ) + { + if( ImageComposer_Operator* anOperator = aFactory->Operator( anImage ) ) + { + QString anOperatorName = anOperator->name(); + if( anOperatorName == ImageComposer_FuseOperator::Type() ) + anIsFusedImage = true; + else if( anOperatorName == ImageComposer_CutOperator::Type() ) + anIsCutImage = true; + else if( anOperatorName == ImageComposer_CropOperator::Type() ) + anIsSplittedImage = true; + } + } + anIsMustBeUpdatedImage = anImage->IsMustBeUpdated(); + } + } + else if( anObject->GetKind() == KIND_POLYLINE ) + anIsPolyline = true; + else if( anObject->GetKind() == KIND_CALCULATION ) + anIsCalculation = true; + else if( anObject->GetKind() == KIND_IMMERSIBLE_ZONE ) + anIsImmersibleZone = true; + else if( anObject->GetKind() == KIND_VISUAL_STATE ) + anIsVisualState = true; + } + } - if( anObject->GetKind() == KIND_POLYLINE ) - anIsPolyline = true; + // check the selected partitions + if( !anIsSelectedDataObjects && anIsObjectBrowser ) + { + ObjectKind aSelectedPartition = HYDROGUI_Tool::GetSelectedPartition( this ); + if( aSelectedPartition != KIND_UNKNOWN ) + { + switch( aSelectedPartition ) + { + case KIND_IMAGE: + theMenu->addAction( action( ImportImageId ) ); + break; + case KIND_POLYLINE: + theMenu->addAction( action( CreatePolylineId ) ); + break; + case KIND_VISUAL_STATE: + theMenu->addAction( action( SaveVisualStateId ) ); + break; + case KIND_BATHYMETRY: + theMenu->addAction( action( ImportBathymetryId ) ); + break; + case KIND_CALCULATION: + theMenu->addAction( action( CreateCalculationId ) ); + break; + case KIND_IMMERSIBLE_ZONE: + theMenu->addAction( action( CreateImmersibleZoneId ) ); + break; } + theMenu->addSeparator(); } } - if( anOwners.count() == 1 && anIsImage ) + if( anIsSelectedDataObjects && anIsMustBeUpdatedImage ) { - theMenu->addAction( action( EditImageId ) ); + theMenu->addAction( action( UpdateImageId ) ); theMenu->addSeparator(); } - if( anOwners.count() == 1 && anIsPolyline ) + if( anIsSelectedDataObjects && aSeq.Length() == 1 ) { - theMenu->addAction( action( EditPolylineId ) ); - theMenu->addSeparator(); + if( anIsImage ) + { + if( anIsImportedImage ) + theMenu->addAction( action( EditImportedImageId ) ); + else if( anIsImageHasRefs ) + { + 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(); + + if( anIsImageHasRefs ) + { + theMenu->addAction( action( RemoveImageRefsId ) ); + theMenu->addSeparator(); + } + + theMenu->addAction( action( FuseImagesId ) ); + theMenu->addAction( action( CutImagesId ) ); + theMenu->addAction( action( SplitImageId ) ); + theMenu->addSeparator(); + } + else if( anIsPolyline ) + { + theMenu->addAction( action( EditPolylineId ) ); + theMenu->addSeparator(); + } + else if( anIsCalculation ) + { + theMenu->addAction( action( EditCalculationId ) ); + theMenu->addSeparator(); + } + else if( anIsImmersibleZone ) + { + theMenu->addAction( action( EditImmersibleZoneId ) ); + theMenu->addSeparator(); + } + else if( anIsVisualState && anIsObjectBrowser ) + { + theMenu->addAction( action( SaveVisualStateId ) ); + theMenu->addAction( action( LoadVisualStateId ) ); + theMenu->addSeparator(); + } } - if( anIsSelection ) + if( anIsSelectedDataObjects ) { theMenu->addAction( action( DeleteId ) ); theMenu->addSeparator(); } - if( anIsSelection ) + if( anIsSelectedDataObjects && ( anIsImage || anIsPolyline || anIsImmersibleZone ) ) { if( anIsHiddenInSelection ) theMenu->addAction( action( ShowId ) ); @@ -193,9 +363,13 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addAction( action( HideId ) ); theMenu->addSeparator(); } - theMenu->addAction( action( ShowAllId ) ); - theMenu->addAction( action( HideAllId ) ); - theMenu->addSeparator(); + + if( anIsObjectBrowser || anIsGraphicsView || anIsOCCView ) + { + theMenu->addAction( action( ShowAllId ) ); + theMenu->addAction( action( HideAllId ) ); + theMenu->addSeparator(); + } } void HYDROGUI_Module::update( const int flags ) @@ -209,25 +383,39 @@ void HYDROGUI_Module::update( const int flags ) // from one of the methods called below setUpdateEnabled( false ); - if( ( flags & UF_Model ) && getDataModel() ) - { - getDataModel()->update( getStudyId() ); - } - else - { - /* to do - if( ( flags & UF_ObjBrowser ) && getObjectBrowser() ) - updateObjectBrowser(); - */ - } + // store selected objects + QStringList aSelectedEntries = storeSelection(); if( ( flags & UF_Viewer ) ) updateGV( flags & UF_GV_Init, flags & UF_GV_Forced ); + if( ( flags & UF_OCCViewer ) ) + updateOCCViewer( flags & UF_OCC_Init, + flags & UF_OCC_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. + //RKV: 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(); + // restore selected objects + restoreSelection( aSelectedEntries ); + setUpdateEnabled( true ); QApplication::restoreOverrideCursor(); @@ -239,8 +427,14 @@ void HYDROGUI_Module::updateCommandsStatus() updateUndoRedoControls(); - // to do - //action( ... )->setEnabled( ... ); + action( CopyId )->setEnabled( getDataModel()->canCopy() ); + action( PasteId )->setEnabled( getDataModel()->canPaste() ); +} + +void HYDROGUI_Module::selectionChanged() +{ + LightApp_Module::selectionChanged(); + updateCommandsStatus(); } HYDROGUI_DataModel* HYDROGUI_Module::getDataModel() const @@ -253,22 +447,177 @@ HYDROGUI_Displayer* HYDROGUI_Module::getDisplayer() const return myDisplayer; } -GraphicsView_Viewer* HYDROGUI_Module::getViewer( const int theViewerId ) const +HYDROGUI_OCCDisplayer* HYDROGUI_Module::getOCCDisplayer() const { - ViewManagerList aViewManagerList; - getApp()->viewManagers( GraphicsView_Viewer::Type(), aViewManagerList ); + return myOCCDisplayer; +} - ViewManagerList::iterator anIter, anIterEnd = aViewManagerList.end(); - for( anIter = aViewManagerList.begin(); anIter != anIterEnd; anIter++ ) +GraphicsView_Viewer* HYDROGUI_Module::getViewer( const int theId ) const +{ + if( myViewManagerMap.contains( theId ) ) { + ViewManagerInfo anInfo = myViewManagerMap[ theId ]; GraphicsView_ViewManager* aViewManager = - dynamic_cast( *anIter ); - if( aViewManager && aViewManager->getId() == theViewerId ) + dynamic_cast( anInfo.first ); + if( aViewManager ) return aViewManager->getViewer(); } return NULL; } +OCCViewer_Viewer* HYDROGUI_Module::getOCCViewer( const int theId ) const +{ + if( myViewManagerMap.contains( theId ) ) + { + ViewManagerInfo anInfo = myViewManagerMap[ theId ]; + OCCViewer_ViewManager* aViewManager = + ::qobject_cast( anInfo.first ); + if( aViewManager ) + return aViewManager->getOCCViewer(); + } + 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; +} + +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_Entity)& theObject ) const +{ + 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_Entity)& theObject, + const bool theState ) +{ + if( !theObject.IsNull() ) + { + Name2ObjectStateMap& aName2ObjectStateMap = myObjectStateMap[ theViewId ]; + ObjectState& anObjectState = aName2ObjectStateMap[ theObject->GetName() ]; + anObjectState.Visibility = theState; + } +} + +HYDROGUI_Shape* HYDROGUI_Module::getObjectShape( const int theViewId, + const Handle(HYDROData_Entity)& theObject ) const +{ + HYDROGUI_Shape* aResShape = NULL; + if( theObject.IsNull() ) + return aResShape; + + if ( myShapesMap.contains( theViewId ) ) + { + const ListOfShapes& aViewShapes = myShapesMap.value( theViewId ); + foreach ( HYDROGUI_Shape* aShape, aViewShapes ) + { + if ( !aShape || !IsEqual( aShape->getObject(), theObject ) ) + continue; + + aResShape = aShape; + break; + } + } + + return aResShape; +} + +void HYDROGUI_Module::setObjectShape( const int theViewId, + const Handle(HYDROData_Entity)& theObject, + HYDROGUI_Shape* theShape ) +{ + if( theObject.IsNull() ) + return; + + ListOfShapes& aViewShapes = myShapesMap[ theViewId ]; + aViewShapes.append( theShape ); +} + +void HYDROGUI_Module::removeObjectShape( const int theViewId, + const Handle(HYDROData_Entity)& theObject ) +{ + if ( !myShapesMap.contains( theViewId ) ) + return; + + ListOfShapes& aViewShapes = myShapesMap[ theViewId ]; + Handle(HYDROData_Entity) anObject; + for ( int i = 0; i < aViewShapes.length(); ) + { + HYDROGUI_Shape* aShape = aViewShapes.at( i ); + anObject = aShape->getObject(); + if ( aShape && (!anObject.IsNull()) && IsEqual( anObject, theObject ) ) + { + delete aShape; + aViewShapes.removeAt( i ); + continue; + } + + ++i; + } +} + +void HYDROGUI_Module::removeViewShapes( const int theViewId ) +{ + if ( !myShapesMap.contains( theViewId ) ) + return; + + const ListOfShapes& aViewShapes = myShapesMap.value( theViewId ); + for ( int i = 0, n = aViewShapes.length(); i < n; ++i ) + { + HYDROGUI_Shape* aShape = aViewShapes.at( i ); + if ( aShape ) + delete aShape; + } + + myShapesMap.remove( theViewId ); +} + CAM_DataModel* HYDROGUI_Module::createDataModel() { return new HYDROGUI_DataModel( this ); @@ -284,18 +633,26 @@ void HYDROGUI_Module::customEvent( QEvent* e ) { if( GraphicsView_Viewer* aViewer = dynamic_cast( aViewFrame->getViewer() ) ) { - //update( UF_Viewer | UF_GV_Forced ); // ouv: to do - aViewer->activateTransform( GraphicsView_Viewer::FitAll ); + SUIT_ViewManager* aViewManager = aViewer->getViewManager(); + ViewManagerRole aRole = getViewManagerRole( aViewManager ); if( GraphicsView_ViewPort* aViewPort = aViewer->getActiveViewPort() ) { + if( aRole != VMR_TransformImage && aRole != VMR_ReferenceImage ) + aViewPort->scale( 1, -1 ); // invert the Y axis direction from down to up + aViewPort->setInteractionFlag( GraphicsView_ViewPort::TraceBoundingRect ); aViewPort->setInteractionFlag( GraphicsView_ViewPort::ImmediateContextMenu ); aViewPort->setInteractionFlag( GraphicsView_ViewPort::ImmediateSelection ); - // ouv: tmp - aViewPort->setMousePositionEnabled( true ); + //ouv: temporarily commented + //aViewPort->setViewLabelPosition( GraphicsView_ViewPort::VLP_BottomLeft, true ); } + + if( aRole != VMR_TransformImage && aRole != VMR_ReferenceImage ) + update( UF_Viewer ); + + aViewer->activateTransform( GraphicsView_Viewer::FitAll ); } } } @@ -323,11 +680,19 @@ void HYDROGUI_Module::onViewManagerAdded( SUIT_ViewManager* theViewManager ) if( theViewManager->getType() == GraphicsView_Viewer::Type() ) { - createSelector( theViewManager ); // replace the default selector - connect( theViewManager, SIGNAL( viewCreated( SUIT_ViewWindow* ) ), this, SLOT( onViewCreated( SUIT_ViewWindow* ) ) ); } + else if( theViewManager->getType() == OCCViewer_Viewer::Type() ) + { + connect( theViewManager, SIGNAL( viewCreated( SUIT_ViewWindow* ) ), + this, SLOT( onViewCreated( SUIT_ViewWindow* ) ) ); + } + + createSelector( theViewManager ); // replace the default selector + + ViewManagerInfo anInfo( theViewManager, VMR_General ); + myViewManagerMap.insert( ViewManagerId++, anInfo ); } void HYDROGUI_Module::onViewManagerRemoved( SUIT_ViewManager* theViewManager ) @@ -335,6 +700,21 @@ void HYDROGUI_Module::onViewManagerRemoved( SUIT_ViewManager* theViewManager ) LightApp_Module::onViewManagerRemoved( theViewManager ); createSelector( theViewManager ); // replace the default selector + + int anId = getViewManagerId( theViewManager ); + if( anId != -1 ) + { + OCCViewer_ViewManager* anOCCViewManager = + ::qobject_cast( myViewManagerMap[ anId ].first ); + if ( anOCCViewManager ) + { + OCCViewer_Viewer* anOCCViewer = anOCCViewManager->getOCCViewer(); + if ( anOCCViewer ) + removeViewShapes( (size_t)anOCCViewer ); + } + + myViewManagerMap.remove( anId ); + } } void HYDROGUI_Module::onViewCreated( SUIT_ViewWindow* theViewWindow ) @@ -344,27 +724,120 @@ void HYDROGUI_Module::onViewCreated( SUIT_ViewWindow* theViewWindow ) if( GraphicsView_ViewFrame* aViewFrame = dynamic_cast( theViewWindow ) ) { aViewFrame->installEventFilter( this ); + + GraphicsView_ViewPort* aViewPort = aViewFrame->getViewPort(); + + connect( aViewPort, SIGNAL( vpMouseEvent( QGraphicsSceneMouseEvent* ) ), + this, SLOT( onViewPortMouseEvent( QGraphicsSceneMouseEvent* ) ) ); + } + } + else if( theViewWindow && theViewWindow->inherits( "OCCViewer_ViewFrame" ) ) + { + if( OCCViewer_ViewFrame* aViewFrame = dynamic_cast( theViewWindow ) ) + { + aViewFrame->onTopView(); } } } +void HYDROGUI_Module::onViewPortMouseEvent( QGraphicsSceneMouseEvent* theEvent ) +{ + /* ouv: currently unused + 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; + HYDROData_Lambert93::secToDMS( aMouseX, aXDeg, aXMin, aXSec ); + HYDROData_Lambert93::secToDMS( 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; - ViewManagerList aViewManagerList; - getApp()->viewManagers( GraphicsView_Viewer::Type(), aViewManagerList ); + QList aViewManagerIdList; - ViewManagerList::iterator anIter, anIterEnd = aViewManagerList.end(); - for( anIter = aViewManagerList.begin(); anIter != anIterEnd; anIter++ ) - { + // currently, all views are updated + ViewManagerMapIterator anIter( myViewManagerMap ); + while( anIter.hasNext() ) + { GraphicsView_ViewManager* aViewManager = - dynamic_cast( *anIter ); - if( aViewManager ) - getDisplayer()->UpdateAll( aViewManager->getId(), theIsInit, theIsForced ); + dynamic_cast( anIter.next().value().first ); + if ( !aViewManager ) + continue; + + int anId = anIter.key(); + aViewManagerIdList.append( anId ); + } + + QListIterator anIdIter( aViewManagerIdList ); + while( anIdIter.hasNext() ) + getDisplayer()->UpdateAll( anIdIter.next(), theIsInit, theIsForced ); +} + +void HYDROGUI_Module::updateOCCViewer( const bool theIsInit, + const bool theIsForced ) +{ + HYDROGUI_OCCDisplayer* anOCCDisplayer = getOCCDisplayer(); + if( !anOCCDisplayer ) + return; + + QList aViewManagerIdList; + + // currently, all views are updated + ViewManagerMapIterator anIter( myViewManagerMap ); + while( anIter.hasNext() ) + { + OCCViewer_ViewManager* aViewManager = + ::qobject_cast( anIter.next().value().first ); + if ( !aViewManager ) + continue; + + int anId = anIter.key(); + aViewManagerIdList.append( anId ); } + + QListIterator anIdIter( aViewManagerIdList ); + while( anIdIter.hasNext() ) + anOCCDisplayer->UpdateAll( anIdIter.next(), theIsInit, theIsForced ); } void HYDROGUI_Module::createSelector( SUIT_ViewManager* theViewManager ) @@ -377,12 +850,8 @@ void HYDROGUI_Module::createSelector( SUIT_ViewManager* theViewManager ) return; QString aViewType = theViewManager->getType(); - if( aViewType != GraphicsView_Viewer::Type() ) - return; - - GraphicsView_ViewManager* aViewManager = - dynamic_cast( theViewManager ); - if( !aViewManager ) + if( aViewType != GraphicsView_Viewer::Type() && + aViewType != OCCViewer_Viewer::Type()) return; QList aSelectorList; @@ -393,11 +862,25 @@ void HYDROGUI_Module::createSelector( SUIT_ViewManager* theViewManager ) for( anIter = aSelectorList.begin(); anIter != anIterEnd; anIter++ ) { SUIT_Selector* aSelector = *anIter; - if( aSelector && !dynamic_cast( aSelector ) ) + if( aSelector && ( !dynamic_cast( aSelector ) && + !dynamic_cast( aSelector ) ) ) aSelector->setEnabled( false ); } - new HYDROGUI_GVSelector( this, aViewManager->getViewer(), aSelectionMgr ); + if ( aViewType == GraphicsView_Viewer::Type() ) + { + GraphicsView_ViewManager* aViewManager = + ::qobject_cast( theViewManager ); + if( aViewManager ) + new HYDROGUI_GVSelector( this, aViewManager->getViewer(), aSelectionMgr ); + } + else if ( aViewType == OCCViewer_Viewer::Type() ) + { + OCCViewer_ViewManager* aViewManager = + ::qobject_cast( theViewManager ); + if( aViewManager ) + new HYDROGUI_OCCSelector( this, aViewManager->getOCCViewer(), aSelectionMgr ); + } } bool HYDROGUI_Module::setUpdateEnabled( const bool theState ) @@ -411,3 +894,34 @@ bool HYDROGUI_Module::isUpdateEnabled() const { return myIsUpdateEnabled; } + +QStringList HYDROGUI_Module::storeSelection() const +{ + QStringList anEntryList; + if( LightApp_SelectionMgr* aSelectionMgr = getApp()->selectionMgr() ) + { + SUIT_DataOwnerPtrList aList( true ); + aSelectionMgr->selected( aList ); + + SUIT_DataOwnerPtrList::iterator anIter; + for( anIter = aList.begin(); anIter != aList.end(); anIter++ ) + { + const LightApp_DataOwner* anOwner = + dynamic_cast( (*anIter).operator->() ); + if( anOwner ) + anEntryList.append( anOwner->entry() ); + } + } + return anEntryList; +} + +void HYDROGUI_Module::restoreSelection( const QStringList& theEntryList ) +{ + if( LightApp_SelectionMgr* aSelectionMgr = getApp()->selectionMgr() ) + { + SUIT_DataOwnerPtrList aList( true ); + for( int anIndex = 0, aSize = theEntryList.size(); anIndex < aSize; anIndex++ ) + aList.append( SUIT_DataOwnerPtr( new LightApp_DataOwner( theEntryList[ anIndex ] ) ) ); + aSelectionMgr->setSelected( aList ); + } +}