Salome HOME
updated copyright message
[modules/gui.git] / src / OCCViewer / OCCViewer_ViewFrame.cxx
old mode 100755 (executable)
new mode 100644 (file)
index cc20fd4..64fe81c
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2023  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
@@ -23,6 +23,7 @@
 #include "OCCViewer_ViewFrame.h"
 #include "OCCViewer_ViewWindow.h"
 #include "OCCViewer_ViewModel.h"
+#include "OCCViewer_ViewPort3d.h"
 
 #include <SUIT_ViewManager.h>
 #include <SUIT_Session.h>
@@ -36,7 +37,7 @@
 #include <QApplication>
 
 OCCViewer_ViewFrame::OCCViewer_ViewFrame(SUIT_Desktop* theDesktop, OCCViewer_Viewer* theModel)
-  : OCCViewer_ViewWindow( theDesktop, theModel ), myPopupRequestedView(0), mySplitMode(-1)
+  : OCCViewer_ViewWindow( theDesktop, theModel ), mySplitMode(-1), myPopupRequestedView(0)
 {
   QFrame* centralFrame = new QFrame( this );
   setCentralWidget( centralFrame );
@@ -52,6 +53,7 @@ OCCViewer_ViewFrame::OCCViewer_ViewFrame(SUIT_Desktop* theDesktop, OCCViewer_Vie
 
   myLayout->addWidget( view0, 0, 0 );
   myMaximizedView = view0;
+  myActiveView = view0;
   connectViewSignals(view0);
 }
 
@@ -76,6 +78,12 @@ OCCViewer_ViewWindow* OCCViewer_ViewFrame::getView( const int i ) const
   return ( i >= 0 && i < myViews.count() ) ? myViews.at( i ) : 0 ;
 }
 
+//**************************************************************************************
+OCCViewer_ViewWindow* OCCViewer_ViewFrame::getActiveView( ) const
+{
+  return myActiveView;
+}
+
 //**************************************************************************************
 void OCCViewer_ViewFrame::setViewManager( SUIT_ViewManager* theMgr )
 {
@@ -93,7 +101,10 @@ void OCCViewer_ViewFrame::returnTo3dView()
     view = myViews.at(i);
     view->setVisible( view->get2dMode() == No2dMode );
     view->setMaximized( true, false );
-    if (view->get2dMode() == No2dMode) myMaximizedView = view;
+    if (view->get2dMode() == No2dMode) {
+      myMaximizedView = view;
+      myActiveView = view;
+    }
   }
   myLayout->setColumnStretch(0, 0);
   myLayout->setColumnStretch(1, 0);
@@ -107,6 +118,7 @@ void OCCViewer_ViewFrame::returnTo3dView()
 void OCCViewer_ViewFrame::onMaximizedView( OCCViewer_ViewWindow* theView, bool isMaximized)
 {
   myMaximizedView = theView;
+  myActiveView = theView;
   if (isMaximized) {
     if (myViews.count() <= 1)
       return;
@@ -131,9 +143,7 @@ void OCCViewer_ViewFrame::onMaximizedView( OCCViewer_ViewWindow* theView, bool i
       mySplitMode = CreateSubViewsDlg.getSplitMode();
       myViewsMode = CreateSubViewsDlg.getViewsMode();
       splitSubViews();
-    }
-    else {
-      myMaximizedView->setMaximized(true);
+      myMaximizedView->setMaximized(false, false);
     }
   }
   myLayout->invalidate();
@@ -160,16 +170,30 @@ void OCCViewer_ViewFrame::createSubViews()
       view->setDropDownButtons( dropDownButtons() );
       connectViewSignals(view);
       view->setBackground(aModel->background(i));
+      setSubViewParams( view );
     }
   }
 }
 
+//**************************************************************************************
+void OCCViewer_ViewFrame::setSubViewParams( OCCViewer_ViewWindow* theView )
+{
+  Handle(V3d_View) aView = theView->getViewPort()->getView();
+  Handle(V3d_View) aMainView = myViews.at( MAIN_VIEW )->getViewPort()->getView();
+
+  // set ray tracing parameters
+  aView->ChangeRenderingParams() = aMainView->RenderingParams();
+
+  // set environment texture parameters
+  aView->SetTextureEnv( aMainView->TextureEnv() );
+}
+
 void OCCViewer_ViewFrame::splitSubViews()
 {
        if( mySplitMode == -1 )
                return;
 
-  int aNbViews;
+  int aNbViews = 1;
   if ( mySplitMode >= 0 && mySplitMode < 2)
     aNbViews = 2;
   else if( mySplitMode >= 2 && mySplitMode < 8 )
@@ -178,7 +202,7 @@ void OCCViewer_ViewFrame::splitSubViews()
     aNbViews = 4;
 
   if( aNbViews != myViewsMode.count() )
-       return;
+    return;
 
   int SubViews3Map[6][3][4] = {
     { {0,0,1,1}, {0,1,1,1}, {0,2,1,1} },
@@ -316,6 +340,144 @@ void OCCViewer_ViewFrame::setInteractionStyle( const int i )
   }
 }
 
+//**************************************************************************************
+int OCCViewer_ViewFrame::projectionType() const
+{
+  return getView(MAIN_VIEW)->projectionType();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setProjectionType( int t)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setProjectionType(t);
+  }
+}
+
+//**************************************************************************************
+OCCViewer_ViewWindow::SelectionStyle OCCViewer_ViewFrame::selectionStyle() const
+{
+  return getView(MAIN_VIEW)->selectionStyle();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setSelectionStyle(OCCViewer_ViewWindow::SelectionStyle t)
+{
+  foreach(OCCViewer_ViewWindow* aView, myViews) {
+    aView->setSelectionStyle(t);
+  }
+}
+
+//**************************************************************************************
+int OCCViewer_ViewFrame::stereoType() const
+{
+  return getView(MAIN_VIEW)->stereoType();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setStereoType( int t)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setStereoType(t);
+  }
+}
+
+//**************************************************************************************
+int OCCViewer_ViewFrame::anaglyphFilter() const
+{
+  return getView(MAIN_VIEW)->anaglyphFilter();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setAnaglyphFilter( int t)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setAnaglyphFilter(t);
+  }
+}
+
+//**************************************************************************************
+int OCCViewer_ViewFrame::stereographicFocusType() const
+{
+  return getView(MAIN_VIEW)->stereographicFocusType();
+}
+
+//**************************************************************************************
+double OCCViewer_ViewFrame::stereographicFocusValue() const
+{
+  return getView(MAIN_VIEW)->stereographicFocusValue();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setStereographicFocus( int t, double v)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setStereographicFocus(t, v);
+  }
+}
+
+//**************************************************************************************
+int OCCViewer_ViewFrame::interocularDistanceType() const
+{
+  return getView(MAIN_VIEW)->interocularDistanceType();
+}
+
+//**************************************************************************************
+double OCCViewer_ViewFrame::interocularDistanceValue() const
+{
+  return getView(MAIN_VIEW)->interocularDistanceValue();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setInterocularDistance( int t, double v)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setInterocularDistance(t, v);
+  }
+}
+
+//**************************************************************************************
+bool OCCViewer_ViewFrame::isReverseStereo() const
+{
+  return getView(MAIN_VIEW)->isReverseStereo();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setReverseStereo( bool t)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setReverseStereo(t);
+  }
+}
+
+//**************************************************************************************
+bool OCCViewer_ViewFrame::isVSync() const
+{
+  return getView(MAIN_VIEW)->isVSync();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setVSync( bool t)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setVSync(t);
+  }
+}
+
+//**************************************************************************************
+bool OCCViewer_ViewFrame::isQuadBufferSupport() const
+{
+  return getView(MAIN_VIEW)->isQuadBufferSupport();
+}
+
+//**************************************************************************************
+void OCCViewer_ViewFrame::setQuadBufferSupport( bool t)
+{
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    aView->setQuadBufferSupport(t);
+  }
+}
+
 //**************************************************************************************
 void OCCViewer_ViewFrame::setZoomingStyle( const int i ) 
 { 
@@ -344,6 +506,9 @@ void OCCViewer_ViewFrame::connectViewSignals(OCCViewer_ViewWindow* theView)
            this, SIGNAL( mouseDoubleClicked(SUIT_ViewWindow*, QMouseEvent*) ) );
   connect( theView, SIGNAL( mousePressed(SUIT_ViewWindow*, QMouseEvent*) ), 
            this, SIGNAL( mousePressed(SUIT_ViewWindow*, QMouseEvent*) ) );
+  // The signal is used to mouse pressed for choose the current window
+  connect( theView, SIGNAL( mousePressed(SUIT_ViewWindow*, QMouseEvent*) ),
+           this, SLOT( onMousePressed(SUIT_ViewWindow*, QMouseEvent*) ) );
   connect( theView, SIGNAL( mouseReleased(SUIT_ViewWindow*, QMouseEvent*) ), 
            this, SIGNAL( mouseReleased(SUIT_ViewWindow*, QMouseEvent*) ) );
   connect( theView, SIGNAL( mouseMoving(SUIT_ViewWindow*, QMouseEvent*) ), 
@@ -457,6 +622,11 @@ void OCCViewer_ViewFrame::onContextMenuRequested(QContextMenuEvent*)
   myPopupRequestedView = dynamic_cast<OCCViewer_ViewWindow*>(sender());
 }
 
+void OCCViewer_ViewFrame::onMousePressed(SUIT_ViewWindow* view, QMouseEvent*)
+{
+  myActiveView = dynamic_cast<OCCViewer_ViewWindow*>(view);
+}
+
 void OCCViewer_ViewFrame::onDumpView()
 {
   if (myPopupRequestedView) {
@@ -567,3 +737,12 @@ void OCCViewer_ViewFrame::enablePreselection( bool isEnabled )
     aView->enablePreselection(isEnabled); 
   }
 }
+
+bool OCCViewer_ViewFrame::enableDrawMode( bool on )
+{
+  bool prev = false;
+  foreach (OCCViewer_ViewWindow* aView, myViews) {
+    prev = prev || aView->enableDrawMode( on ); 
+  }
+  return prev;
+}