X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_Module.cxx;h=d08d53b5aaa3f980bf9f84d5def5df83aec0635d;hb=cd6ea20d9a76665a24a533d0340385a335961f05;hp=7d2197a1c64f54c60400a1b7255a0a459dc6f4c1;hpb=94ce56d6f7ffc055c2409af2c48d1278fe42d90e;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Module.cxx b/src/HYDROGUI/HYDROGUI_Module.cxx index 7d2197a1..d08d53b5 100644 --- a/src/HYDROGUI/HYDROGUI_Module.cxx +++ b/src/HYDROGUI/HYDROGUI_Module.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2015 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 @@ -6,7 +6,7 @@ // 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 @@ -24,34 +24,83 @@ #include "HYDROGUI.h" #include "HYDROGUI_DataModel.h" +#include "HYDROGUI_DataObject.h" #include "HYDROGUI_Displayer.h" #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 "HYDROGUI_VTKPrs.h" +#include "HYDROGUI_VTKPrsDisplayer.h" +#include "HYDROGUI_AbstractDisplayer.h" +#include "HYDROGUI_PolylineOp.h" +#include "HYDROGUI_SetColorOp.h" +#include "HYDROGUI_ImportGeomObjectOp.h" +#include "HYDROGUI_ShowHideOp.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 +#include +#include +#include + +#include + +#include +#include + +#include #include #include #include #include +#include +#include +#include static int ViewManagerId = 0; @@ -60,9 +109,15 @@ 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 ) { } @@ -91,33 +146,136 @@ void HYDROGUI_Module::initialize( CAM_Application* theApp ) setToolShown( false ); myDisplayer = new HYDROGUI_Displayer( this ); + myOCCDisplayer = new HYDROGUI_OCCDisplayer( this ); + myVTKDisplayer = new HYDROGUI_VTKPrsDisplayer( 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 + + // Remove defunct view managers from the map. + // It's essential to do this before "update( UF_All )" call! + QList anObsoleteIds; + ViewManagerList anAllViewManagers = anApp->viewManagers(); + ViewManagerList aHydroViewManagers; // view managers created inside the HYDRO module + ViewManagerMapIterator anIter( myViewManagerMap ); + while( anIter.hasNext() ) { + int anId = anIter.next().key(); + const ViewManagerInfo& anInfo = anIter.value(); + + aHydroViewManagers << anInfo.first; + + if ( !anAllViewManagers.contains( anInfo.first ) ) { + anObsoleteIds << anId; + } + } + foreach ( const int anId, anObsoleteIds ) { + myViewManagerMap.remove( anId ); + myObjectStateMap.remove( anId ); + myShapesMap.remove( anId ); + myVTKPrsMap.remove( anId ); + } + // Replace the default selector for all view managers. + // Add view managers created outside of HYDRO module to the map. + foreach ( SUIT_ViewManager* aViewManager, anAllViewManagers ) { + createSelector( aViewManager ); // replace the default selector + if ( !aHydroViewManagers.contains( aViewManager ) ) { + ViewManagerInfo anInfo( aViewManager, VMR_General ); + myViewManagerMap.insert( ViewManagerId++, anInfo ); + } + } + update( UF_All ); updateCommandsStatus(); + HYDROGUI_Tool::setOCCActionShown( this, OCCViewer_ViewWindow::MaximizedId, false ); + + ViewManagerList anOCCViewManagers; + anApp->viewManagers( OCCViewer_Viewer::Type(), anOCCViewManagers ); + foreach ( const SUIT_ViewManager* aViewManager, anOCCViewManagers ) { + connect( aViewManager, SIGNAL( mouseMove( SUIT_ViewWindow*, QMouseEvent* ) ), + this, SLOT( onMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) ); + foreach( SUIT_ViewWindow* aViewWindow, aViewManager->getViews() ) { + OCCViewer_ViewFrame* aViewFrame = dynamic_cast( aViewWindow ); + if ( aViewFrame && aViewFrame->getViewPort() ) { + aViewFrame->getViewPort()->installEventFilter( this ); + } + } + } + + // Load GEOM data + SalomeApp_Study* aStudy = + dynamic_cast( getApp()->activeStudy() ); + if ( aStudy ) { + SALOMEDS::Study_var aDSStudy = GeometryGUI::ClientStudyToStudy( aStudy->studyDS() ); + GEOM::GEOM_Gen_var aGeomEngine = GeometryGUI::GetGeomGen(); + if ( !aGeomEngine->_is_nil() && !aGeomEngine->_is_nil() ) { + SALOMEDS::StudyBuilder_var aStudyBuilder = aDSStudy->NewBuilder(); + SALOMEDS::SComponent_wrap GEOM_var = aDSStudy->FindComponent( "GEOM" ); + if( !GEOM_var->_is_nil() ) { + aStudyBuilder->LoadWith( GEOM_var, aGeomEngine ); + } + } + } + return aRes; } bool HYDROGUI_Module::deactivateModule( SUIT_Study* theStudy ) { + /* Issues ## 68, 88. ViewManagerMapIterator anIter( myViewManagerMap ); while( anIter.hasNext() ) if( SUIT_ViewManager* aViewManager = anIter.next().value().first ) getApp()->removeViewManager( aViewManager ); myViewManagerMap.clear(); + */ + + ViewManagerList anOCCViewManagers; + getApp()->viewManagers( OCCViewer_Viewer::Type(), anOCCViewManagers ); + foreach ( const SUIT_ViewManager* aViewManager, anOCCViewManagers ) { + disconnect( aViewManager, SIGNAL( mouseMove( SUIT_ViewWindow*, QMouseEvent* ) ), + this, SLOT( onMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) ); + } + + /* Issues ## 68, 88. + myObjectStateMap.clear(); + myShapesMap.clear(); + myVTKPrsMap.clear(); + */ + + // clear the status bar + SUIT_Desktop* aDesktop = getApp()->desktop(); + if ( aDesktop && aDesktop->statusBar() ) { + aDesktop->statusBar()->clearMessage(); + } + + // 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 + + HYDROGUI_Tool::setOCCActionShown( this, OCCViewer_ViewWindow::MaximizedId, true ); + + myActiveOperationMap.clear(); return LightApp_Module::deactivateModule( theStudy ); } @@ -125,12 +283,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 << GraphicsView_Viewer::Type() << OCCViewer_Viewer::Type(); } void HYDROGUI_Module::contextMenuPopup( const QString& theClient, @@ -139,83 +300,395 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, { HYDROGUI_DataModel* aModel = getDataModel(); - size_t aViewId = HYDROGUI_Tool::GetActiveGraphicsViewId( this ); + bool anIsObjectBrowser = theClient == getApp()->objectBrowser()->popupClientType(); + bool anIsGraphicsView = theClient == GraphicsView_Viewer::Type(); + bool anIsOCCView = theClient == OCCViewer_Viewer::Type(); + bool anIsVTKView = theClient == SVTK_Viewer::Type(); + if( !anIsObjectBrowser && !anIsGraphicsView && !anIsOCCView && !anIsVTKView ) + return; + + 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 anIsMustObjectBeUpdated = false; bool anIsPolyline = false; + bool anIsPolyline3D = false; + bool anIsProfile = false; + bool anIsValidProfile = false; + bool anAllAreProfiles = false; + bool anIsBathymetry = false; + bool anIsCalculation = false; + bool anIsImmersibleZone = false; bool anIsVisualState = false; + bool anIsRegion = false; + bool anIsZone = false; + bool anIsObstacle = false; + bool anIsStream = false; + bool anIsChannel = false; + bool anIsDigue = false; + bool anIsDummyObject3D = false; + bool anIsGroup = false; + bool anIsObjectCanBeColored = false; + bool isRoot = false; + + SUIT_SelectionMgr* aSelectionMgr = getApp()->selectionMgr(); + SUIT_DataOwnerPtrList anOwners; + aSelectionMgr->selected( anOwners ); + if( anIsObjectBrowser && anOwners.size()==1 ) + { + QString anEntry = anOwners[0]->keyString(); + LightApp_Study* aStudy = dynamic_cast( getApp()->activeStudy() ); + if( aStudy ) + isRoot = aStudy->isComponent( anEntry ); + } + // Check the selected GEOM objects (take into account the Object Browser only) + if ( anIsObjectBrowser ) { + QList anObstacleTypes = + HYDROGUI_ImportGeomObjectOp::getObstacleTypes(); + QList aPolylineTypes = + HYDROGUI_ImportGeomObjectOp::getPolylineTypes(); + + bool isCanBeImportedAsObstacle = + !HYDROGUI_Tool::GetSelectedGeomObjects( this, anObstacleTypes ).isEmpty(); + bool isCanBeImportedAsPolyline = + !HYDROGUI_Tool::GetSelectedGeomObjects( this, aPolylineTypes ).isEmpty(); + + // Add import as obstacle action + if ( isCanBeImportedAsObstacle ) { + theMenu->addAction( action( ImportGeomObjectAsObstacleId ) ); + } + // Add import as polyline action + if ( isCanBeImportedAsPolyline ) { + theMenu->addAction( action( ImportGeomObjectAsPolylineId ) ); + } + // Add separator + if ( isCanBeImportedAsObstacle || isCanBeImportedAsPolyline ) { + theMenu->addSeparator(); + } + } + + // check the selected data model objects HYDROData_SequenceOfObjects aSeq = HYDROGUI_Tool::GetSelectedObjects( this ); + int aNbOfSelectedProfiles = 0; for( Standard_Integer anIndex = 1, aLength = aSeq.Length(); anIndex <= aLength; anIndex++ ) { - Handle(HYDROData_Object) anObject = aSeq.Value( anIndex ); + Handle(HYDROData_Entity) anObject = aSeq.Value( anIndex ); if( !anObject.IsNull() ) { - anIsSelection = true; + anIsSelectedDataObjects = true; - bool aVisibility = anObject->IsVisible( aViewId ); + bool aVisibility = isObjectVisible( anActiveViewId, anObject ); anIsVisibleInSelection |= aVisibility; anIsHiddenInSelection |= !aVisibility; - if( anObject->GetKind() == KIND_IMAGE ) + if ( anObject->CanBeUpdated() && anObject->IsMustBeUpdated() ) + { + anIsMustObjectBeUpdated = true; + } + + ObjectKind anObjectKind = anObject->GetKind(); + if( anObjectKind == KIND_IMAGE ) + { anIsImage = true; - else if( anObject->GetKind() == KIND_POLYLINE ) + Handle(HYDROData_Image) anImage = Handle(HYDROData_Image)::DownCast( anObject ); + if( !anImage.IsNull() ) + { + anIsImportedImage = anImage->HasLocalPoints(); + 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; + } + } + } + } + else if( anObjectKind == KIND_POLYLINEXY ) anIsPolyline = true; - else if( anObject->GetKind() == KIND_VISUAL_STATE ) + else if( anObjectKind == KIND_POLYLINE ) + anIsPolyline3D = true; + else if( anObjectKind == KIND_PROFILE ) + { + anIsProfile = true; + aNbOfSelectedProfiles++; + + Handle(HYDROData_Profile) aProfile = + Handle(HYDROData_Profile)::DownCast( anObject ); + if( !aProfile.IsNull() && aProfile->IsValid() ) { + anIsValidProfile = true; + } + } + else if( anObjectKind == KIND_CALCULATION ) + anIsCalculation = true; + else if( anObjectKind == KIND_IMMERSIBLE_ZONE ) + anIsImmersibleZone = true; + else if( anObjectKind == KIND_VISUAL_STATE ) anIsVisualState = true; + else if( anObjectKind == KIND_REGION ) + anIsRegion = true; + else if( anObjectKind == KIND_ZONE ) + anIsZone = true; + else if( anObjectKind == KIND_BATHYMETRY ) + anIsBathymetry = true; + else if( anObjectKind == KIND_OBSTACLE ) + anIsObstacle = true; + else if( anObjectKind == KIND_STREAM ) + anIsStream = true; + else if( anObjectKind == KIND_CHANNEL ) + anIsChannel = true; + else if( anObjectKind == KIND_DIGUE ) + anIsDigue = true; + else if( anObjectKind == KIND_DUMMY_3D ) + anIsDummyObject3D = true; + else if( anObjectKind == KIND_SHAPES_GROUP || anObjectKind == KIND_SPLITTED_GROUP ) + anIsGroup = true; } + + if ( !anIsObjectCanBeColored ) + anIsObjectCanBeColored = HYDROGUI_SetColorOp::CanObjectBeColored( anObject ); } - if( aSeq.IsEmpty() ) + // Check if all selected objects are profiles + anAllAreProfiles = ( aNbOfSelectedProfiles > 0 ) && + ( aNbOfSelectedProfiles == aSeq.Length() ); + + // check the selected partitions + if( !anIsSelectedDataObjects && anIsObjectBrowser ) { - theMenu->addAction( action( SaveVisualStateId ) ); - theMenu->addSeparator(); + ObjectKind aSelectedPartition = HYDROGUI_Tool::GetSelectedPartition( this ); + if( aSelectedPartition != KIND_UNKNOWN ) + { + switch( aSelectedPartition ) + { + case KIND_IMAGE: + theMenu->addAction( action( ImportImageId ) ); + break; + case KIND_BATHYMETRY: + theMenu->addAction( action( ImportBathymetryId ) ); + break; + case KIND_ARTIFICIAL_OBJECT: + theMenu->addAction( action( CreateChannelId ) ); + theMenu->addAction( action( CreateDigueId ) ); + break; + case KIND_NATURAL_OBJECT: + theMenu->addAction( action( CreateImmersibleZoneId ) ); + theMenu->addAction( action( CreateStreamId ) ); + break; + case KIND_OBSTACLE: + theMenu->addAction( action( ImportObstacleFromFileId ) ); + theMenu->addAction( action( CreateBoxId ) ); + theMenu->addAction( action( CreateCylinderId ) ); + break; + case KIND_CALCULATION: + theMenu->addAction( action( CreateCalculationId ) ); + break; + case KIND_POLYLINEXY: + theMenu->addAction( action( CreatePolylineId ) ); + break; + case KIND_POLYLINE: + theMenu->addAction( action( CreatePolyline3DId ) ); + break; + case KIND_PROFILE: + theMenu->addAction( action( CreateProfileId ) ); + theMenu->addAction( action( ImportProfilesId ) ); + theMenu->addAction( action( AllGeoreferencementId ) ); + break; + case KIND_VISUAL_STATE: + theMenu->addAction( action( SaveVisualStateId ) ); + break; + } + theMenu->addSeparator(); + } } - else if( anIsSelection && aSeq.Length() == 1 ) + + if( anIsSelectedDataObjects ) { - if( anIsImage ) + if ( anIsMustObjectBeUpdated ) { - theMenu->addAction( action( EditImageId ) ); - theMenu->addAction( action( ObserveImageId ) ); - theMenu->addAction( action( ExportImageId ) ); + theMenu->addAction( action( UpdateObjectId ) ); theMenu->addSeparator(); } - else if( anIsPolyline ) + else { - theMenu->addAction( action( EditPolylineId ) ); + theMenu->addAction( action( ForcedUpdateObjectId ) ); + theMenu->addSeparator(); + } + + + if( aSeq.Length() == 1 ) + { + 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 ) ); + } + + //RKV: BUG#98: 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( anIsBathymetry ) + { + theMenu->addAction( action( EditImportedBathymetryId ) ); + theMenu->addAction( action( BathymetryBoundsId ) ); + theMenu->addSeparator(); + } + else if( anIsPolyline ) + { + theMenu->addAction( action( EditPolylineId ) ); + theMenu->addSeparator(); + } + else if( anIsPolyline3D ) + { + theMenu->addAction( action( EditPolyline3DId ) ); + theMenu->addSeparator(); + } + else if( anIsProfile ) + { + theMenu->addAction( action( EditProfileId ) ); + theMenu->addAction( action( SelectedGeoreferencementId ) ); + theMenu->addSeparator(); + } + else if( anIsCalculation ) + { + theMenu->addAction( action( EditCalculationId ) ); + theMenu->addAction( action( ExportCalculationId ) ); + theMenu->addSeparator(); + } + else if( anIsImmersibleZone ) + { + theMenu->addAction( action( EditImmersibleZoneId ) ); + theMenu->addSeparator(); + } + else if( anIsStream ) + { + theMenu->addAction( action( EditStreamId ) ); + theMenu->addSeparator(); + } + else if( anIsChannel ) + { + theMenu->addAction( action( EditChannelId ) ); + theMenu->addSeparator(); + } + else if( anIsDigue ) + { + theMenu->addAction( action( EditDigueId ) ); + theMenu->addSeparator(); + } + else if( anIsObstacle ) + { + theMenu->addAction( action( TranslateObstacleId ) ); + theMenu->addSeparator(); + } + else if( anIsVisualState && anIsObjectBrowser ) + { + theMenu->addAction( action( SaveVisualStateId ) ); + theMenu->addAction( action( LoadVisualStateId ) ); + theMenu->addSeparator(); + } + + // Add set color action for geometrical objects + if ( anIsObjectCanBeColored ) + { + theMenu->addAction( action( SetColorId ) ); + theMenu->addSeparator(); + } + } else if ( anAllAreProfiles ) { + theMenu->addAction( action( SelectedGeoreferencementId ) ); + theMenu->addSeparator(); + } + + // Add copy action + QAction* aCopyAction = action( CopyId ); + if( aCopyAction && aCopyAction->isEnabled() ) { + theMenu->addAction( action( CopyId ) ); theMenu->addSeparator(); } - else if( anIsVisualState ) + + // Add delete action + if( !anIsDummyObject3D ) + theMenu->addAction( action( DeleteId ) ); + + theMenu->addSeparator(); + + if( anIsImage || anIsPolyline || anIsPolyline3D || + anIsImmersibleZone || anIsZone || anIsRegion || + anIsBathymetry || anIsObstacle || anIsStream || + anIsChannel || anIsDigue || anIsDummyObject3D || + anIsValidProfile || anIsGroup ) { - theMenu->addAction( action( SaveVisualStateId ) ); - theMenu->addAction( action( LoadVisualStateId ) ); + if( anIsHiddenInSelection ) + theMenu->addAction( action( ShowId ) ); + theMenu->addAction( action( ShowOnlyId ) ); + if( anIsVisibleInSelection ) + theMenu->addAction( action( HideId ) ); theMenu->addSeparator(); } } - if( anIsSelection ) + if ( anIsOCCView ) { - theMenu->addAction( action( DeleteId ) ); + SUIT_Operation* anOp = application()->activeStudy()->activeOperation(); + HYDROGUI_PolylineOp* aPolylineOp = dynamic_cast( anOp ); + if ( aPolylineOp && aPolylineOp->deleteEnabled() ) + theMenu->addAction( action( DeleteId ) ); + + theMenu->addSeparator(); + theMenu->addAction( action( SetZLevelId ) ); theMenu->addSeparator(); } - if( anIsSelection && ( anIsImage || anIsPolyline ) ) + if( anIsObjectBrowser || anIsGraphicsView || anIsOCCView || anIsVTKView ) { - if( anIsHiddenInSelection ) - theMenu->addAction( action( ShowId ) ); - theMenu->addAction( action( ShowOnlyId ) ); - if( anIsVisibleInSelection ) - theMenu->addAction( action( HideId ) ); + theMenu->addAction( action( ShowAllId ) ); + theMenu->addAction( action( HideAllId ) ); theMenu->addSeparator(); } + + if ( anIsOCCView || anIsVTKView ) + { + theMenu->addSeparator(); + theMenu->addAction( action( CopyViewerPositionId ) ); + } - theMenu->addAction( action( ShowAllId ) ); - theMenu->addAction( action( HideAllId ) ); - theMenu->addSeparator(); + if( isRoot ) + theMenu->addAction( action( EditLocalCSId ) ); } void HYDROGUI_Module::update( const int flags ) @@ -229,19 +702,50 @@ void HYDROGUI_Module::update( const int flags ) // from one of the methods called below setUpdateEnabled( false ); - if( ( flags & UF_Model ) && getDataModel() ) + // store selected objects + QStringList aSelectedEntries = storeSelection(); + + bool aDoFitAll = flags & UF_FitAll; + if( ( flags & UF_Viewer ) ) + updateViewer( getDisplayer(), flags & UF_GV_Init, flags & UF_GV_Forced, aDoFitAll ); + + if( ( flags & UF_OCCViewer ) ) + updateViewer( getOCCDisplayer(), flags & UF_OCC_Init, flags & UF_OCC_Forced, aDoFitAll ); + + if( ( flags & UF_VTKViewer ) ) + updateViewer( getVTKDisplayer(), flags & UF_VTK_Init, flags & UF_VTK_Forced, aDoFitAll ); + + if( ( flags & UF_Model ) && getDataModel() && getApp() ) + { getDataModel()->update( getStudyId() ); - if( ( flags & UF_ObjBrowser ) && getApp() ) + // 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(); + SUIT_ResourceMgr* aResMgr = getApp()->resourceMgr(); + bool isResizeOnExpandItem = aResMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false ); + SUIT_DataBrowser* anObjectBrowser = getApp()->objectBrowser(); + if ( isResizeOnExpandItem && anObjectBrowser ) { + anObjectBrowser->setResizeOnExpandItem( false ); // MZN: ISSUE #280 + } getApp()->updateObjectBrowser( true ); + if ( isResizeOnExpandItem && anObjectBrowser ) { + anObjectBrowser->setResizeOnExpandItem( true ); // MZN: ISSUE #280 + } + } - if( ( flags & UF_Viewer ) ) - updateGV( flags & UF_GV_Init, - flags & UF_GV_Forced ); + // Object browser is currently updated by using UF_Model flag + if( ( flags & UF_ObjBrowser ) && ((flags & UF_Model) == 0) && getApp() ) + getApp()->updateObjectBrowser( true ); if( ( flags & UF_Controls ) && getApp() ) getApp()->updateActions(); + // restore selected objects + restoreSelection( aSelectedEntries ); + setUpdateEnabled( true ); QApplication::restoreOverrideCursor(); @@ -253,8 +757,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 @@ -267,6 +777,25 @@ HYDROGUI_Displayer* HYDROGUI_Module::getDisplayer() const return myDisplayer; } +HYDROGUI_OCCDisplayer* HYDROGUI_Module::getOCCDisplayer() const +{ + return myOCCDisplayer; +} + +HYDROGUI_VTKPrsDisplayer* HYDROGUI_Module::getVTKDisplayer() const +{ + return myVTKDisplayer; +} + +SUIT_ViewManager* HYDROGUI_Module::getViewManager( const int theId ) const +{ + if( myViewManagerMap.contains( theId ) ) + { + return myViewManagerMap[ theId ].first; + } + return NULL; +} + GraphicsView_Viewer* HYDROGUI_Module::getViewer( const int theId ) const { if( myViewManagerMap.contains( theId ) ) @@ -280,6 +809,32 @@ GraphicsView_Viewer* HYDROGUI_Module::getViewer( const int theId ) const 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; +} + +SVTK_Viewer* HYDROGUI_Module::getVTKViewer( const int theId ) const +{ + if( myViewManagerMap.contains( theId ) ) + { + ViewManagerInfo anInfo = myViewManagerMap[ theId ]; + SVTK_ViewManager* aViewManager = + ::qobject_cast( anInfo.first ); + if( aViewManager ) + return dynamic_cast( aViewManager->getViewModel() ); + } + return NULL; +} + int HYDROGUI_Module::getViewManagerId( SUIT_ViewManager* theViewManager ) { ViewManagerMapIterator anIter( myViewManagerMap ); @@ -315,6 +870,321 @@ void HYDROGUI_Module::setViewManagerRole( SUIT_ViewManager* theViewManager, } } +bool HYDROGUI_Module::isObjectVisible( const int theViewId, + const Handle(HYDROData_Entity)& theObject ) const +{ + if( theObject.IsNull() ) + return false; + + ViewId2Entry2ObjectStateMap::const_iterator anIter1 = myObjectStateMap.find( theViewId ); + if( anIter1 != myObjectStateMap.end() ) + { + const Entry2ObjectStateMap& aEntry2ObjectStateMap = anIter1.value(); + QString anEntry = HYDROGUI_DataObject::dataObjectEntry( theObject ); + + Entry2ObjectStateMap::const_iterator anIter2 = aEntry2ObjectStateMap.find( anEntry ); + if( anIter2 != aEntry2ObjectStateMap.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() ) + { + Entry2ObjectStateMap& aEntry2ObjectStateMap = myObjectStateMap[ theViewId ]; + QString anEntry = HYDROGUI_DataObject::dataObjectEntry( theObject ); + + ObjectState& anObjectState = aEntry2ObjectStateMap[ anEntry ]; + anObjectState.Visibility = theState; + } +} + +void HYDROGUI_Module::setIsToUpdate( const Handle(HYDROData_Entity)& theObject, + const bool theState ) +{ + if( !theObject.IsNull() ) + { + // Process OCC shapes + ViewId2ListOfShapes::const_iterator aShapesMapIter( myShapesMap.begin() ); + while( aShapesMapIter != myShapesMap.end() ) + { + const ListOfShapes& aShapesList = aShapesMapIter.value(); + foreach ( HYDROGUI_Shape* aShape, aShapesList ) + { + if ( aShape && IsEqual( aShape->getObject(), theObject ) ) + { + aShape->setIsToUpdate( theState ); + } + } + aShapesMapIter++; + } + // Process VTK shapes + ViewId2ListOfVTKPrs::const_iterator aVTKPrsMapIter( myVTKPrsMap.begin() ); + while( aVTKPrsMapIter != myVTKPrsMap.end() ) + { + const ListOfVTKPrs& aShapesList = aVTKPrsMapIter.value(); + foreach ( HYDROGUI_VTKPrs* aShape, aShapesList ) + { + if ( aShape && IsEqual( aShape->getObject(), theObject ) ) + { + aShape->setIsToUpdate( theState ); + } + } + aVTKPrsMapIter++; + } + } +} + +/////////////////// OCC SHAPES PROCESSING +QList HYDROGUI_Module::getObjectShapes( const int theViewId, + ObjectKind theKind ) const +{ + QList aResult; + + if ( myShapesMap.contains( theViewId ) ) + { + const ListOfShapes& aViewShapes = myShapesMap.value( theViewId ); + foreach ( HYDROGUI_Shape* aShape, aViewShapes ) + { + if( aShape && aShape->getObject()->GetKind()==theKind ) + aResult.append( aShape ); + } + } + return aResult; +} + +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 ); +} +/////////////////// END OF OCC SHAPES PROCESSING + +/////////////////// VTKPrs PROCESSING +HYDROGUI_VTKPrs* HYDROGUI_Module::getObjectVTKPrs( const int theViewId, + const Handle(HYDROData_Entity)& theObject ) const +{ + HYDROGUI_VTKPrs* aResShape = NULL; + if( theObject.IsNull() ) + return aResShape; + + if ( myVTKPrsMap.contains( theViewId ) ) + { + const ListOfVTKPrs& aViewShapes = myVTKPrsMap.value( theViewId ); + foreach ( HYDROGUI_VTKPrs* aShape, aViewShapes ) + { + if ( !aShape || !IsEqual( aShape->getObject(), theObject ) ) + continue; + + aResShape = aShape; + break; + } + } + + return aResShape; +} + +void HYDROGUI_Module::setObjectVTKPrs( const int theViewId, + const Handle(HYDROData_Entity)& theObject, + HYDROGUI_VTKPrs* theShape ) +{ + if( theObject.IsNull() ) + return; + + if( theShape && theShape->needScalarBar() ) + { + // Compute the new global Z range from the added presentation and the old global Z range. + double* aGlobalRange = getVTKDisplayer()->GetZRange( theViewId ); + double* aRange = theShape->getInternalZRange(); + bool anIsUpdate = false; + if ( aRange[0] < aGlobalRange[0] ) + { + aGlobalRange[0] = aRange[0]; + anIsUpdate = true; + } + if ( aRange[1] > aGlobalRange[1] ) + { + aGlobalRange[1] = aRange[1]; + anIsUpdate = true; + } + + //if ( anIsUpdate ) + //{ + updateVTKZRange( theViewId, aGlobalRange ); + //} + } + + ListOfVTKPrs& aViewShapes = myVTKPrsMap[ theViewId ]; + aViewShapes.append( theShape ); +} + +void HYDROGUI_Module::removeObjectVTKPrs( const int theViewId, + const QString& theEntry ) +{ + if ( !myVTKPrsMap.contains( theViewId ) ) + return; + + ListOfVTKPrs& aViewShapes = myVTKPrsMap[ theViewId ]; + Handle(HYDROData_Entity) anObject; + QString anEntryRef; + for ( int i = 0; i < aViewShapes.length(); ) + { + HYDROGUI_VTKPrs* aShape = aViewShapes.at( i ); + anObject = aShape->getObject(); + anEntryRef = HYDROGUI_DataObject::dataObjectEntry( anObject ); + if ( aShape && (!anObject.IsNull()) && ( anEntryRef == theEntry ) ) + { + delete aShape; + aViewShapes.removeAt( i ); + continue; + } + + ++i; + } + + // Invalidate global Z range + double anInvalidRange[2] = { HYDROGUI_VTKPrs::InvalidZValue(), HYDROGUI_VTKPrs::InvalidZValue() }; + getVTKDisplayer()->SetZRange( theViewId, anInvalidRange ); +} + +void HYDROGUI_Module::removeObjectVTKPrs( const int theViewId, + const Handle(HYDROData_Entity)& theObject ) +{ + if ( !myVTKPrsMap.contains( theViewId ) ) + return; + + ListOfVTKPrs& aViewShapes = myVTKPrsMap[ theViewId ]; + Handle(HYDROData_Entity) anObject; + for ( int i = 0; i < aViewShapes.length(); ) + { + HYDROGUI_VTKPrs* aShape = aViewShapes.at( i ); + anObject = aShape->getObject(); + if ( aShape && (!anObject.IsNull()) && IsEqual( anObject, theObject ) ) + { + delete aShape; + aViewShapes.removeAt( i ); + continue; + } + + ++i; + } + + // Invalidate global Z range + double anInvalidRange[2] = { HYDROGUI_VTKPrs::InvalidZValue(), HYDROGUI_VTKPrs::InvalidZValue() }; + getVTKDisplayer()->SetZRange( theViewId, anInvalidRange ); +} + +void HYDROGUI_Module::removeViewVTKPrs( const int theViewId ) +{ + if ( !myVTKPrsMap.contains( theViewId ) ) + return; + + const ListOfVTKPrs& aViewShapes = myVTKPrsMap.value( theViewId ); + for ( int i = 0, n = aViewShapes.length(); i < n; ++i ) + { + HYDROGUI_VTKPrs* aShape = aViewShapes.at( i ); + if ( aShape ) + delete aShape; + } + + myVTKPrsMap.remove( theViewId ); +} + +void HYDROGUI_Module::updateVTKZRange( const int theViewId, double theRange[] ) +{ + if ( myVTKPrsMap.contains( theViewId ) ) + { + // For the given viewer id update all VTK presentations ... + const ListOfVTKPrs& aViewShapes = myVTKPrsMap.value( theViewId ); + HYDROGUI_VTKPrs* aShape; + for ( int i = 0, n = aViewShapes.length(); i < n; ++i ) + { + aShape = aViewShapes.at( i ); + if ( aShape && aShape->needScalarBar() ) + { + aShape->setZRange( theRange ); + } + } + } + // ... and update the global color legend scalar bar. + getVTKDisplayer()->SetZRange( theViewId, theRange ); +} +/////////////////// END OF VTKPrs PROCESSING + CAM_DataModel* HYDROGUI_Module::createDataModel() { return new HYDROGUI_DataModel( this ); @@ -332,20 +1202,24 @@ void HYDROGUI_Module::customEvent( QEvent* e ) { SUIT_ViewManager* aViewManager = aViewer->getViewManager(); ViewManagerRole aRole = getViewManagerRole( aViewManager ); - if( aRole == VMR_General ) - update( UF_Viewer ); - - aViewer->activateTransform( GraphicsView_Viewer::FitAll ); 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 + //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 ); } } } @@ -364,6 +1238,27 @@ bool HYDROGUI_Module::eventFilter( QObject* theObj, QEvent* theEvent ) theObj->removeEventFilter( this ); } } + else if ( theObj->inherits( "OCCViewer_ViewPort" ) ) + { + if( aType == QEvent::Leave ) + { + SUIT_Desktop* aDesktop = getApp()->desktop(); + if ( aDesktop && aDesktop->statusBar() ) { + aDesktop->statusBar()->clearMessage(); + } + } + } + else if ( theObj->inherits( "SVTK_ViewWindow" ) ) + { + if( aType == QEvent::Leave ) + { + SUIT_Desktop* aDesktop = getApp()->desktop(); + if ( aDesktop && aDesktop->statusBar() ) { + aDesktop->statusBar()->clearMessage(); + } + } + } + return LightApp_Module::eventFilter( theObj, theEvent ); } @@ -373,11 +1268,25 @@ 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* ) ) ); + connect( theViewManager, SIGNAL( mouseMove( SUIT_ViewWindow*, QMouseEvent* ) ), + this, SLOT( onMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) ); + } + else if( theViewManager->getType() == SVTK_Viewer::Type() ) + { + connect( theViewManager, SIGNAL( viewCreated( SUIT_ViewWindow* ) ), + this, SLOT( onViewCreated( SUIT_ViewWindow* ) ) ); + connect( theViewManager, SIGNAL( mouseMove( SUIT_ViewWindow*, QMouseEvent* ) ), + this, SLOT( onMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) ); + } + + createSelector( theViewManager ); // replace the default selector ViewManagerInfo anInfo( theViewManager, VMR_General ); myViewManagerMap.insert( ViewManagerId++, anInfo ); @@ -391,7 +1300,28 @@ void HYDROGUI_Module::onViewManagerRemoved( SUIT_ViewManager* theViewManager ) 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 ); + } + + if ( getVTKDisplayer()->IsApplicable( theViewManager ) ) + { + SVTK_Viewer* aVTKViewer = getVTKViewer( anId ); + if ( aVTKViewer ) + { + getVTKDisplayer()->EraseScalarBar( anId, true ); + removeViewShapes( (size_t)aVTKViewer ); + } + } + myViewManagerMap.remove( anId ); + } } void HYDROGUI_Module::onViewCreated( SUIT_ViewWindow* theViewWindow ) @@ -406,13 +1336,34 @@ void HYDROGUI_Module::onViewCreated( SUIT_ViewWindow* theViewWindow ) connect( aViewPort, SIGNAL( vpMouseEvent( QGraphicsSceneMouseEvent* ) ), this, SLOT( onViewPortMouseEvent( QGraphicsSceneMouseEvent* ) ) ); - return; + } + } + else if( theViewWindow && theViewWindow->inherits( "OCCViewer_ViewFrame" ) ) + { + if( OCCViewer_ViewFrame* aViewFrame = dynamic_cast( theViewWindow ) ) + { + aViewFrame->onTopView(); + + HYDROGUI_Tool::setOCCActionShown( aViewFrame, OCCViewer_ViewWindow::MaximizedId, false ); + + OCCViewer_ViewPort3d* aViewPort = aViewFrame->getViewPort(); + if ( aViewPort ) { + aViewPort->installEventFilter( this ); + } + } + } + else if( theViewWindow && theViewWindow->inherits( "SVTK_ViewWindow" ) ) + { + if( SVTK_ViewWindow* aViewFrame = dynamic_cast( theViewWindow ) ) + { + aViewFrame->installEventFilter( this ); } } } void HYDROGUI_Module::onViewPortMouseEvent( QGraphicsSceneMouseEvent* theEvent ) { + /* ouv: currently unused if( GraphicsView_ViewPort* aViewPort = qobject_cast( sender() ) ) { SUIT_ViewManager* aViewManager = 0; @@ -442,8 +1393,8 @@ void HYDROGUI_Module::onViewPortMouseEvent( QGraphicsSceneMouseEvent* theEvent ) 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 ); + 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 ); @@ -454,27 +1405,34 @@ void HYDROGUI_Module::onViewPortMouseEvent( QGraphicsSceneMouseEvent* theEvent ) 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 ) +void HYDROGUI_Module::updateViewer( HYDROGUI_AbstractDisplayer* theDisplayer, + const bool theIsInit, + const bool theIsForced, + const bool theDoFitAll ) { - if( !getDisplayer() ) - return; - QList aViewManagerIdList; // currently, all views are updated ViewManagerMapIterator anIter( myViewManagerMap ); while( anIter.hasNext() ) - { - int anId = anIter.next().key(); - aViewManagerIdList.append( anId ); + { + SUIT_ViewManager* aViewManager = anIter.next().value().first; + + if ( theDisplayer->IsApplicable( aViewManager ) ) + { + int anId = anIter.key(); + aViewManagerIdList.append( anId ); + } } QListIterator anIdIter( aViewManagerIdList ); while( anIdIter.hasNext() ) - getDisplayer()->UpdateAll( anIdIter.next(), theIsInit, theIsForced ); + { + theDisplayer->UpdateAll( anIdIter.next(), theIsInit, theIsForced, theDoFitAll ); + } } void HYDROGUI_Module::createSelector( SUIT_ViewManager* theViewManager ) @@ -487,12 +1445,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; @@ -503,11 +1457,26 @@ 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 ) && + !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 ) @@ -521,3 +1490,92 @@ 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 ); + } +} + +void HYDROGUI_Module::onMouseMove( SUIT_ViewWindow* theViewWindow, QMouseEvent* ) +{ + double X, Y, Z; + bool doShow = false; + HYDROGUI_Displayer* aDisplayer = getDisplayer(); + if ( aDisplayer ) + aDisplayer->SaveCursorViewPosition( theViewWindow ); + doShow = aDisplayer->GetCursorViewCoordinates( theViewWindow, X, Y, Z ); + + if ( doShow ) + { + // Show the coordinates in the status bar + SUIT_Desktop* aDesktop = getApp()->desktop(); + if ( aDesktop && aDesktop->statusBar() ) + { + gp_Pnt aWPnt( X, Y, Z ); + int aStudyId = application()->activeStudy()->id(); + HYDROData_Document::Document( aStudyId )->Transform( aWPnt, false ); + double WX = aWPnt.X(), WY = aWPnt.Y(); + + QString aXStr = HYDROGUI_Tool::GetCoordinateString( X, true ); + QString anYStr = HYDROGUI_Tool::GetCoordinateString( Y, true ); + QString aWXStr = HYDROGUI_Tool::GetCoordinateString( WX, true ); + QString aWYStr = HYDROGUI_Tool::GetCoordinateString( WY, true ); + QString aMsg = tr( "COORDINATES_INFO" ); + aMsg = aMsg.arg( aXStr ).arg( anYStr ).arg( aWXStr ).arg( aWYStr ); + aDesktop->statusBar()->showMessage( aMsg ); + } + } +} + +/** + * Returns stack of active operations; + */ +QStack& HYDROGUI_Module::getActiveOperations() +{ + return myActiveOperationMap; +} + +/** + * Returns the module active operation. If the active operation is show/hide, + * the method returns the previous operation if it is. + */ +HYDROGUI_Operation* HYDROGUI_Module::activeOperation() +{ + HYDROGUI_Operation* anOp = !myActiveOperationMap.empty() ? myActiveOperationMap.top() : 0; + + if ( dynamic_cast( anOp ) ) + { + QVectorIterator aVIt( myActiveOperationMap ); + aVIt.toBack(); + aVIt.previous(); // skip the top show/hide operation + anOp = aVIt.hasPrevious() ? aVIt.previous() : 0; + } + + return anOp; +}