00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "qgsmapcanvas.h"
00021 #include "qgsmaprenderer.h"
00022 #include "qgsmapoverviewcanvas.h"
00023 #include "qgsmaptopixel.h"
00024
00025 #include <QPainter>
00026 #include <QPaintEvent>
00027 #include <QResizeEvent>
00028 #include <QMouseEvent>
00029 #include "qgslogger.h"
00030 #include <limits.h>
00031
00033 class QgsPanningWidget : public QWidget
00034 {
00035 public:
00036 QgsPanningWidget( QWidget* parent )
00037 : QWidget( parent )
00038 {
00039 setObjectName( "panningWidget" );
00040 setMinimumSize( 5, 5 );
00041 setAttribute( Qt::WA_NoSystemBackground );
00042 }
00043
00044 void resizeEvent( QResizeEvent* r )
00045 {
00046 QSize s = r->size();
00047 QRegion reg( 0, 0, s.width(), s.height() );
00048 QRegion reg2( 2, 2, s.width() - 4, s.height() - 4 );
00049 QRegion reg3 = reg.subtract( reg2 );
00050 setMask( reg3 );
00051 }
00052
00053
00054 void paintEvent( QPaintEvent* pe )
00055 {
00056 QRect r( QPoint( 0, 0 ), size() );
00057 QPainter p;
00058 p.begin( this );
00059 p.setPen( Qt::red );
00060 p.setBrush( Qt::red );
00061 p.drawRect( r );
00062 p.end();
00063 }
00064
00065 };
00066
00067
00068
00069 QgsMapOverviewCanvas::QgsMapOverviewCanvas( QWidget * parent, QgsMapCanvas* mapCanvas )
00070 : QWidget( parent ), mMapCanvas( mapCanvas )
00071 {
00072 setObjectName( "theOverviewCanvas" );
00073 mPanningWidget = new QgsPanningWidget( this );
00074
00075 mMapRenderer = new QgsMapRenderer;
00076 mMapRenderer->enableOverviewMode();
00077
00078 setBackgroundColor( palette().window().color() );
00079 }
00080
00081 QgsMapOverviewCanvas::~QgsMapOverviewCanvas()
00082 {
00083 delete mMapRenderer;
00084 }
00085
00086 void QgsMapOverviewCanvas::resizeEvent( QResizeEvent* e )
00087 {
00088 mPixmap = QPixmap( e->size() );
00089 mMapRenderer->setOutputSize( e->size(), mPixmap.logicalDpiX() );
00090 refresh();
00091 }
00092
00093
00094 void QgsMapOverviewCanvas::drawExtentRect()
00095 {
00096 const QgsRectangle& extent = mMapCanvas->extent();
00097
00098
00099 if ( extent.isEmpty() )
00100 {
00101 mPanningWidget->hide();
00102 return;
00103 }
00104
00105 const QgsMapToPixel* cXf = mMapRenderer->coordinateTransform();
00106 QgsPoint ll( extent.xMinimum(), extent.yMinimum() );
00107 QgsPoint ur( extent.xMaximum(), extent.yMaximum() );
00108 if ( cXf )
00109 {
00110
00111 cXf->transform( &ll );
00112 cXf->transform( &ur );
00113 }
00114
00115 #if 0
00116
00117 bool show = false;
00118 if ( ur.x() >= 0 && ur.x() < width() ) show = true;
00119 if ( ll.x() >= 0 && ll.x() < width() ) show = true;
00120 if ( ur.y() >= 0 && ur.y() < height() ) show = true;
00121 if ( ll.y() >= 0 && ll.y() < height() ) show = true;
00122 if ( !show )
00123 {
00124 QgsDebugMsg( "panning: extent out of overview area" );
00125 mPanningWidget->hide();
00126 return;
00127 }
00128 #endif
00129
00130
00131 int x1 = static_cast<int>( ur.x() + 0.5 ), x2 = static_cast<int>( ll.x() + 0.5 );
00132 int y1 = static_cast<int>( ur.y() + 0.5 ), y2 = static_cast<int>( ll.y() + 0.5 );
00133
00134 if ( x1 > x2 )
00135 std::swap( x1, x2 );
00136 if ( y1 > y2 )
00137 std::swap( y1, y2 );
00138
00139 #ifdef Q_WS_MAC
00140
00141
00142
00143
00144 if ( x1 == INT_MIN && x2 == INT_MAX ) x1 += 1;
00145 if ( y1 == INT_MIN && y2 == INT_MAX ) y1 += 1;
00146 #endif
00147
00148 QRect r( x1, y1, x2 - x1 + 1, y2 - y1 + 1 );
00149
00150
00151 if ( r.width() < 5 && x1 > INT_MIN + 2 )
00152 {
00153 r.setX( r.x() - (( 5 - r.width() ) / 2 ) );
00154 r.setWidth( 5 );
00155 }
00156 if ( r.height() < 5 && y1 > INT_MIN + 2 )
00157 {
00158 r.setY( r.y() - (( 5 - r.height() ) / 2 ) );
00159 r.setHeight( 5 );
00160 }
00161
00162 QgsDebugMsg( QString( "panning: extent to widget: [%1,%2] [%3x%4]" ).arg( x1 ).arg( y1 ).arg( r.width() ).arg( r.height() ) );
00163
00164 mPanningWidget->setGeometry( r );
00165 mPanningWidget->show();
00166 }
00167
00168
00169 void QgsMapOverviewCanvas::mousePressEvent( QMouseEvent * e )
00170 {
00171
00172
00173
00174
00175
00176 if ( mPanningWidget->geometry().contains( e->pos() ) )
00177 {
00178 mPanningCursorOffset = e->pos() - mPanningWidget->pos();
00179 }
00180 else
00181 {
00182
00183 QSize s = mPanningWidget->size();
00184 mPanningCursorOffset = QPoint( s.width() / 2, s.height() / 2 );
00185 }
00186 updatePanningWidget( e->pos() );
00187 }
00188
00189
00190 void QgsMapOverviewCanvas::mouseReleaseEvent( QMouseEvent * e )
00191 {
00192
00193
00194
00195 if ( e->button() == Qt::LeftButton )
00196 {
00197
00198 const QgsMapToPixel* cXf = mMapRenderer->coordinateTransform();
00199 QRect rect = mPanningWidget->geometry();
00200
00201 QgsPoint center = cXf->toMapCoordinates( rect.center() );
00202 QgsRectangle oldExtent = mMapCanvas->extent();
00203 QgsRectangle ext;
00204 ext.setXMinimum( center.x() - oldExtent.width() / 2 );
00205 ext.setXMaximum( center.x() + oldExtent.width() / 2 );
00206 ext.setYMinimum( center.y() - oldExtent.height() / 2 );
00207 ext.setYMaximum( center.y() + oldExtent.height() / 2 );
00208
00209 QgsDebugMsg( QString( "panning: new position: [%1,%2] [%3x%4]" ).arg( rect.left() ).arg( rect.top() ).arg( rect.width() ).arg( rect.height() ) );
00210
00211 mMapCanvas->setExtent( ext );
00212 mMapCanvas->refresh();
00213 }
00214 }
00215
00216
00217 void QgsMapOverviewCanvas::mouseMoveEvent( QMouseEvent * e )
00218 {
00219
00220 if (( e->buttons() & Qt::LeftButton ) == Qt::LeftButton )
00221 {
00222 updatePanningWidget( e->pos() );
00223 }
00224 }
00225
00226
00227 void QgsMapOverviewCanvas::updatePanningWidget( const QPoint& pos )
00228 {
00229
00230
00231 QSize size = mPanningWidget->size();
00232 mPanningWidget->move( pos.x() - mPanningCursorOffset.x(), pos.y() - mPanningCursorOffset.y() );
00233 }
00234
00235
00236 void QgsMapOverviewCanvas::paintEvent( QPaintEvent * pe )
00237 {
00238 QPainter paint( this );
00239 paint.drawPixmap( pe->rect().topLeft(), mPixmap, pe->rect() );
00240 }
00241
00242
00243 void QgsMapOverviewCanvas::refresh()
00244 {
00245 if ( mPixmap.isNull() )
00246 return;
00247
00248 mPixmap.fill( mBgColor );
00249
00250 QPainter painter;
00251 painter.begin( &mPixmap );
00252
00253
00254 if ( mAntiAliasing )
00255 painter.setRenderHint( QPainter::Antialiasing );
00256
00257
00258 mMapRenderer->render( &painter );
00259
00260 painter.end();
00261
00262
00263 update();
00264
00265
00266 drawExtentRect();
00267 }
00268
00269
00270 void QgsMapOverviewCanvas::setBackgroundColor( const QColor& color )
00271 {
00272 mBgColor = color;
00273
00274
00275 QPalette palette;
00276 palette.setColor( backgroundRole(), color );
00277 setPalette( palette );
00278 }
00279
00280 void QgsMapOverviewCanvas::setLayerSet( const QStringList& layerSet )
00281 {
00282 mMapRenderer->setLayerSet( layerSet );
00283 }
00284
00285 void QgsMapOverviewCanvas::updateFullExtent( const QgsRectangle& rect )
00286 {
00287 mMapRenderer->setExtent( rect );
00288 drawExtentRect();
00289 }
00290
00291 void QgsMapOverviewCanvas::hasCrsTransformEnabled( bool flag )
00292 {
00293 mMapRenderer->setProjectionsEnabled( flag );
00294 }
00295
00296 void QgsMapOverviewCanvas::destinationSrsChanged()
00297 {
00298 const QgsCoordinateReferenceSystem& srs = mMapCanvas->mapRenderer()->destinationSrs();
00299 mMapRenderer->setDestinationSrs( srs );
00300 }
00301
00302 QStringList& QgsMapOverviewCanvas::layerSet()
00303 {
00304 return mMapRenderer->layerSet();
00305 }