-// Copyright (C) 2013-2014 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2013-2019 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
#include <QRectF>
#include <QRubberBand>
#include <QScrollBar>
+#include <QPrinter>
+#include <QPainter>
#include <math.h>
myForegroundItem( 0 ),
myGridItem( 0 ),
myIsTransforming( false ),
+ myUnlimitedPanning( false ),
myHighlightedObject( 0 ),
myHighlightX( 0 ),
myHighlightY( 0 ),
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 );
QPainter::SmoothPixmapTransform |
QPainter::HighQualityAntialiasing );
+ myHBarPolicy = horizontalScrollBarPolicy();
+ myVBarPolicy = verticalScrollBarPolicy();
+
connect( myScene, SIGNAL( gsKeyEvent( QKeyEvent* ) ),
this, SLOT( onKeyEvent( QKeyEvent* ) ) );
connect( myScene, SIGNAL( gsMouseEvent( QGraphicsSceneMouseEvent* ) ),
onBoundingRectChanged();
}
+void GraphicsView_ViewPort::clearItems()
+{
+ myHighlightedObject = 0;
+ mySelectedObjects.clear();
+ myObjects.clear();
+ myScene->clear();
+ onBoundingRectChanged();
+}
+
//================================================================
// Function : getObjects
// Purpose :
return anImage;
}
+bool GraphicsView_ViewPort::dumpViewToFormat(const QString& fileName, const QString& format)
+{
+ if( format!="PS" && format!="EPS" )
+ return false;
+
+ QPrinter printer(QPrinter::ScreenResolution);
+ printer.setOutputFormat(QPrinter::PdfFormat);
+ printer.setOutputFileName(fileName);
+ QPainter painter;
+ if (!painter.begin(&printer))
+ return false;
+
+ QRect view( 0, 0, printer.pageRect().width(), printer.paperRect().height() );
+ QRectF bounds = myScene->itemsBoundingRect();
+
+ if( !view.isEmpty() && !bounds.isEmpty() )
+ {
+ float SCALE = 0.5;//qMin( view.width()/bounds.width(), view.height()/bounds.height() );
+ painter.setViewport( view );
+ painter.scale( SCALE, SCALE );
+ }
+ myScene->render( &painter, QRectF( view ), bounds );
+
+ if (!painter.end())
+ return false;
+ return true;
+}
+
//================================================================
// Function : setSceneGap
// Purpose :
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 );
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 );
}
//================================================================
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 :
return myIsSketching;
}
+//================================================================
+// Function : setDraggingSelectedByLeftButton
+// Purpose :
+//================================================================
+void GraphicsView_ViewPort::setDraggingSelectedByLeftButton( const bool& theValue )
+{
+ myDraggingSelectedByLeftButton = theValue;
+}
+
//================================================================
// Function : dragObjects
// Purpose :
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() )
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();