From bae0e2c1d1267ee4d445dff9f0f5b546e685bfd9 Mon Sep 17 00:00:00 2001 From: ouv Date: Wed, 14 Aug 2013 11:41:03 +0000 Subject: [PATCH] View management. --- src/HYDROGUI/HYDROGUI_ImportImageOp.cxx | 1 + src/HYDROGUI/HYDROGUI_Module.cxx | 142 +++++++++++++++++++++--- src/HYDROGUI/HYDROGUI_Module.h | 20 +++- 3 files changed, 144 insertions(+), 19 deletions(-) diff --git a/src/HYDROGUI/HYDROGUI_ImportImageOp.cxx b/src/HYDROGUI/HYDROGUI_ImportImageOp.cxx index d86e4cfc..3d844bc1 100644 --- a/src/HYDROGUI/HYDROGUI_ImportImageOp.cxx +++ b/src/HYDROGUI/HYDROGUI_ImportImageOp.cxx @@ -230,6 +230,7 @@ void HYDROGUI_ImportImageOp::onCreatePreview( QImage theImage ) dynamic_cast( anApp->createViewManager( GraphicsView_Viewer::Type() ) ); if( myPreviewViewManager ) { + module()->setViewManagerRole( myPreviewViewManager, HYDROGUI_Module::VMR_Mapping ); myPreviewViewManager->setTitle( tr( "MAPPING" ) ); if( GraphicsView_Viewer* aViewer = myPreviewViewManager->getViewer() ) { diff --git a/src/HYDROGUI/HYDROGUI_Module.cxx b/src/HYDROGUI/HYDROGUI_Module.cxx index 3a87b374..91276860 100644 --- a/src/HYDROGUI/HYDROGUI_Module.cxx +++ b/src/HYDROGUI/HYDROGUI_Module.cxx @@ -30,6 +30,7 @@ #include "HYDROGUI_ObjSelector.h" #include "HYDROGUI_Operations.h" #include "HYDROGUI_PrsImage.h" +#include "HYDROGUI_Tool.h" #include "HYDROGUI_UpdateFlags.h" #include @@ -50,8 +51,11 @@ #include #include +#include #include +static int ViewManagerId = 0; + extern "C" HYDRO_EXPORT CAM_Module* createModule() { return new HYDROGUI_Module(); @@ -106,6 +110,12 @@ 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(); + setMenuShown( false ); setToolShown( false ); @@ -253,22 +263,54 @@ HYDROGUI_Displayer* HYDROGUI_Module::getDisplayer() const return myDisplayer; } -GraphicsView_Viewer* HYDROGUI_Module::getViewer( const int theViewerId ) const +GraphicsView_Viewer* HYDROGUI_Module::getViewer( const int theId ) const { - ViewManagerList aViewManagerList; - getApp()->viewManagers( GraphicsView_Viewer::Type(), aViewManagerList ); - - ViewManagerList::iterator anIter, anIterEnd = aViewManagerList.end(); - for( anIter = aViewManagerList.begin(); anIter != anIterEnd; anIter++ ) + 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; } +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; + } +} + CAM_DataModel* HYDROGUI_Module::createDataModel() { return new HYDROGUI_DataModel( this ); @@ -284,7 +326,11 @@ void HYDROGUI_Module::customEvent( QEvent* e ) { if( GraphicsView_Viewer* aViewer = dynamic_cast( aViewFrame->getViewer() ) ) { - //update( UF_Viewer | UF_GV_Forced ); // ouv: to do + 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() ) @@ -294,7 +340,7 @@ void HYDROGUI_Module::customEvent( QEvent* e ) aViewPort->setInteractionFlag( GraphicsView_ViewPort::ImmediateSelection ); // ouv: tmp - aViewPort->setMousePositionEnabled( true ); + //aViewPort->setViewLabelPosition( GraphicsView_ViewPort::VLP_BottomLeft, true ); } } } @@ -328,6 +374,9 @@ void HYDROGUI_Module::onViewManagerAdded( SUIT_ViewManager* theViewManager ) 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 ) @@ -335,6 +384,10 @@ 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 ) @@ -344,27 +397,80 @@ 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* ) ) ); + 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_Mapping ) + 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 ); + 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 ) diff --git a/src/HYDROGUI/HYDROGUI_Module.h b/src/HYDROGUI/HYDROGUI_Module.h index e35a9fb3..0b3bb0f2 100644 --- a/src/HYDROGUI/HYDROGUI_Module.h +++ b/src/HYDROGUI/HYDROGUI_Module.h @@ -27,6 +27,8 @@ #include +class QGraphicsSceneMouseEvent; + class GraphicsView_Viewer; class SUIT_ViewWindow; @@ -43,6 +45,13 @@ class HYDROGUI_Module : public LightApp_Module enum CustomEvent { NewViewEvent = QEvent::User + 100 }; +public: + enum ViewManagerRole { VMR_Unknown = 0, VMR_General, VMR_Observe, VMR_Mapping }; + typedef QPair< SUIT_ViewManager*, ViewManagerRole > ViewManagerInfo; + + typedef QMap < int, ViewManagerInfo > ViewManagerMap; + typedef QMapIterator< int, ViewManagerInfo > ViewManagerMapIterator; + public: HYDROGUI_Module(); virtual ~HYDROGUI_Module(); @@ -64,7 +73,12 @@ public: HYDROGUI_DataModel* getDataModel() const; HYDROGUI_Displayer* getDisplayer() const; - GraphicsView_Viewer* getViewer( const int theViewerId ) const; + GraphicsView_Viewer* getViewer( const int theId ) const; + + int getViewManagerId( SUIT_ViewManager* theViewManager ); + ViewManagerRole getViewManagerRole( SUIT_ViewManager* theViewManager ); + void setViewManagerRole( SUIT_ViewManager* theViewManager, + const ViewManagerRole theRole ); protected: CAM_DataModel* createDataModel(); @@ -89,6 +103,8 @@ protected slots: virtual void onViewManagerRemoved( SUIT_ViewManager* ); virtual void onViewCreated( SUIT_ViewWindow* ); + void onViewPortMouseEvent( QGraphicsSceneMouseEvent* ); + private: void updateGV( const bool theIsInit = false, const bool theIsForced = false ); @@ -116,6 +132,8 @@ private: private: HYDROGUI_Displayer* myDisplayer; + ViewManagerMap myViewManagerMap; + bool myIsUpdateEnabled; }; -- 2.39.2