Salome HOME
Merge branch 'master' of https://git.salome-platform.org/git/modules/hydro
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_PrsImage.cxx
index 4c749d571e9cb3645bfb4564cda42d0be0784e51..a146d2546623de999c861b0680b62181e5f2fd8b 100644 (file)
@@ -1,12 +1,8 @@
-// Copyright (C) 2007-2013  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
-//
+// Copyright (C) 2014-2015  EDF-R&D
 // 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
 #include <GraphicsView_ViewPort.h>
 
 #include <QCursor>
+#include <QApplication>
 
 //=======================================================================
 // 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 )
+  myIsByTwoPoints( true ),
+  myTransformationPointType( None )
 {
   myTransformationPointCursor = new QCursor( Qt::CrossCursor );
 }
@@ -59,9 +58,13 @@ HYDROGUI_PrsImage::~HYDROGUI_PrsImage()
 // Function : setImage
 // Purpose  : 
 //================================================================
-void HYDROGUI_PrsImage::setImage( const QImage& theImage )
+void HYDROGUI_PrsImage::setImage( const QImage& theImage, const bool theCompute )
 {
   myImage = theImage;
+  if ( theCompute ) {
+    compute();
+    computeTransformationPoints( true );
+  }
 }
 
 //================================================================
@@ -73,6 +76,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  : 
@@ -92,13 +119,13 @@ bool HYDROGUI_PrsImage::getIsTransformationPointPreview() const
 }
 
 //================================================================
-// Function : setTransformationPointMode
+// Function : setTransformationPointType
 // Purpose  : 
 //================================================================
-void HYDROGUI_PrsImage::setTransformationPointMode( const int theMode )
+void HYDROGUI_PrsImage::setTransformationPointType( const int thePointType )
 {
-  myTransformationPointMode = theMode;
-  if( theMode != None )
+  myTransformationPointType = thePointType;
+  if( thePointType != None )
     computeTransformationPoints();
 }
 
@@ -113,6 +140,33 @@ void HYDROGUI_PrsImage::setTransformationPointMap( const TransformationPointMap&
     computeTransformationPoints();
 }
 
+//================================================================
+// Function : updateTransformationPoint
+// Purpose  : 
+//================================================================
+void HYDROGUI_PrsImage::updateTransformationPoint( const int thePointType,
+                                                   const bool theIsY,
+                                                   const int theValue )
+{
+  if( myTransformationPointMap.find( thePointType ) != myTransformationPointMap.end() )
+  {
+    TransformationPoint& aTransformationPoint = myTransformationPointMap[ thePointType ];
+    QPoint& aPoint = aTransformationPoint.Point;
+    theIsY ? aPoint.setY( theValue ) : aPoint.setX( theValue );
+    computeTransformationPoints();
+  }
+}
+
+//================================================================
+// Function : setTransformationPointCursorShape
+// Purpose  : 
+//================================================================
+void HYDROGUI_PrsImage::setTransformationPointCursorShape(Qt::CursorShape theCursorShape)
+{
+  if ( myTransformationPointCursor )
+    myTransformationPointCursor->setShape(theCursorShape);
+}
+
 //================================================================
 // Function : boundingRect
 // Purpose  : 
@@ -133,12 +187,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();
 }
 
@@ -174,7 +243,7 @@ bool HYDROGUI_PrsImage::checkHighlight( double theX, double theY, QCursor& theCu
   {
     if( myIsTransformationPointPreview )
     {
-      if( myTransformationPointMode != None )
+      if( myTransformationPointType != None )
         theCursor = *getTransformationPointCursor();
     }
     else
@@ -192,11 +261,13 @@ 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;
   }
@@ -232,69 +303,129 @@ void HYDROGUI_PrsImage::setSelected( bool theState )
 // Function : computeTransformationPoints
 // Purpose  : 
 //================================================================
-void HYDROGUI_PrsImage::computeTransformationPoints()
+void HYDROGUI_PrsImage::computeTransformationPoints( const bool theObligatoryInit )
 {
-  if( myTransformationPointMap.isEmpty() )
   {
-    int aWidth = myImage.width();
-    int aHeight = myImage.height();
-
     for( int aPointType = PointA; aPointType <= PointC; aPointType++ )
     {
-      TransformationPoint aTransformationPoint;
-
-      QPoint aPoint;
-      QString aCaption;
-      QColor aColor = Qt::black;
-      switch( aPointType )
-      {
-        case PointA:
-          aPoint = QPoint( 0, 0 );
-          aCaption = "A";
-          aColor = Qt::darkRed;
-          break;
-        case PointB:
-          aPoint = QPoint( aWidth, 0 );
-          aCaption = "B";
-          aColor = Qt::darkGreen;
-          break;
-        case PointC:
-          aPoint = QPoint( 0, aHeight );
-          aCaption = "C";
-          aColor = Qt::darkBlue;
-          break;
-      }
-
-      aTransformationPoint.Point = aPoint;
-      aTransformationPoint.Caption = aCaption;
-
-      aTransformationPoint.PointItem = new QGraphicsEllipseItem( this );
-      aTransformationPoint.PointItem->setVisible( false );
-      aTransformationPoint.PointItem->setPen( QPen( aColor ) );
-      aTransformationPoint.PointItem->setBrush( QBrush( aColor ) );
-
-      aTransformationPoint.CaptionItem = new QGraphicsSimpleTextItem( aCaption, this );
-      aTransformationPoint.CaptionItem->setVisible( false );
-      aTransformationPoint.CaptionItem->setPen( QPen( aColor ) );
-      aTransformationPoint.CaptionItem->setBrush( QBrush( aColor ) );
-
-      myTransformationPointMap[ aPointType ] = aTransformationPoint;
+      if( myTransformationPointMap.isEmpty() || theObligatoryInit )
+        initTrsfPoints( aPointType );
+      // Show/hide the point if necessary
+      updateTrsfPoint( aPointType );
+
     }
   }
+}
 
-  bool anIsVisible = myIsTransformationPointPreview;
-  for( int aPointType = PointA; aPointType <= PointC; aPointType++ )
+QGraphicsItemGroup* HYDROGUI_PrsImage::createPointItem( const QString& theCaption,
+                                                        const QColor& theColor )
+{
+  QGraphicsEllipseItem* aPointItem = new QGraphicsEllipseItem( this );
+  aPointItem->setPen( QPen( theColor ) );
+  aPointItem->setBrush( QBrush( theColor ) );
+
+  double aRadius = 3;
+  QRectF aRect( -QPointF( aRadius, aRadius ), QSizeF( aRadius * 2 + 1, aRadius * 2 + 1 ) );
+  aPointItem->setRect( aRect );
+  aPointItem->setPos( QPointF( 0, 0 ) );
+
+  QGraphicsSimpleTextItem* aCaptionItem = aCaptionItem = new QGraphicsSimpleTextItem( theCaption, this );
+  aCaptionItem->setPen( QPen( theColor ) );
+  aCaptionItem->setBrush( QBrush( theColor ) );
+  QFont aFont = aCaptionItem->font();
+  aFont.setPointSize( qApp->font().pointSize() );
+  aCaptionItem->setFont( aFont );
+  aCaptionItem->setPos( QPointF( -aRadius * 2, aRadius * 2 ) );
+
+  QGraphicsItemGroup* aGroupItem = new QGraphicsItemGroup( this );
+  aGroupItem->addToGroup( aPointItem );
+  aGroupItem->addToGroup( aCaptionItem );
+  aGroupItem->setVisible( false );
+  aGroupItem->setFlag( QGraphicsItem::ItemIgnoresTransformations );
+
+  return aGroupItem;
+}
+
+//================================================================
+// Function : initTrsfPoints
+// Purpose  : 
+//================================================================
+void HYDROGUI_PrsImage::initTrsfPoints( const int thePointType )
+{
+  QPoint aPoint;
+  QString aCaption;
+  QColor aColor = Qt::black;
+
+  int aWidth = myImage.width();
+  int aHeight = myImage.height();
+  switch( thePointType )
   {
-    TransformationPoint& aTransformationPoint = myTransformationPointMap[ aPointType ];
+    case PointA:
+      aPoint = QPoint( 0, 0 );
+      aCaption = "A";
+      aColor = Qt::darkRed;
+      break;
+    case PointB:
+      aPoint = QPoint( aWidth, 0 );
+      aCaption = "B";
+      aColor = Qt::darkGreen;
+      break;
+    case PointC:
+      aPoint = QPoint( 0, aHeight );
+      aCaption = "C";
+      aColor = Qt::darkBlue;
+      break;
+  }
 
-    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 );
+  TransformationPoint aTransformationPoint;
+  if ( myTransformationPointMap.contains( thePointType ) )
+    aTransformationPoint = myTransformationPointMap[thePointType];
 
-    QPointF aCaptionShift( -aRadius * 2, aRadius * 2 );
-    aTransformationPoint.CaptionItem->setPos( aPoint + aCaptionShift );
-    aTransformationPoint.CaptionItem->setVisible( anIsVisible );
+  aTransformationPoint.Point = aPoint;
+  aTransformationPoint.Caption = aCaption;
+  if ( !aTransformationPoint.GroupItem )
+    aTransformationPoint.GroupItem = createPointItem( aCaption, aColor );
+  aTransformationPoint.GroupItem->setPos( aPoint );
+
+  myTransformationPointMap[ thePointType ] = aTransformationPoint;
+}
+
+//================================================================
+// Function : updateTrsfPoint
+// Purpose  : 
+//================================================================
+void HYDROGUI_PrsImage::updateTrsfPoint( const int thePointType )
+{
+  // If image is transformed only by two points then the point C is invisible
+  bool anIsPointVisible = myIsTransformationPointPreview && ( 
+    ( !myIsByTwoPoints ) || ( myIsByTwoPoints && ( thePointType != PointC ) ) );
+
+  TransformationPoint& aTransformationPoint = myTransformationPointMap[ thePointType ];
+
+  const QPointF& aPoint = aTransformationPoint.Point;
+  aTransformationPoint.GroupItem->setPos( aPoint );
+  aTransformationPoint.GroupItem->setVisible( anIsPointVisible );
+}
+
+//================================================================
+// Function : getIsByTwoPoints
+// Purpose  : 
+//================================================================
+bool HYDROGUI_PrsImage::getIsByTwoPoints() const
+{
+  return myIsByTwoPoints;
+}
+
+//================================================================
+// Function : setIsByTwoPoints
+// Purpose  : 
+//================================================================
+void HYDROGUI_PrsImage::setIsByTwoPoints( const bool theIsByTwoPoints )
+{
+  myIsByTwoPoints = theIsByTwoPoints;
+  if ( myTransformationPointMap.contains( PointC ) )
+  {
+    // Show/hide the point C if necessary
+    updateTrsfPoint( PointC );
   }
 }