Salome HOME
Merge branch 'hydro/imps_2015' into V7_dev
[modules/geom.git] / src / CurveCreator / CurveCreator_Widget.cxx
index 9cd21e3b7fe3339a915b1f870a1c204bd037716e..d401b8bc64782c09b6f75d513c031414c3656cc7 100644 (file)
@@ -1,9 +1,9 @@
-// Copyright (C) 2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2013-2015  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -48,6 +48,7 @@
 #include <QApplication>
 #include <QTableWidget>
 #include <QTime>
+#include <QSplitter>
 
 //#define MEASURE_TIME
 
@@ -206,8 +207,14 @@ CurveCreator_Widget::CurveCreator_Widget(QWidget* parent,
   aSectLayout->setMargin( 5 );
   aSectLayout->setSpacing( 5 );
   aSectLayout->addWidget(aTB);
-  aSectLayout->addWidget(mySectionView);
-  aSectLayout->addWidget( myLocalPointView );
+
+  QSplitter* aSplitter = new QSplitter(aSectionGroup);
+  aSplitter->setOrientation(Qt::Vertical);
+
+  aSplitter->addWidget(mySectionView);
+  aSplitter->addWidget( myLocalPointView );
+
+  aSectLayout->addWidget(aSplitter);
   aSectionGroup->setLayout(aSectLayout);
   QVBoxLayout* aLay = new QVBoxLayout();
   aLay->setMargin( 0 );
@@ -318,6 +325,7 @@ int CurveCreator_Widget::changeInteractionStyle( int theStyle )
 //=======================================================================
 void CurveCreator_Widget::reset()
 {
+  stopActionMode();
 }
 
 void CurveCreator_Widget::setCurve( CurveCreator_ICurve* theCurve )
@@ -618,8 +626,6 @@ void CurveCreator_Widget::onModifySection()
   mySectionView->sectionChanged(mySection);
   updateUndoRedo();
   onCancelSection();
-
-  emit curveModified();
 }
 
 void CurveCreator_Widget::onJoin()
@@ -653,8 +659,6 @@ void CurveCreator_Widget::onJoin()
   if( aNewSectSize != aMainSectSize )
     mySectionView->pointsAdded( aMainSect, aMainSectSize, aNewSectSize-aMainSectSize );*/
   updateUndoRedo();
-
-  emit curveModified();
 }
 
 void CurveCreator_Widget::onRemove()
@@ -683,8 +687,6 @@ void CurveCreator_Widget::onClearAll()
   mySectionView->reset();
   updateActionsStates();
   updateUndoRedo();
-  
-  emit curveModified();
 }
 
 void CurveCreator_Widget::onJoinAll()
@@ -702,8 +704,6 @@ void CurveCreator_Widget::onJoinAll()
   mySectionView->reset();
   updateActionsStates();
   updateUndoRedo();
-
-  emit curveModified();
 }
 
 void CurveCreator_Widget::onUndoSettings()
@@ -722,8 +722,6 @@ void CurveCreator_Widget::onSetSpline()
     mySectionView->sectionChanged(aSelSections[i]);
   }
   updateUndoRedo();
-
-  emit curveModified();
 }
 
 void CurveCreator_Widget::onSetPolyline()
@@ -737,8 +735,6 @@ void CurveCreator_Widget::onSetPolyline()
     mySectionView->sectionChanged( aSelSections[i] );
   }
   updateUndoRedo();
-
-  emit curveModified();
 }
 
 void CurveCreator_Widget::onCloseSections()
@@ -752,8 +748,6 @@ void CurveCreator_Widget::onCloseSections()
     mySectionView->sectionChanged(aSelSections[i]);
   }
   updateUndoRedo();
-
-  emit curveModified();
 }
 
 void CurveCreator_Widget::onUncloseSections()
@@ -767,8 +761,6 @@ void CurveCreator_Widget::onUncloseSections()
     mySectionView->sectionChanged(aSelSections[i]);
   }
   updateUndoRedo();
-
-  emit curveModified();
 }
 
 void CurveCreator_Widget::onUndo()
@@ -781,8 +773,6 @@ void CurveCreator_Widget::onUndo()
   myCurve->undo();
   finishCurveModification();
   mySectionView->reset();
-
-  emit curveModified();
 }
 
 void CurveCreator_Widget::onRedo()
@@ -794,8 +784,6 @@ void CurveCreator_Widget::onRedo()
   myCurve->redo();
   finishCurveModification();
   mySectionView->reset();
-
-  emit curveModified();
 }
 
 void CurveCreator_Widget::updateUndoRedo()
@@ -973,17 +961,10 @@ void CurveCreator_Widget::addCoordsByClick( QMouseEvent* pe )
       return;
 
     gp_Pnt aPnt;    
+    OCCViewer_ViewPort3d* vp = getViewPort();
 
-    ic->InitSelected();
-    if ( pe->modifiers() == Qt::ShiftModifier )
-      ic->ShiftSelect();  // Append selection
-    else
-      ic->Select();       // New selection
+    aPnt = CurveCreator_Utils::ConvertClickToPoint( pe->x(), pe->y(), vp->getView() );
 
-    {
-      OCCViewer_ViewPort3d* vp = getViewPort();
-      aPnt = CurveCreator_Utils::ConvertClickToPoint( pe->x(), pe->y(), vp->getView() );
-    }
     // set the coordinates into dialog
     CurveCreator::Coordinates aCoords;
     aCoords.push_back( aPnt.X() );
@@ -1005,8 +986,9 @@ void CurveCreator_Widget::onMousePress( SUIT_ViewWindow*, QMouseEvent* theEvent
   if ( theEvent->button() != Qt::LeftButton )
     return;
 
-  myPressedX = theEvent->x();
-  myPressedY = theEvent->y();
+  // Initialize the starting point
+  myStartPoint.setX( theEvent->x() );
+  myStartPoint.setY( theEvent->y() );
 
   switch( getActionMode() ) {
     case ModificationMode: {
@@ -1028,15 +1010,71 @@ void CurveCreator_Widget::onMousePress( SUIT_ViewWindow*, QMouseEvent* theEvent
  * \param theWindow an owner of the signal
  * \param theEvent a mouse event
  */
-void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow*, QMouseEvent* theEvent )
+void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow* theWindow, QMouseEvent* theEvent )
 {
-  if ( getActionMode() != ModificationMode )
+  ActionMode aMode = getActionMode();
+  if ( aMode != ModificationMode )
+  {
+    // Emit selectionChanged() signal
+    getOCCViewer()->performSelectionChanged();
+
+    if ( aMode == AdditionMode )
+    {
+      Handle(AIS_InteractiveContext) aCtx = getAISContext();
+      if ( !aCtx.IsNull() )
+        aCtx->ClearSelected();
+    }
     return;
+  } 
+  if (theEvent->button() != Qt::LeftButton) return;
+  if (!theWindow->inherits("OCCViewer_ViewWindow")) return;
+
+  // Initialize the ending point
+  myEndPoint.setX( theEvent->x() );
+  myEndPoint.setY( theEvent->y() );
+
+  bool aHasShift = ( theEvent->modifiers() & Qt::ShiftModifier );
+
+  // Highlight detected objects
+  Handle(AIS_InteractiveContext) aCtx = getAISContext();
+  if ( !aCtx.IsNull() )
+  {
+    OCCViewer_ViewWindow* aView = (OCCViewer_ViewWindow*) theWindow;
+    if (!aView)
+      return;
+
+    if (!aHasShift)
+      aCtx->ClearCurrents( false );
+
+    Handle(V3d_View) aView3d = aView->getViewPort()->getView();
+    if ( !aView3d.IsNull() )
+    {
+      // Initialize the single selection if start and end points are equal,
+      // otherwise a rectangular selection.
+      if ( myStartPoint == myEndPoint )
+      {
+        aCtx->MoveTo( myEndPoint.x(), myEndPoint.y(), aView3d );
+        if ( aHasShift )
+          aCtx->ShiftSelect();
+        else
+          aCtx->Select();
+      }
+      else
+      {
+        if ( aHasShift )
+          aCtx->ShiftSelect( myStartPoint.x(), myStartPoint.y(), myEndPoint.x(), myEndPoint.y(),
+                             aView3d, Standard_False );
+        else
+          aCtx->Select( myStartPoint.x(), myStartPoint.y(), myEndPoint.x(), myEndPoint.y(),
+                        aView3d, Standard_False );
+      }
+    }
+  }
 
   if ( myDragStarted ) {
     bool isDragged = myDragged;
     CurveCreator_ICurve::SectionToPointList aDraggedPoints;
-    QMap<CurveCreator_ICurve::SectionToPoint, std::deque< float > > anInitialDragPointsCoords;
+    QMap<CurveCreator_ICurve::SectionToPoint, CurveCreator::Coordinates > anInitialDragPointsCoords;
     if ( myDragged ) {
       aDraggedPoints = myDragPoints;
       anInitialDragPointsCoords = myInitialDragPointsCoords;
@@ -1082,7 +1120,7 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow*, QMouseEvent* theEven
         for ( ; anIt != aLast; anIt++ ) {
           int aSectionId = anIt->first;
           int aPointId = anIt->second;
-          std::deque<float> aPos = myCurve->getPoint( aSectionId, aPointId );
+          CurveCreator::Coordinates aPos = myCurve->getPoint( aSectionId, aPointId );
 
           aCoordList.push_back(
             std::make_pair( std::make_pair( aSectionId, aPointId ), aPos ) );
@@ -1104,17 +1142,13 @@ void CurveCreator_Widget::onMouseRelease( SUIT_ViewWindow*, QMouseEvent* theEven
   }
   else // check whether the segment is clicked an a new point should be added to the segment
   {
-    int aReleasedX = theEvent->x();
-    int aReleasedY = theEvent->y();
-    if ( myPressedX == aReleasedX && myPressedY == aReleasedY )
-      insertPointToSelectedSegment( aReleasedX, aReleasedY );
+    if ( myStartPoint.x() == myEndPoint.x() && myStartPoint.y() == myEndPoint.y() )
+      insertPointToSelectedSegment( myEndPoint.x(), myStartPoint.y() );
   }
 
   // updates the input panel table to show the selected point coordinates
   updateLocalPointView();
   updateUndoRedo();
-
-  emit curveModified();
 }
 
 /**
@@ -1176,14 +1210,12 @@ void CurveCreator_Widget::onCellChanged( int theRow, int theColumn )
 
   double aX  = myLocalPointView->item( theRow, 2 )->data( Qt::UserRole ).toDouble();
   double anY = myLocalPointView->item( theRow, 3 )->data( Qt::UserRole ).toDouble();
-  std::deque<float> aChangedPos;
+  CurveCreator::Coordinates aChangedPos;
   aChangedPos.push_back( aX );
   aChangedPos.push_back( anY );
   myCurve->setPoint( aCurrSect, aPntIndex, aChangedPos );
 
   finishCurveModification( aSelPoints );
-
-  emit curveModified();
 }
 
 /**
@@ -1201,8 +1233,6 @@ void CurveCreator_Widget::removeSection()
   }
   mySectionView->clearSelection();
   updateUndoRedo();
-
-  emit curveModified();
 }
 
 /**
@@ -1221,8 +1251,6 @@ void CurveCreator_Widget::removePoint()
   myCurve->removeSeveralPoints( aPoints );
   finishCurveModification( CurveCreator_ICurve::SectionToPointList() );
   mySectionView->reset();
-
-  emit curveModified();
 }
 
 void CurveCreator_Widget::addNewPoint(const CurveCreator::Coordinates& theCoords)
@@ -1238,8 +1266,6 @@ void CurveCreator_Widget::addNewPoint(const CurveCreator::Coordinates& theCoords
   mySectionView->pointsAdded( aSection, myCurve->getNbPoints( aSection ) );
   updateActionsStates();
   updateUndoRedo();
-
-  emit curveModified();
 }
 
 void CurveCreator_Widget::insertPointToSelectedSegment( const int theX,
@@ -1306,8 +1332,6 @@ void CurveCreator_Widget::insertPointToSelectedSegment( const int theX,
   finishCurveModification( aSelPoints );
 
   setSelectedPoints();
-
-  emit curveModified();
 }
 
 void CurveCreator_Widget::moveSelectedPoints( const int theXPosition,
@@ -1329,7 +1353,7 @@ void CurveCreator_Widget::moveSelectedPoints( const int theXPosition,
   double anYDelta = aStartPnt.Y() - anEndPnt.Y();
 
   CurveCreator_ICurve::SectionToPointCoordsList aCoordList;
-  std::deque<float> aChangedPos;
+  CurveCreator::Coordinates aChangedPos;
   CurveCreator_ICurve::SectionToPointList::const_iterator anIt = myDragPoints.begin(),
                                                           aLast = myDragPoints.end();
   for ( ; anIt != aLast; anIt++ ) {
@@ -1355,8 +1379,6 @@ void CurveCreator_Widget::moveSelectedPoints( const int theXPosition,
 
   myDragged = true;
   finishCurveModification( myDragPoints );
-
-  emit curveModified();
 }
 
 void CurveCreator_Widget::updateLocalPointView()
@@ -1483,7 +1505,7 @@ void CurveCreator_Widget::finishCurveModification(
  * \param theX the X coordinate of the point
  * \param theY the Y coordinate of the point
  */
-int CurveCreator_Widget::findLocalPointIndex( int theSectionId, float theX, float theY )
+int CurveCreator_Widget::findLocalPointIndex( int theSectionId, double theX, double theY )
 {
   return CurveCreator_UtilsICurve::findLocalPointIndex( myCurve, theSectionId, theX, theY );
 }