Salome HOME
updated copyright message
[modules/gui.git] / src / GraphicsView / GraphicsView_ViewPort.cxx
index 627a30cddbc796f981fafd5eaa0260bc5e31f44e..2d0cbc40c56871d6854f3ff3a1d947d0d391cade 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2013-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2013-2023  CEA, EDF, OPEN CASCADE
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -134,6 +134,7 @@ GraphicsView_ViewPort::GraphicsView_ViewPort( QWidget* theParent )
   myForegroundItem( 0 ),
   myGridItem( 0 ),
   myIsTransforming( false ),
+  myUnlimitedPanning( false ),
   myHighlightedObject( 0 ),
   myHighlightX( 0 ),
   myHighlightY( 0 ),
@@ -147,9 +148,11 @@ GraphicsView_ViewPort::GraphicsView_ViewPort( QWidget* theParent )
   myIsSketchingByPath( false ),
   myIsDragging( false ),
   myIsDragPositionInitialized( false ),
+  myDraggingSelectedByLeftButton( false ),
   myIsPulling( false ),
   myPullingObject( 0 ),
-  myStoredCursor( Qt::ArrowCursor )
+  myStoredCursor( Qt::ArrowCursor ),
+  myZoomCoeff( 100 )
 {
   // scene
   myScene = new GraphicsView_Scene( this );
@@ -193,6 +196,9 @@ GraphicsView_ViewPort::GraphicsView_ViewPort( QWidget* theParent )
                   QPainter::SmoothPixmapTransform |
                   QPainter::HighQualityAntialiasing );
 
+  myHBarPolicy = horizontalScrollBarPolicy();
+  myVBarPolicy = verticalScrollBarPolicy();
+
   connect( myScene, SIGNAL( gsKeyEvent( QKeyEvent* ) ),
            this, SLOT( onKeyEvent( QKeyEvent* ) ) );
   connect( myScene, SIGNAL( gsMouseEvent( QGraphicsSceneMouseEvent* ) ),
@@ -279,7 +285,7 @@ void GraphicsView_ViewPort::addItem( QGraphicsItem* theItem )
 //================================================================
 bool GraphicsView_ViewPort::isItemAdded( QGraphicsItem* theItem )
 {
-  if( GraphicsView_Object* anObject = dynamic_cast<GraphicsView_Object*>( theItem ) )
+  if( dynamic_cast<GraphicsView_Object*>( theItem ) )
   {
     for( GraphicsView_ObjectList::iterator anIter = myObjects.begin(); anIter != myObjects.end(); anIter++ )
       if( theItem == *anIter )
@@ -468,10 +474,13 @@ QImage GraphicsView_ViewPort::dumpView( bool theWholeScene,
   return anImage;
 }
 
-bool GraphicsView_ViewPort::dumpViewToPSFormat(const QString& fileName)
+bool GraphicsView_ViewPort::dumpViewToFormat(const QString& fileName, const QString& format)
 {
+  if( format!="PS" && format!="EPS" )
+    return false;
+
   QPrinter printer(QPrinter::ScreenResolution);
-  printer.setOutputFormat(QPrinter::PostScriptFormat);
+  printer.setOutputFormat(QPrinter::PdfFormat);
   printer.setOutputFileName(fileName);
   QPainter painter;  
   if (!painter.begin(&printer))
@@ -841,9 +850,29 @@ void GraphicsView_ViewPort::pan( double theDX, double theDY )
     myViewLabel->setAcceptMoveEvents( false );
 
   if( QScrollBar* aHBar = horizontalScrollBar() )
+  {
+    if( isUnlimitedPanning() )
+    {
+      int aNewValue = aHBar->value() - theDX;
+      if( aNewValue < aHBar->minimum() )
+        aHBar->setMinimum( aNewValue );
+      if( aNewValue > aHBar->maximum() )
+        aHBar->setMaximum( aNewValue );
+    }
     aHBar->setValue( aHBar->value() - theDX );
+  }
   if( QScrollBar* aVBar = verticalScrollBar() )
+  {
+    if( isUnlimitedPanning() )
+    {
+      int aNewValue = aVBar->value() + theDY;
+      if( aNewValue < aVBar->minimum() )
+        aVBar->setMinimum( aNewValue );
+      if( aNewValue > aVBar->maximum() )
+        aVBar->setMaximum( aNewValue );
+    }
     aVBar->setValue( aVBar->value() + theDY );
+  }
 
   if( myViewLabel )
     myViewLabel->setAcceptMoveEvents( true );
@@ -886,14 +915,21 @@ void GraphicsView_ViewPort::zoom( double theX1, double theY1, double theX2, doub
   aTransform.scale( aZoom, aZoom );
   double aM11 = aTransform.m11();
   double aM22 = aTransform.m22();
+
+
+  QGraphicsView::ViewportAnchor old_anchor = transformationAnchor();
+  setTransformationAnchor( QGraphicsView::AnchorUnderMouse );
+
   // increasing of diagonal coefficients (>300) leads to a crash sometimes
   // at the values of 100 some primitives are drawn incorrectly
-  if( qMax( aM11, aM22 ) < 100 )
+  if( myZoomCoeff < 0 || qMax( aM11, aM22 ) < myZoomCoeff )
     setTransform( aTransform );
 
   myIsTransforming = false;
 
   applyTransform();
+
+  setTransformationAnchor( old_anchor );
 }
 
 //================================================================
@@ -1002,6 +1038,41 @@ void GraphicsView_ViewPort::applyTransform()
       anObject->setViewTransform( transform() );
 }
 
+//================================================================
+// Function : setZoomCoeff
+// Purpose  : 
+//================================================================
+void GraphicsView_ViewPort::setZoomCoeff( const int& theZoomCoeff )
+{
+  myZoomCoeff = theZoomCoeff;
+}
+
+//================================================================
+// Function : setUnlimitedPanning
+// Purpose  : 
+//================================================================
+void GraphicsView_ViewPort::setUnlimitedPanning( const bool& theValue )
+{
+  if ( myUnlimitedPanning == theValue )
+    return;
+
+  myUnlimitedPanning = theValue;
+
+  if( myUnlimitedPanning )
+  {
+    myHBarPolicy = horizontalScrollBarPolicy();
+    myVBarPolicy = verticalScrollBarPolicy();
+
+    setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
+    setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
+  }
+  else
+  {
+    setHorizontalScrollBarPolicy( myHBarPolicy );
+    setVerticalScrollBarPolicy( myVBarPolicy );
+  }
+}
+
 //================================================================
 // Function : currentBlock
 // Purpose  : 
@@ -1033,7 +1104,6 @@ void GraphicsView_ViewPort::highlight( double theX, double theY )
   bool anIsHighlighted = false;
   bool anIsOnObject = false;
 
-  GraphicsView_Object* aPreviousHighlightedObject = myHighlightedObject;
   GraphicsView_Object* aHighlightedObject = 0;
 
   QCursor aCursor;
@@ -1184,7 +1254,6 @@ int GraphicsView_ViewPort::select( const QRectF& theRect, bool theIsAppend )
   {
     aStatus = GVSS_NoChanged;
 
-    bool updateAll = false;
     if( !theIsAppend )
     {
       if( !mySelectedObjects.isEmpty() )
@@ -1498,6 +1567,15 @@ bool GraphicsView_ViewPort::isSketching( bool* theIsPath ) const
   return myIsSketching;
 }
 
+//================================================================
+// Function : setDraggingSelectedByLeftButton
+// Purpose  : 
+//================================================================
+void GraphicsView_ViewPort::setDraggingSelectedByLeftButton( const bool& theValue )
+{
+  myDraggingSelectedByLeftButton = theValue;
+}
+
 //================================================================
 // Function : dragObjects
 // Purpose  : 
@@ -1525,8 +1603,9 @@ void GraphicsView_ViewPort::dragObjects( QGraphicsSceneMouseEvent* e )
     else
       anObjectsToMove.append( anObject );
   }
-  else if( hasInteractionFlag( DraggingByMiddleButton ) &&
-           nbSelected() && ( e->buttons() & Qt::MidButton ) )
+  else if( ( ( hasInteractionFlag( DraggingByMiddleButton ) && ( e->buttons() & Qt::MidButton ) ) ||
+             ( isDraggingSelectedByLeftButton() && ( e->buttons() & Qt::LeftButton ) ) ) &&
+           nbSelected() )
   {
     for( initSelected(); moreSelected(); nextSelected() )
       if( GraphicsView_Object* aMovingObject = selectedObject() )
@@ -1721,8 +1800,9 @@ void GraphicsView_ViewPort::onMouseEvent( QGraphicsSceneMouseEvent* e )
         if( ( getHighlightedObject() &&
               getHighlightedObject()->isMovable() &&
               !( anAccel || e->button() != Qt::LeftButton ) ) ||
-            ( hasInteractionFlag( DraggingByMiddleButton ) &&
-              nbSelected() && !anAccel && e->button() == Qt::MidButton ) )
+            ( ( ( hasInteractionFlag( DraggingByMiddleButton ) && e->button() == Qt::MidButton ) ||
+                ( isDraggingSelectedByLeftButton() && e->button() == Qt::LeftButton ) ) &&
+              nbSelected() && !anAccel ) )
         {
           myIsDragging = true;
           myStoredCursor = cursor();