00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "qgsmapcanvasitem.h"
00019 #include "qgsmapcanvas.h"
00020 #include "qgsmaprenderer.h"
00021 #include "qgsmaptopixel.h"
00022 #include "qgsrendercontext.h"
00023 #include <QGraphicsScene>
00024 #include <QRect>
00025 #include <QPen>
00026 #include <QBrush>
00027 #include <QPainter>
00028 #include "qgslogger.h"
00029
00030 QgsMapCanvasItem::QgsMapCanvasItem( QgsMapCanvas* mapCanvas )
00031 : QGraphicsItem( 0, mapCanvas->scene() ), mMapCanvas( mapCanvas ),
00032 mPanningOffset( 0, 0 ), mItemSize( 0, 0 )
00033 {
00034 }
00035
00036 QgsMapCanvasItem::~QgsMapCanvasItem()
00037 {
00038 update();
00039 }
00040
00041 void QgsMapCanvasItem::paint( QPainter * painter,
00042 const QStyleOptionGraphicsItem * option,
00043 QWidget * widget )
00044 {
00045 paint( painter );
00046 }
00047
00048 QgsPoint QgsMapCanvasItem::toMapCoordinates( const QPoint& point )
00049 {
00050 return mMapCanvas->getCoordinateTransform()->toMapCoordinates( point - mPanningOffset );
00051 }
00052
00053
00054 QPointF QgsMapCanvasItem::toCanvasCoordinates( const QgsPoint& point )
00055 {
00056 double x = point.x(), y = point.y();
00057 mMapCanvas->getCoordinateTransform()->transformInPlace( x, y );
00058 return QPointF( x, y ) + mPanningOffset;
00059 }
00060
00061
00062 QgsRectangle QgsMapCanvasItem::rect() const
00063 {
00064 return mRect;
00065 }
00066
00067
00068 void QgsMapCanvasItem::setRect( const QgsRectangle& rect )
00069 {
00070 mRect = rect;
00071
00072
00073 QRectF r;
00074 if ( !mRect.isEmpty() )
00075 {
00076 r.setTopLeft( toCanvasCoordinates( QgsPoint( mRect.xMinimum(), mRect.yMinimum() ) ) );
00077 r.setBottomRight( toCanvasCoordinates( QgsPoint( mRect.xMaximum(), mRect.yMaximum() ) ) );
00078 r = r.normalized();
00079 }
00080
00081
00082 prepareGeometryChange();
00083 setPos( r.topLeft() );
00084 mItemSize = QSizeF( r.width() + 2, r.height() + 2 );
00085
00086
00087
00088 update();
00089 }
00090
00091 QRectF QgsMapCanvasItem::boundingRect() const
00092 {
00093 return QRectF( QPointF( -1, -1 ), mItemSize );
00094 }
00095
00096
00097 void QgsMapCanvasItem::updateCanvas()
00098 {
00099 update();
00100
00101
00102 }
00103
00104 bool QgsMapCanvasItem::setRenderContextVariables( QPainter* p, QgsRenderContext& context ) const
00105 {
00106 if ( !mMapCanvas || !p )
00107 {
00108 return false;
00109 }
00110 QgsMapRenderer* mapRenderer = mMapCanvas->mapRenderer();
00111 if ( !mapRenderer )
00112 {
00113 return false;
00114 }
00115
00116 context.setPainter( p );
00117 context.setRendererScale( mMapCanvas->scale() );
00118
00119 int dpi = mapRenderer->outputDpi();
00120 int painterDpi = p->device()->logicalDpiX();
00121 double scaleFactor = 1.0;
00122 double rasterScaleFactor = 1.0;
00123
00124
00125 if ( data( 0 ).toString() == "composer" )
00126 {
00127 rasterScaleFactor = painterDpi / 25.4;
00128 scaleFactor = dpi / 25.4;
00129 }
00130 else
00131 {
00132 if ( mapRenderer->outputUnits() == QgsMapRenderer::Millimeters )
00133 {
00134 scaleFactor = dpi / 25.4;
00135 }
00136 }
00137 context.setScaleFactor( scaleFactor );
00138 context.setRasterScaleFactor( rasterScaleFactor );
00139 return true;
00140 }
00141
00142 void QgsMapCanvasItem::updatePosition()
00143 {
00144
00145 setRect( mRect );
00146 }
00147
00148
00149 void QgsMapCanvasItem::setPanningOffset( const QPoint& point )
00150 {
00151 mPanningOffset = point;
00152 }