26
26
#include <QPaintEvent>
27
27
#include <QResizeEvent>
28
28
#include <QMouseEvent>
29
#include "qgslogger.h"
30
32
//! widget that serves as rectangle showing current extent in overview
31
33
class QgsPanningWidget : public QWidget
34
QgsPanningWidget(QWidget* parent)
35
: QWidget(parent, "panningWidget")
38
setBackgroundMode(Qt::NoBackground);
41
void resizeEvent(QResizeEvent* r)
44
QRegion reg(0,0, s.width(), s.height());
45
QRegion reg2(2,2, s.width()-4, s.height()-4);
46
QRegion reg3 = reg.subtract(reg2);
51
void paintEvent(QPaintEvent* pe)
53
QRect r(QPoint(0,0), size());
36
QgsPanningWidget( QWidget* parent )
39
setObjectName( "panningWidget" );
40
setMinimumSize( 5, 5 );
41
setAttribute( Qt::WA_NoSystemBackground );
44
void resizeEvent( QResizeEvent* r )
47
QRegion reg( 0, 0, s.width(), s.height() );
48
QRegion reg2( 2, 2, s.width() - 4, s.height() - 4 );
49
QRegion reg3 = reg.subtract( reg2 );
54
void paintEvent( QPaintEvent* pe )
56
QRect r( QPoint( 0, 0 ), size() );
60
p.setBrush( Qt::red );
66
QgsMapOverviewCanvas::QgsMapOverviewCanvas(QWidget * parent, QgsMapCanvas* mapCanvas)
67
: QWidget(parent), mMapCanvas(mapCanvas)
69
QgsMapOverviewCanvas::QgsMapOverviewCanvas( QWidget * parent, QgsMapCanvas* mapCanvas )
70
: QWidget( parent ), mMapCanvas( mapCanvas )
69
setObjectName("theOverviewCanvas");
70
mPanningWidget = new QgsPanningWidget(this);
72
mMapRender = new QgsMapRender;
73
mMapRender->setOverview();
75
setbgColor(palette().window().color());
72
setObjectName( "theOverviewCanvas" );
73
mPanningWidget = new QgsPanningWidget( this );
75
mMapRenderer = new QgsMapRenderer;
76
mMapRenderer->enableOverviewMode();
78
setBackgroundColor( palette().window().color() );
78
81
QgsMapOverviewCanvas::~QgsMapOverviewCanvas()
83
void QgsMapOverviewCanvas::resizeEvent(QResizeEvent* e)
86
void QgsMapOverviewCanvas::resizeEvent( QResizeEvent* e )
85
mPixmap = QPixmap(e->size());
86
mMapRender->setOutputSize(e->size(), mPixmap.logicalDpiX());
88
mPixmap = QPixmap( e->size() );
89
mMapRenderer->setOutputSize( e->size(), mPixmap.logicalDpiX() );
91
void QgsMapOverviewCanvas::reflectChangedExtent()
94
void QgsMapOverviewCanvas::drawExtentRect()
93
const QgsRect& extent = mMapCanvas->extent();
96
const QgsRectangle& extent = mMapCanvas->extent();
95
98
// show only when valid extent is set
99
if ( extent.isEmpty() )
99
std::cout << "panning: empty extent" << std::endl;
101
101
mPanningWidget->hide();
105
QgsMapToPixel* cXf = mMapRender->coordXForm();
106
QgsPoint ll(extent.xMin(), extent.yMin());
107
QgsPoint ur(extent.xMax(), extent.yMax());
105
const QgsMapToPixel* cXf = mMapRenderer->coordinateTransform();
106
QgsPoint ll( extent.xMinimum(), extent.yMinimum() );
107
QgsPoint ur( extent.xMaximum(), extent.yMaximum() );
110
110
// transform the points before drawing
111
cXf->transform( &ll );
112
cXf->transform( &ur );
115
// test whether panning widget should be drawn
116
// test whether panning widget should be drawn
116
117
bool show = false;
117
if (ur.x() >= 0 && ur.x() < width()) show = true;
118
if (ll.x() >= 0 && ll.x() < width()) show = true;
119
if (ur.y() >= 0 && ur.y() < height()) show = true;
120
if (ll.y() >= 0 && ll.y() < height()) show = true;
118
if ( ur.x() >= 0 && ur.x() < width() ) show = true;
119
if ( ll.x() >= 0 && ll.x() < width() ) show = true;
120
if ( ur.y() >= 0 && ur.y() < height() ) show = true;
121
if ( ll.y() >= 0 && ll.y() < height() ) show = true;
124
std::cout << "panning: extent out of overview area" << std::endl;
124
QgsDebugMsg( "panning: extent out of overview area" );
126
125
mPanningWidget->hide();
131
int x1 = static_cast<int>(ur.x()+0.5), x2 = static_cast<int>(ll.x()+0.5);
132
int y1 = static_cast<int>(ur.y()+0.5), y2 = static_cast<int>(ll.y()+0.5);
131
int x1 = static_cast<int>( ur.x() + 0.5 ), x2 = static_cast<int>( ll.x() + 0.5 );
132
int y1 = static_cast<int>( ur.y() + 0.5 ), y2 = static_cast<int>( ll.y() + 0.5 );
140
140
// setGeometry (Qt 4.2) is causing Mac window corruption (decorations
141
141
// are drawn at odd locations) if both coords are at limit. This may
142
142
// have something to do with Qt calculating dimensions as x2 - x1 + 1.
143
143
// (INT_MAX - INT_MIN + 1 is UINT_MAX + 1)
144
if (x1 == INT_MIN && x2 == INT_MAX) x1 += 1; // x2 -= 1 works too
145
if (y1 == INT_MIN && y2 == INT_MAX) y1 += 1;
148
QRect r(x1, y1, x2-x1+1, y2-y1+1);
151
std::cout << "panning: extent to widget: [" << x1 << "," << y1 <<
152
"] [" << r.width() << "x" << r.height() << "]" << std::endl;
155
mPanningWidget->setGeometry(r);
156
mPanningWidget->show(); // show if hidden
144
if ( x1 == INT_MIN && x2 == INT_MAX ) x1 += 1; // x2 -= 1 works too
145
if ( y1 == INT_MIN && y2 == INT_MAX ) y1 += 1;
148
QRect r( x1, y1, x2 - x1 + 1, y2 - y1 + 1 );
150
// allow for 5 pixel minimum widget size
151
if ( r.width() < 5 && x1 > INT_MIN + 2 ) // make sure no underflow occurs (2 is largest adjustment)
153
r.setX( r.x() - (( 5 - r.width() ) / 2 ) ); // adjust x by 1/2 the difference of calculated and min. width
156
if ( r.height() < 5 && y1 > INT_MIN + 2 )
158
r.setY( r.y() - (( 5 - r.height() ) / 2 ) ); // adjust y
162
QgsDebugMsg( QString( "panning: extent to widget: [%1,%2] [%3x%4]" ).arg( x1 ).arg( y1 ).arg( r.width() ).arg( r.height() ) );
164
mPanningWidget->setGeometry( r );
165
mPanningWidget->show(); // show if hidden
160
void QgsMapOverviewCanvas::mousePressEvent(QMouseEvent * e)
169
void QgsMapOverviewCanvas::mousePressEvent( QMouseEvent * e )
162
171
// if (mPanningWidget->isHidden())
165
174
// set offset in panning widget if inside it
166
175
// for better experience with panning :)
167
if (mPanningWidget->geometry().contains(e->pos()))
176
if ( mPanningWidget->geometry().contains( e->pos() ) )
169
178
mPanningCursorOffset = e->pos() - mPanningWidget->pos();
173
182
// use center of the panning widget if outside
174
183
QSize s = mPanningWidget->size();
175
mPanningCursorOffset = QPoint(s.width()/2, s.height()/2);
184
mPanningCursorOffset = QPoint( s.width() / 2, s.height() / 2 );
177
updatePanningWidget(e->pos());
186
updatePanningWidget( e->pos() );
181
void QgsMapOverviewCanvas::mouseReleaseEvent(QMouseEvent * e)
190
void QgsMapOverviewCanvas::mouseReleaseEvent( QMouseEvent * e )
183
192
// if (mPanningWidget->isHidden())
186
if ((e->state() && Qt::LeftButton) == Qt::LeftButton)
195
if ( e->button() == Qt::LeftButton )
188
197
// set new extent
189
QgsMapToPixel* cXf = mMapRender->coordXForm();
198
const QgsMapToPixel* cXf = mMapRenderer->coordinateTransform();
190
199
QRect rect = mPanningWidget->geometry();
192
QgsPoint center = cXf->toMapCoordinates(rect.center());
193
QgsRect oldExtent = mMapCanvas->extent();
195
ext.setXmin(center.x() - oldExtent.width()/2);
196
ext.setXmax(center.x() + oldExtent.width()/2);
197
ext.setYmin(center.y() - oldExtent.height()/2);
198
ext.setYmax(center.y() + oldExtent.height()/2);
201
std::cout << "panning: new position: [" << rect.left() << "," << rect.top() <<
202
"] [" << rect.width() << "x" << rect.height() << "]" << std::endl;
205
mMapCanvas->setExtent(ext);
201
QgsPoint center = cXf->toMapCoordinates( rect.center() );
202
QgsRectangle oldExtent = mMapCanvas->extent();
204
ext.setXMinimum( center.x() - oldExtent.width() / 2 );
205
ext.setXMaximum( center.x() + oldExtent.width() / 2 );
206
ext.setYMinimum( center.y() - oldExtent.height() / 2 );
207
ext.setYMaximum( center.y() + oldExtent.height() / 2 );
209
QgsDebugMsg( QString( "panning: new position: [%1,%2] [%3x%4]" ).arg( rect.left() ).arg( rect.top() ).arg( rect.width() ).arg( rect.height() ) );
211
mMapCanvas->setExtent( ext );
206
212
mMapCanvas->refresh();
211
void QgsMapOverviewCanvas::mouseMoveEvent(QMouseEvent * e)
217
void QgsMapOverviewCanvas::mouseMoveEvent( QMouseEvent * e )
213
219
// move with panning widget if tracking cursor
214
if ((e->state() && Qt::LeftButton) == Qt::LeftButton)
220
if (( e->buttons() & Qt::LeftButton ) == Qt::LeftButton )
216
updatePanningWidget(e->pos());
222
updatePanningWidget( e->pos() );
221
void QgsMapOverviewCanvas::updatePanningWidget(const QPoint& pos)
227
void QgsMapOverviewCanvas::updatePanningWidget( const QPoint& pos )
223
229
// if (mPanningWidget->isHidden())
225
231
QSize size = mPanningWidget->size();
226
mPanningWidget->move(pos.x() - mPanningCursorOffset.x(), pos.y() - mPanningCursorOffset.y());
232
mPanningWidget->move( pos.x() - mPanningCursorOffset.x(), pos.y() - mPanningCursorOffset.y() );
230
void QgsMapOverviewCanvas::paintEvent(QPaintEvent * pe)
236
void QgsMapOverviewCanvas::paintEvent( QPaintEvent * pe )
232
QPainter paint(this);
233
paint.drawPixmap(pe->rect().topLeft(), mPixmap, pe->rect());
238
QPainter paint( this );
239
paint.drawPixmap( pe->rect().topLeft(), mPixmap, pe->rect() );
237
243
void QgsMapOverviewCanvas::refresh()
239
mPixmap.fill(mBgColor); //palette().color(backgroundRole());
245
if ( mPixmap.isNull() )
248
mPixmap.fill( mBgColor ); //palette().color(backgroundRole());
241
250
QPainter painter;
242
painter.begin(&mPixmap);
251
painter.begin( &mPixmap );
246
painter.setRenderHint(QPainter::Antialiasing);
255
painter.setRenderHint( QPainter::Antialiasing );
249
mMapRender->setExtent(mMapCanvas->fullExtent());
250
mMapRender->render(&painter);
258
mMapRenderer->render( &painter );
254
262
// schedule repaint
257
265
// update panning widget
258
reflectChangedExtent();
262
void QgsMapOverviewCanvas::setbgColor(const QColor& color)
270
void QgsMapOverviewCanvas::setBackgroundColor( const QColor& color )
264
272
mBgColor = color;
266
274
// set erase color
267
275
QPalette palette;
268
palette.setColor(backgroundRole(), color);
272
void QgsMapOverviewCanvas::setLayerSet(std::deque<QString>& layerSet)
274
QgsMapLayerSet& layers = mMapRender->layers();
275
layers.setLayerSet(layerSet);
278
void QgsMapOverviewCanvas::updateFullExtent()
280
mMapRender->layers().updateFullExtent();
276
palette.setColor( backgroundRole(), color );
277
setPalette( palette );
280
void QgsMapOverviewCanvas::setLayerSet( const QStringList& layerSet )
282
mMapRenderer->setLayerSet( layerSet );
285
void QgsMapOverviewCanvas::updateFullExtent( const QgsRectangle& rect )
287
mMapRenderer->setExtent( rect );
291
void QgsMapOverviewCanvas::hasCrsTransformEnabled( bool flag )
293
mMapRenderer->setProjectionsEnabled( flag );
296
void QgsMapOverviewCanvas::destinationSrsChanged()
298
const QgsCoordinateReferenceSystem& srs = mMapCanvas->mapRenderer()->destinationSrs();
299
mMapRenderer->setDestinationSrs( srs );
302
QStringList& QgsMapOverviewCanvas::layerSet()
304
return mMapRenderer->layerSet();