Salome HOME
Fix for the bug #42: point C is not activated, but point C is shown in preview in...
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_PrsImage.cxx
index fa75c25eb15109310cd352268622361bad9d132e..250d4c859555c219b757dcf15fb2dc0a9fb3f511 100644 (file)
 // name    : HYDROGUI_PrsImage
 // Purpose : Constructor
 //=======================================================================
-HYDROGUI_PrsImage::HYDROGUI_PrsImage( const Handle(HYDROData_Object)& theObject )
+HYDROGUI_PrsImage::HYDROGUI_PrsImage( const Handle(HYDROData_Entity)& theObject )
 : HYDROGUI_Prs( theObject ),
   myPixmapItem( 0 ),
+  myCaptionItem( 0 ),
   myPrsImageFrame( 0 ),
   myIsTransformationPointPreview( false ),
-  myTransformationPointMode( None )
+  myTransformationPointType( None )
 {
-  myHighlightCursor = new QCursor( Qt::PointingHandCursor );
   myTransformationPointCursor = new QCursor( Qt::CrossCursor );
 }
 
@@ -49,12 +49,6 @@ HYDROGUI_PrsImage::HYDROGUI_PrsImage( const Handle(HYDROData_Object)& theObject
 //=======================================================================
 HYDROGUI_PrsImage::~HYDROGUI_PrsImage()
 {
-  if( myHighlightCursor )
-  {
-    delete myHighlightCursor;
-    myHighlightCursor = 0;
-  }
-
   if( myTransformationPointCursor )
   {
     delete myTransformationPointCursor;
@@ -80,6 +74,30 @@ QImage HYDROGUI_PrsImage::getImage() const
   return myImage;
 }
 
+//================================================================
+// Function : setCaption
+// Purpose  : 
+//================================================================
+void HYDROGUI_PrsImage::setCaption( const QString& theCaption )
+{
+  if( myCaptionItem )
+  {
+    myCaptionItem->setText( theCaption );
+    myCaptionItem->setVisible( !theCaption.isEmpty() );
+  }
+}
+
+//================================================================
+// Function : getCaption
+// Purpose  : 
+//================================================================
+QString HYDROGUI_PrsImage::getCaption() const
+{
+  if( myCaptionItem )
+    return myCaptionItem->text();
+  return QString();
+}
+
 //================================================================
 // Function : setIsTransformationPointPreview
 // Purpose  : 
@@ -99,14 +117,42 @@ bool HYDROGUI_PrsImage::getIsTransformationPointPreview() const
 }
 
 //================================================================
-// Function : setTransformationPointMode
+// Function : setTransformationPointType
+// Purpose  : 
+//================================================================
+void HYDROGUI_PrsImage::setTransformationPointType( const int thePointType )
+{
+  myTransformationPointType = thePointType;
+  if( thePointType != None )
+    computeTransformationPoints();
+}
+
+//================================================================
+// Function : setTransformationPointMap
+// Purpose  : 
+//================================================================
+void HYDROGUI_PrsImage::setTransformationPointMap( const TransformationPointMap& theMap )
+{
+  myTransformationPointMap = theMap;
+  if( !theMap.isEmpty() )
+    computeTransformationPoints();
+}
+
+//================================================================
+// Function : updateTransformationPoint
 // Purpose  : 
 //================================================================
-void HYDROGUI_PrsImage::setTransformationPointMode( const int theMode )
+void HYDROGUI_PrsImage::updateTransformationPoint( const int thePointType,
+                                                   const bool theIsY,
+                                                   const int theValue )
 {
-  myTransformationPointMode = theMode;
-  if( theMode != None )
+  if( myTransformationPointMap.find( thePointType ) != myTransformationPointMap.end() )
+  {
+    TransformationPoint& aTransformationPoint = myTransformationPointMap[ thePointType ];
+    QPoint& aPoint = aTransformationPoint.Point;
+    theIsY ? aPoint.setY( theValue ) : aPoint.setX( theValue );
     computeTransformationPoints();
+  }
 }
 
 //================================================================
@@ -129,12 +175,27 @@ void HYDROGUI_PrsImage::compute()
     myPixmapItem = new QGraphicsPixmapItem( this );
     addToGroup( myPixmapItem );
   }
+  if( !myCaptionItem )
+  {
+    myCaptionItem = new QGraphicsSimpleTextItem( this );
+
+    QFont aFont = myCaptionItem->font();
+    aFont.setPointSize( 14 );
+    myCaptionItem->setFont( aFont );
+
+    addToGroup( myCaptionItem );
+  }
   if( !myPrsImageFrame )
   {
     myPrsImageFrame = new HYDROGUI_PrsImageFrame( this );
     addToGroup( myPrsImageFrame );
   }
+
   myPixmapItem->setPixmap( QPixmap::fromImage( myImage ) );
+
+  myCaptionItem->setPos( 0, -30 );
+  myCaptionItem->setVisible( false );
+
   myPrsImageFrame->compute();
 }
 
@@ -144,20 +205,8 @@ void HYDROGUI_PrsImage::compute()
 //================================================================
 void HYDROGUI_PrsImage::addTo( GraphicsView_ViewPort* theViewPort )
 {
-  GraphicsView_Object::addTo( theViewPort );
+  HYDROGUI_Prs::addTo( theViewPort );
   theViewPort->addItem( myPrsImageFrame );
-
-  double aZValue = 0;
-  GraphicsView_ObjectListIterator anIter( theViewPort->getObjects() );
-  while( anIter.hasNext() )
-  {
-    if( HYDROGUI_PrsImage* aPrs = dynamic_cast<HYDROGUI_PrsImage*>( anIter.next() ) )
-    {
-      double aZValueRef = aPrs->zValue();
-      aZValue = qMax( aZValue, aZValueRef );
-    }
-  }
-  setZValue( aZValue + 1 );
 }
 
 //================================================================
@@ -166,7 +215,7 @@ void HYDROGUI_PrsImage::addTo( GraphicsView_ViewPort* theViewPort )
 //================================================================
 void HYDROGUI_PrsImage::removeFrom( GraphicsView_ViewPort* theViewPort )
 {
-  GraphicsView_Object::removeFrom( theViewPort );
+  HYDROGUI_Prs::removeFrom( theViewPort );
   theViewPort->removeItem( myPrsImageFrame );
 }
 
@@ -182,7 +231,7 @@ bool HYDROGUI_PrsImage::checkHighlight( double theX, double theY, QCursor& theCu
   {
     if( myIsTransformationPointPreview )
     {
-      if( myTransformationPointMode != None )
+      if( myTransformationPointType != None )
         theCursor = *getTransformationPointCursor();
     }
     else
@@ -200,16 +249,18 @@ bool HYDROGUI_PrsImage::select( double theX, double theY, const QRectF& theRect
 {
   if( myIsTransformationPointPreview )
   {
-    if( myTransformationPointMode == None || !theRect.isEmpty() )
+    if( myTransformationPointType == None || !theRect.isEmpty() )
       return false;
 
-    TransformationPoint& aTransformationPoint = myTransformationPointMap[ myTransformationPointMode ];
-    aTransformationPoint.Point = QPoint( (int)theX, (int)theY );
+    QPoint aPos = pos().toPoint();
+
+    TransformationPoint& aTransformationPoint = myTransformationPointMap[ myTransformationPointType ];
+    aTransformationPoint.Point = QPoint( (int)theX, (int)theY ) - aPos;
     computeTransformationPoints();
     return true;
   }
 
-  bool anIsSelected = GraphicsView_Object::select( theX, theY, theRect );
+  bool anIsSelected = HYDROGUI_Prs::select( theX, theY, theRect );
   myPrsImageFrame->updateVisibility();
   return anIsSelected;
 }
@@ -220,8 +271,9 @@ bool HYDROGUI_PrsImage::select( double theX, double theY, const QRectF& theRect
 //================================================================
 void HYDROGUI_PrsImage::unselect()
 {
-  GraphicsView_Object::unselect();
-  myPrsImageFrame->updateVisibility();
+  HYDROGUI_Prs::unselect();
+  if( !myIsTransformationPointPreview )
+    myPrsImageFrame->updateVisibility();
 }
 
 //================================================================
@@ -230,8 +282,9 @@ void HYDROGUI_PrsImage::unselect()
 //================================================================
 void HYDROGUI_PrsImage::setSelected( bool theState )
 {
-  GraphicsView_Object::setSelected( theState );
-  myPrsImageFrame->updateVisibility();
+  HYDROGUI_Prs::setSelected( theState );
+  if( !myIsTransformationPointPreview )
+    myPrsImageFrame->updateVisibility();
 }
 
 //================================================================
@@ -289,18 +342,46 @@ void HYDROGUI_PrsImage::computeTransformationPoints()
   }
 
   bool anIsVisible = myIsTransformationPointPreview;
+  bool anIsPointVisible;
   for( int aPointType = PointA; aPointType <= PointC; aPointType++ )
   {
+    // If image is transformed only by two points then the point C is invisible
+    anIsPointVisible = anIsVisible && ( 
+      ( !myIsByTwoPoints ) || ( myIsByTwoPoints && ( aPointType != PointC ) ) );
     TransformationPoint& aTransformationPoint = myTransformationPointMap[ aPointType ];
 
     double aRadius = 5;
     const QPointF& aPoint = aTransformationPoint.Point;
     QRectF aRect( aPoint - QPointF( aRadius, aRadius ), QSizeF( aRadius * 2 + 1, aRadius * 2 + 1 ) );
     aTransformationPoint.PointItem->setRect( aRect );
-    aTransformationPoint.PointItem->setVisible( anIsVisible );
+    aTransformationPoint.PointItem->setVisible( anIsPointVisible );
 
     QPointF aCaptionShift( -aRadius * 2, aRadius * 2 );
     aTransformationPoint.CaptionItem->setPos( aPoint + aCaptionShift );
-    aTransformationPoint.CaptionItem->setVisible( anIsVisible );
+    aTransformationPoint.CaptionItem->setVisible( anIsPointVisible );
+  }
+}
+
+//================================================================
+// Function : IsByTwoPoints
+// Purpose  : 
+//================================================================
+bool HYDROGUI_PrsImage::getIsByTwoPoints() const
+{
+  return myIsByTwoPoints;
+}
+
+//================================================================
+// Function : SetIsByTwoPoints
+// Purpose  : 
+//================================================================
+void HYDROGUI_PrsImage::setIsByTwoPoints( const bool theIsByTwoPoints )
+{
+  myIsByTwoPoints = theIsByTwoPoints;
+  if ( myTransformationPointMap.contains( PointC ) )
+  {
+    TransformationPoint& aTransformationPoint = myTransformationPointMap[ PointC ];
+    aTransformationPoint.PointItem->setVisible( myIsTransformationPointPreview && theIsByTwoPoints );
+    aTransformationPoint.CaptionItem->setVisible( myIsTransformationPointPreview && theIsByTwoPoints );
   }
 }