]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
0021319: EDF 1616 ALL: synchronization of 3D viewers
authorvsr <vsr@opencascade.com>
Thu, 29 Sep 2011 12:48:47 +0000 (12:48 +0000)
committervsr <vsr@opencascade.com>
Thu, 29 Sep 2011 12:48:47 +0000 (12:48 +0000)
src/OCCViewer/OCCViewer_ViewPort.cxx
src/OCCViewer/OCCViewer_ViewPort.h
src/OCCViewer/OCCViewer_ViewPort3d.cxx
src/OCCViewer/OCCViewer_ViewPort3d.h
src/OCCViewer/OCCViewer_ViewWindow.cxx
src/OCCViewer/OCCViewer_ViewWindow.h

index 1c7917b725c83d834dbfa1e1a0f8236201e0a529..ea81421cb7ad5a37a3372dd02c6aa2742afdf194 100755 (executable)
@@ -490,6 +490,16 @@ QPaintEngine* OCCViewer_ViewPort::paintEngine() const
   }
 }*/
 
+/*!
+  Performs synchronization of view parameters with the specified view.
+  Returns \c true if synchronization is done successfully or \c false otherwise.
+  Default implementation does nothing (return \c false)
+*/
+bool OCCViewer_ViewPort::synchronize( OCCViewer_ViewPort* )
+{
+  return false;
+}
+
 /*!
     Sets the background color with color selection dialog. [ virtual protected slot ]
 */
index ba3938b321f7fec3dff4ec570598a491d9992b1c..69b80490be9de8e8119d9feaf2251344f569e175 100755 (executable)
@@ -95,6 +95,9 @@ protected:
 //  void                             onCreatePopup( QPopupMenu* );
 //  void                             onDestroyPopup( QPopupMenu* );
 
+public slots:
+  virtual bool                   synchronize( OCCViewer_ViewPort* );
+
 protected slots:
   virtual void                   onChangeBgColor();
 
@@ -103,6 +106,7 @@ signals:
   void                           vpMouseEvent( QMouseEvent* );
   void                           vpDrawExternal( QPainter* );
   void                           vpChangeBGColor( QColor );
+  void                           vpTransformed( OCCViewer_ViewPort* );
 
 private:
   void                           initialize();
index 06801b37a18d409e5745c23284dd5be89c875030..ed188195a583d3c358afebd8d01bc8ce4e63b49a 100755 (executable)
@@ -330,8 +330,10 @@ void OCCViewer_ViewPort3d::onUpdate()
 */
 void OCCViewer_ViewPort3d::fitRect( const QRect& rect )
 {
-  if ( !activeView().IsNull() )
+  if ( !activeView().IsNull() ) {
     activeView()->WindowFit( rect.left(), rect.top(), rect.right(), rect.bottom() );
+    emit vpTransformed( this );
+  }
 }
 
 /*!
@@ -360,6 +362,7 @@ void OCCViewer_ViewPort3d::zoom( int x0, int y0, int x, int y )
     else
 #endif
       activeView()->Zoom( x0 + y0, 0, x + y, 0 );
+    emit vpTransformed( this );
   }
 }
 
@@ -368,8 +371,10 @@ void OCCViewer_ViewPort3d::zoom( int x0, int y0, int x, int y )
 */
 void OCCViewer_ViewPort3d::setCenter( int x, int y )
 {
-  if ( !activeView().IsNull() )
+  if ( !activeView().IsNull() ) {
     activeView()->Place( x, y, myScale );
+    emit vpTransformed( this );
+  }
 }
 
 /*!
@@ -377,8 +382,10 @@ void OCCViewer_ViewPort3d::setCenter( int x, int y )
 */
 void OCCViewer_ViewPort3d::pan( int dx, int dy )
 {
-  if ( !activeView().IsNull() )
+  if ( !activeView().IsNull() ) {
     activeView()->Pan( dx, dy, 1.0 );
+    emit vpTransformed( this );
+  }
 }
 
 /*!
@@ -462,6 +469,7 @@ void OCCViewer_ViewPort3d::rotate( int x, int y,
     default:
       break;
     }
+    emit vpTransformed( this );
   }
   //  setZSize( getZSize() );
 }
@@ -478,6 +486,7 @@ void OCCViewer_ViewPort3d::endRotation()
     activeView()->ZFitAll(1.);
     activeView()->SetZSize(0.);
     activeView()->Update();
+    emit vpTransformed( this );
   }
 }
 
@@ -530,6 +539,7 @@ void OCCViewer_ViewPort3d::fitAll( bool keepScale, bool withZ, bool upd )
   Standard_Real margin = 0.01;
   activeView()->FitAll( margin, withZ, upd );
   activeView()->SetZSize(0.);
+  emit vpTransformed( this );
 }
 
 /*!
@@ -538,9 +548,11 @@ void OCCViewer_ViewPort3d::fitAll( bool keepScale, bool withZ, bool upd )
 void OCCViewer_ViewPort3d::reset()
 {
   //  double zsize = getZSize();
-  if ( !activeView().IsNull() )
+  if ( !activeView().IsNull() ) {
     activeView()->Reset();
+    emit vpTransformed( this );
   //    setZSize( zsize );
+  }
 }
 
 /*!
@@ -555,6 +567,7 @@ void OCCViewer_ViewPort3d::rotateXY( double degrees )
   double X, Y, Z;
   activeView()->Convert( x, y, X, Y, Z );
   activeView()->Rotate( 0, 0, degrees * Standard_PI180, X, Y, Z );
+  emit vpTransformed( this );
 }  
   
 /*!
@@ -612,3 +625,17 @@ bool OCCViewer_ViewPort3d::mapped( const Handle(V3d_View)& view ) const
 {
   return ( !view.IsNull() && view->View()->IsDefined() );
 }
+
+/*!
+  Performs synchronization of view parameters with the specified view.
+  Returns \c true if synchronization is done successfully or \c false otherwise.
+  Default implementation does nothing (return \c false)
+*/
+bool OCCViewer_ViewPort3d::synchronize( OCCViewer_ViewPort* view )
+{
+  bool ok = false;
+  OCCViewer_ViewPort3d* vp3d = qobject_cast<OCCViewer_ViewPort3d*>( view );
+  if ( vp3d ) ok = syncronize( vp3d );
+  return ok;
+}
+
index 7eccb6c43cd396ca5ca3bc281c08868fb41dab0a..4ea26c854d3b406179bcb44c90ee994e467ea0ae 100755 (executable)
@@ -86,6 +86,9 @@ public:
   void                  setAdvancedZoomingEnabled( const bool theState ) { myIsAdvancedZoomingEnabled = theState; }
   bool                  isAdvancedZoomingEnabled() const { return myIsAdvancedZoomingEnabled; }
 
+public slots:
+  virtual bool          synchronize( OCCViewer_ViewPort* );
+
 protected:
     // EVENTS
   virtual void          paintEvent( QPaintEvent* );
index bc78de4010165279ad19626538777cf7645b0eeb..902558586ca68dc5f368f6281a5f5edfb4e22d1f 100755 (executable)
@@ -1232,8 +1232,9 @@ void OCCViewer_ViewWindow::createActions()
                           tr( "MNU_SYNCHRONIZE_VIEW" ), 0, this );
   aAction->setStatusTip(tr("DSC_SYNCHRONIZE_VIEW"));
   aAction->setMenu( new QMenu( this ) );
+  aAction->setCheckable(true);
   connect(aAction->menu(), SIGNAL(aboutToShow()), this, SLOT(updateSyncViews()));
-  connect(aAction, SIGNAL(triggered()), this, SLOT(onSynchronizeView()));
+  connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onSynchronizeView(bool)));
   toolMgr()->registerAction( aAction, SynchronizeId );
 }
 
@@ -2457,36 +2458,99 @@ void OCCViewer_ViewWindow::updateViewAspects( const viewAspectList& aViewList )
   myViewAspects = aViewList;
 }
 
+void OCCViewer_ViewWindow::synchronizeView( OCCViewer_ViewWindow* viewWindow, int id )
+{
+  OCCViewer_ViewWindow* otherViewWindow = 0;
+  QList<OCCViewer_ViewWindow*> compatibleViews;
+
+  bool isSync = viewWindow->toolMgr()->action( SynchronizeId )->isChecked();
+
+  int vwid = viewWindow->getId();
+  
+  SUIT_Application* app = SUIT_Session::session()->activeApplication();
+  if ( !app ) return;
+
+  QList<SUIT_ViewManager*> wmlist;
+  app->viewManagers( viewWindow->getViewManager()->getType(), wmlist );
+
+  foreach( SUIT_ViewManager* wm, wmlist ) {
+    QVector<SUIT_ViewWindow*> vwlist = wm->getViews();
+
+    foreach( SUIT_ViewWindow* vw, vwlist ) {
+      OCCViewer_ViewWindow* occVW = dynamic_cast<OCCViewer_ViewWindow*>( vw );
+      if ( !occVW ) continue;
+
+      // check only compatible types
+      occVW = occVW->getView( viewWindow->get2dMode() );
+      if ( occVW ) {
+       if ( occVW->getId() == id ) 
+         otherViewWindow = occVW;
+       else if ( occVW != viewWindow )
+         compatibleViews.append( occVW );
+      }
+    }
+  }
+
+  if ( isSync && id ) {
+    // remove all possible disconnections
+    foreach( OCCViewer_ViewWindow* vw, compatibleViews ) {
+      // disconnect target view
+      vw->getViewPort()->disconnect( SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ), viewWindow->getViewPort(), SLOT( synchronize( OCCViewer_ViewPort* ) ) );
+      viewWindow->getViewPort()->disconnect( SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ), vw->getViewPort(), SLOT( synchronize( OCCViewer_ViewPort* ) ) );
+      if ( otherViewWindow ) {
+       // disconnect source view
+       vw->getViewPort()->disconnect( SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ), otherViewWindow->getViewPort(), SLOT( synchronize( OCCViewer_ViewPort* ) ) );
+       otherViewWindow->getViewPort()->disconnect( SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ), vw->getViewPort(), SLOT( synchronize( OCCViewer_ViewPort* ) ) );
+      }
+      QAction* a = vw->toolMgr()->action( SynchronizeId );
+      if ( a ) {
+       int anid = a->data().toInt();
+       if ( a->isChecked() && ( anid == id || anid == vwid ) ) {
+         bool blocked = a->blockSignals( true );
+         a->setChecked( false );
+         a->blockSignals( blocked );
+       }
+      }
+    }
+    if ( otherViewWindow ) {
+      // reconnect source and target view
+      otherViewWindow->getViewPort()->disconnect( SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ), viewWindow->getViewPort(), SLOT( synchronize( OCCViewer_ViewPort* ) ) );
+      viewWindow->getViewPort()->disconnect( SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ), otherViewWindow->getViewPort(), SLOT( synchronize( OCCViewer_ViewPort* ) ) );
+      otherViewWindow->getViewPort()->connect( viewWindow->getViewPort(), SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ), SLOT( synchronize( OCCViewer_ViewPort* ) ) );
+      viewWindow->getViewPort()->connect( otherViewWindow->getViewPort(), SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ), SLOT( synchronize( OCCViewer_ViewPort* ) ) );
+      // synchronize target view with source view
+      viewWindow->getViewPort()->synchronize( otherViewWindow->getViewPort() );
+      viewWindow->toolMgr()->action( SynchronizeId )->setData( otherViewWindow->getId() );
+      otherViewWindow->toolMgr()->action( SynchronizeId )->setData( viewWindow->getId() );
+      if ( !otherViewWindow->toolMgr()->action( SynchronizeId )->isChecked() ) {
+       bool blocked = otherViewWindow->toolMgr()->action( SynchronizeId )->blockSignals( true );
+       otherViewWindow->toolMgr()->action( SynchronizeId )->setChecked( true );
+       otherViewWindow->toolMgr()->action( SynchronizeId )->blockSignals( blocked );
+      }
+    }
+  }
+  else if ( otherViewWindow ) {
+    // reconnect source and target view
+    otherViewWindow->getViewPort()->disconnect( SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ), viewWindow->getViewPort(), SLOT( synchronize( OCCViewer_ViewPort* ) ) );
+    viewWindow->getViewPort()->disconnect( SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ), otherViewWindow->getViewPort(), SLOT( synchronize( OCCViewer_ViewPort* ) ) );
+    viewWindow->getViewPort()->synchronize( otherViewWindow->getViewPort() );
+    viewWindow->toolMgr()->action( SynchronizeId )->setData( otherViewWindow->getId() );
+    if ( otherViewWindow->toolMgr()->action( SynchronizeId )->data().toInt() == viewWindow->getId() && otherViewWindow->toolMgr()->action( SynchronizeId )->isChecked() ) {
+      bool blocked = otherViewWindow->toolMgr()->action( SynchronizeId )->blockSignals( true );
+      otherViewWindow->toolMgr()->action( SynchronizeId )->setChecked( false );
+      otherViewWindow->toolMgr()->action( SynchronizeId )->blockSignals( blocked );
+    }
+  }
+}
+
 /*!
   "Synchronize View" action slot.
 */
-void OCCViewer_ViewWindow::onSynchronizeView()
+void OCCViewer_ViewWindow::onSynchronizeView(bool checked)
 {
   QAction* a = qobject_cast<QAction*>( sender() );
   if ( a ) {
-    int id = a->data().toInt();
-    if ( id != 0 ) {
-      SUIT_Application* app = SUIT_Session::session()->activeApplication();
-      if ( !app ) return;
-      QList<SUIT_ViewManager*> wmlist;
-      app->viewManagers( getViewManager()->getType(), wmlist );
-      foreach( SUIT_ViewManager* wm, wmlist ) {
-       QVector<SUIT_ViewWindow*> vwlist = wm->getViews();
-       foreach ( SUIT_ViewWindow* vw, vwlist ) {
-         OCCViewer_ViewWindow* occVW = dynamic_cast<OCCViewer_ViewWindow*>( vw );
-         if ( !occVW ) continue;
-         // list only compatible types
-         OCCViewer_ViewWindow* subWindow = occVW->getView( get2dMode() );
-         if ( subWindow && subWindow->getId() == id && subWindow != this ) {
-           // perform synchronization
-           performRestoring( subWindow->getViewParams(), true );
-         }
-       }
-      }
-      
-      if ( a != toolMgr()->action( SynchronizeId ) )
-       toolMgr()->action( SynchronizeId )->setData( id );
-    }
+    synchronizeView( this, a->data().toInt() );
   }
 }
 
@@ -2497,6 +2561,7 @@ void OCCViewer_ViewWindow::updateSyncViews()
 {
   QAction* anAction = toolMgr()->action( SynchronizeId );
   if ( anAction && anAction->menu() ) {
+    int currentId = anAction->data().toInt();
     anAction->menu()->clear();
     SUIT_Application* app = SUIT_Session::session()->activeApplication();
     if ( app ) { 
@@ -2511,13 +2576,19 @@ void OCCViewer_ViewWindow::updateSyncViews()
          OCCViewer_ViewWindow* subWindow = occVW->getView( get2dMode() );
          if ( subWindow && subWindow != this ) {
            QAction* a = anAction->menu()->addAction( occVW->windowTitle() );
+           if ( subWindow->getId() == currentId ) {
+             QFont f = a->font();
+             f.setBold( true );
+             a->setFont( f );
+           }
            a->setData( subWindow->getId() );
-           connect( a, SIGNAL( triggered() ), this, SLOT( onSynchronizeView() ) );
+           connect( a, SIGNAL( triggered(bool) ), this, SLOT( onSynchronizeView(bool) ) );
          }
        }
       }
     }
     if ( anAction->menu()->actions().isEmpty() ) {
+      anAction->setData( 0 );
       anAction->menu()->addAction( tr( "MNU_SYNC_NO_VIEW" ) );
     }
   }
index 01a393e6b71e12af23264f1a30fa5f03304970d8..9717f60ec802d2e0936972d8c996ef4bad0e6b6a 100755 (executable)
@@ -186,7 +186,7 @@ public:
   virtual QString backgroundImageFilename() const;
   virtual void    setBackgroundImage( const QString& ,const Aspect_FillMethod& theFillMethod);
   
-  virtual const viewAspectList&   getViewAspects();
+  virtual const   viewAspectList& getViewAspects();
   virtual void                    appendViewAspect( const viewAspect& );
   virtual void                    updateViewAspects( const viewAspectList& );
   virtual void                    clearViewAspects();
@@ -231,9 +231,6 @@ public slots:
 
   virtual void onMaximizedView();
 
-  virtual void onSynchronizeView();
-  virtual void updateSyncViews();
-
 signals:
   void vpTransformationStarted(OCCViewer_ViewWindow::OperationType type);
   void vpTransformationFinished(OCCViewer_ViewWindow::OperationType type);
@@ -313,6 +310,11 @@ protected:
 
   double myCurScale;
 
+private slots:
+  void                  onSynchronizeView(bool);
+  void                  updateSyncViews();
+  static void           synchronizeView( OCCViewer_ViewWindow*, int );
+
 private:
   OCCViewer_ClippingDlg* myClippingDlg;
   QtxAction* myClippingAction;