Salome HOME
Exlude the user input during process events by application (Bug #325).
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_Module.cxx
index c8da5e4d08c7e7451192408b1e43091dee9d5b36..c9aa1704b558d9240ed4175263256604bdb95820 100644 (file)
 #include <SVTK_ViewModel.h>
 #include <SVTK_ViewWindow.h>
 #include <SVTK_Selector.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkRenderer.h>
-#include <vtkWorldPointPicker.h>
-#include <vtkCamera.h>
 
 #include <OCCViewer_ViewPort3d.h>
 
 #include <QMenu>
 #include <QMouseEvent>
 #include <QStatusBar>
-
-const double LOCAL_SELECTION_TOLERANCE = 0.0001;
+#include <QCursor>
 
 static int ViewManagerId = 0;
 
@@ -597,6 +592,11 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         theMenu->addAction( action( EditDigueId ) );
         theMenu->addSeparator();
       }
+      else if( anIsObstacle )
+      {
+        theMenu->addAction( action( TranslateObstacleId ) );
+        theMenu->addSeparator();
+      }
       else if( anIsVisualState && anIsObjectBrowser )
       {
         theMenu->addAction( action( SaveVisualStateId ) );
@@ -610,19 +610,22 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         theMenu->addAction( action( SetColorId ) );
         theMenu->addSeparator();
       }
-
-      // Add copy action
-      if( aModel->canCopy() ) {
-        theMenu->addAction( action( CopyId ) );
-        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();
+    }
+
+    // Add delete action
     if( !anIsDummyObject3D )
       theMenu->addAction( action( DeleteId ) );
+
     theMenu->addSeparator();
 
     if( anIsImage || anIsPolyline || anIsPolyline3D || 
@@ -654,6 +657,10 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
     theMenu->addAction( action( HideAllId ) );
     theMenu->addSeparator();
   }
+  if ( anIsOCCView || anIsVTKView ) {
+    theMenu->addSeparator();
+    theMenu->addAction( action( CopyViewerPositionId ) );
+  }
 }
 
 void HYDROGUI_Module::update( const int flags )
@@ -1047,6 +1054,35 @@ void HYDROGUI_Module::setObjectVTKPrs( const int                       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 )
 {
@@ -1448,81 +1484,23 @@ void HYDROGUI_Module::restoreSelection( const QStringList& theEntryList )
   }
 }
 
-void HYDROGUI_Module::onMouseMove( SUIT_ViewWindow* theViewWindow, QMouseEvent* theEvent )
+void HYDROGUI_Module::onMouseMove( SUIT_ViewWindow* theViewWindow, QMouseEvent* )
 {
-  OCCViewer_ViewWindow* anOCCViewWindow = 
-    dynamic_cast<OCCViewer_ViewWindow*>(theViewWindow);
+  double aX, aY, aZ;
   bool doShow = false;
-  gp_Pnt aPnt;
-  if ( anOCCViewWindow ) {
-    // Get the selected point coordinates
-    OCCViewer_ViewPort3d* aViewPort = anOCCViewWindow->getViewPort();
-    if ( !aViewPort ) {
-      return;
-    }
+  HYDROGUI_Displayer* aDisplayer = getDisplayer();
+  if ( aDisplayer )
+    aDisplayer->SaveCursorViewPosition( theViewWindow );
+    doShow = aDisplayer->GetCursorViewCoordinates( theViewWindow, aX, aY, aZ );
 
-    aPnt = CurveCreator_Utils::ConvertClickToPoint( theEvent->x(), theEvent->y(), 
-                                                           aViewPort->getView() );
-    doShow = true;
-  } 
-  else
-  {
-    SVTK_ViewWindow* aViewWindow = 
-      dynamic_cast<SVTK_ViewWindow*>(theViewWindow);
-    if ( aViewWindow ) {
-      vtkRenderer* aRen = aViewWindow->getRenderer();
-      if ( aRen )
-      {
-        vtkCamera* aCamera = aRen->GetActiveCamera();
-        double* aNormal = aCamera->GetViewPlaneNormal();
-        int event_x, event_y;
-        vtkRenderWindowInteractor* anInteractor = aViewWindow->getInteractor();
-        if ( anInteractor )
-        {
-          anInteractor->GetLastEventPosition(event_x, event_y);
-          // Use a WorldPicker to get current coords
-          myPicker->Pick( event_x, event_y, 0, aRen );
-          double* aCoords = myPicker->GetPickPosition();
-          /////////////////////// Use the same algorithm as for OCC
-          double X, Y, Z;
-          double aXp, aYp, aZp;
-          double Vx, Vy, Vz;
-          X = aCoords[0];
-          Y = aCoords[1];
-          Z = aCoords[2];
-          Vx = aNormal[0];
-          Vy = aNormal[1];
-          Vz = aNormal[2];
-          Standard_Real aPrec = LOCAL_SELECTION_TOLERANCE;
-          if ( fabs( Vz ) > aPrec ) {
-            double aT = -Z/Vz;
-            aXp = X + aT*Vx;
-            aYp = Y + aT*Vy;
-            aZp = Z + aT*Vz;
-          }
-          else { // Vz = 0 - the eyed plane is orthogonal to Z plane - XOZ, or YOZ
-            aXp = aYp = aZp = 0;
-            if ( fabs( Vy ) < aPrec ) // Vy = 0 - the YOZ plane
-              aYp = Y;
-            else if ( fabs( Vx ) < aPrec ) // Vx = 0 - the XOZ plane
-              aXp = X;
-          }
-          /////////////////////////
-          doShow = true;
-          aPnt.SetX( aXp );
-          aPnt.SetY( aYp );
-        }
-      }
-    } 
-  }
   if ( doShow )
   {
     // Show the coordinates in the status bar
     SUIT_Desktop* aDesktop = getApp()->desktop();
     if ( aDesktop && aDesktop->statusBar() ) {
-      QString aX = HYDROGUI_Tool::GetCoordinateString( aPnt.X() );
-      QString anY = HYDROGUI_Tool::GetCoordinateString( aPnt.Y() );
-      aDesktop->statusBar()->showMessage( tr("COORDINATES_INFO").arg( aX ).arg( anY ) );
+      QString aXStr = HYDROGUI_Tool::GetCoordinateString( aX );
+      QString anYStr = HYDROGUI_Tool::GetCoordinateString( aY );
+      aDesktop->statusBar()->showMessage( tr("COORDINATES_INFO").arg( aXStr ).arg( anYStr ) );
     }
   }
 }
@@ -1540,4 +1518,4 @@ int HYDROGUI_Module::getObjectDisplayOrder(
   QStringList anObjectEntries = myObjectDisplayOrderMap.value( theViewId );
 
   return anObjectEntries.indexOf( anEntry );
-}
\ No newline at end of file
+}