Salome HOME
refs #430: incorrect coordinates in dump polyline
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_Module.cxx
index 09cd00f85a37587359680c4b37a6453f03db52c5..bd3b1a16fa0fe47439fc07b4111fd68ba84b5baf 100644 (file)
@@ -42,6 +42,7 @@
 #include "HYDROGUI_PolylineOp.h"
 #include "HYDROGUI_SetColorOp.h"
 #include "HYDROGUI_ImportGeomObjectOp.h"
+#include "HYDROGUI_ShowHideOp.h"
 
 #include <HYDROData_Image.h>
 #include <HYDROData_Profile.h>
@@ -185,7 +186,6 @@ bool HYDROGUI_Module::activateModule( SUIT_Study* theStudy )
   foreach ( const int anId, anObsoleteIds ) {
     myViewManagerMap.remove( anId );
     myObjectStateMap.remove( anId );
-    myObjectDisplayOrderMap.remove( anId );
     myShapesMap.remove( anId );
     myVTKPrsMap.remove( anId );
   }
@@ -269,6 +269,7 @@ bool HYDROGUI_Module::deactivateModule( SUIT_Study* theStudy )
 
   HYDROGUI_Tool::setOCCActionShown( this, OCCViewer_ViewWindow::MaximizedId, true );
 
+  myActiveOperationMap.clear();
   return LightApp_Module::deactivateModule( theStudy );
 }
 
@@ -331,6 +332,18 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
   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<LightApp_Study*>( getApp()->activeStudy() );
+    if( aStudy )
+      isRoot = aStudy->isComponent( anEntry );
+  }
 
   // Check the selected GEOM objects (take into account the Object Browser only)
   if ( anIsObjectBrowser ) {
@@ -592,6 +605,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 ) );
@@ -644,6 +662,10 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
     HYDROGUI_PolylineOp* aPolylineOp = dynamic_cast<HYDROGUI_PolylineOp*>( anOp );
     if ( aPolylineOp && aPolylineOp->deleteEnabled() )
       theMenu->addAction( action( DeleteId ) );
+
+    theMenu->addSeparator();
+    theMenu->addAction( action( SetZLevelId ) );
+    theMenu->addSeparator();
   }
 
   if( anIsObjectBrowser || anIsGraphicsView || anIsOCCView || anIsVTKView )
@@ -652,11 +674,15 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
     theMenu->addAction( action( HideAllId ) );
     theMenu->addSeparator();
   }
-  if ( anIsOCCView || anIsVTKView ) {
+  
+  if ( anIsOCCView || anIsVTKView )
+  {
     theMenu->addSeparator();
     theMenu->addAction( action( CopyViewerPositionId ) );
-    myPopupPos = QCursor::pos();
   }
+
+  if( isRoot )
+    theMenu->addAction( action( EditLocalCSId ) );
 }
 
 void HYDROGUI_Module::update( const int flags )
@@ -871,13 +897,6 @@ void HYDROGUI_Module::setObjectVisible( const int theViewId,
 
     ObjectState& anObjectState = aEntry2ObjectStateMap[ anEntry ];
     anObjectState.Visibility = theState;
-
-    // Remember the display order ( needed for Z layers assignment only )
-    QStringList& anObjectEntries = myObjectDisplayOrderMap[ theViewId ];
-    anObjectEntries.removeAll( anEntry );
-    if ( theState ) {
-      anObjectEntries.append( anEntry );
-    }
   }
 }
 
@@ -1050,6 +1069,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 )
 {
@@ -1453,44 +1501,58 @@ void HYDROGUI_Module::restoreSelection( const QStringList& theEntryList )
 
 void HYDROGUI_Module::onMouseMove( SUIT_ViewWindow* theViewWindow, QMouseEvent* )
 {
-  double aX, aY, aZ;
+  double X, Y, Z;
   bool doShow = false;
   HYDROGUI_Displayer* aDisplayer = getDisplayer();
   if ( aDisplayer )
-    doShow = aDisplayer->GetCursorViewCoordinates( theViewWindow, QCursor::pos(), aX, aY, aZ );
+    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() ) {
-      QString aXStr = HYDROGUI_Tool::GetCoordinateString( aX );
-      QString anYStr = HYDROGUI_Tool::GetCoordinateString( aY );
-      aDesktop->statusBar()->showMessage( tr("COORDINATES_INFO").arg( aXStr ).arg( anYStr ) );
+    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 );
     }
   }
 }
 
 /**
- * Get the object display order. Needed for Z layers assignment only.
+ * Returns stack of active operations;
  */
-int HYDROGUI_Module::getObjectDisplayOrder( 
-  const int theViewId, const Handle(HYDROData_Entity)& theObject) const
+QStack<HYDROGUI_Operation*>& HYDROGUI_Module::getActiveOperations()
 {
-  if( theObject.IsNull() )
-    return -1;
-
-  QString anEntry = HYDROGUI_DataObject::dataObjectEntry( theObject );
-  QStringList anObjectEntries = myObjectDisplayOrderMap.value( theViewId );
-
-  return anObjectEntries.indexOf( anEntry );
+  return myActiveOperationMap;
 }
 
 /**
- * Get the popup menu position
- * \return the position
+ * Returns the module active operation. If the active operation is show/hide,
+ * the method returns the previous operation if it is.
  */
-QPoint HYDROGUI_Module::getPopupPosition() const
+HYDROGUI_Operation* HYDROGUI_Module::activeOperation()
 {
- return myPopupPos;
+  HYDROGUI_Operation* anOp = !myActiveOperationMap.empty() ? myActiveOperationMap.top() : 0;
+
+  if ( dynamic_cast<HYDROGUI_ShowHideOp*>( anOp ) )
+  {
+    QVectorIterator<HYDROGUI_Operation*> aVIt( myActiveOperationMap );
+    aVIt.toBack();
+    aVIt.previous(); // skip the top show/hide operation
+    anOp = aVIt.hasPrevious() ? aVIt.previous() : 0;
+  }
+
+  return anOp;
 }