|
35 | 35 | #include <QGraphicsScene>
|
36 | 36 | #include <QGraphicsView>
|
37 | 37 | #include <QPainter>
|
| 38 | +#include <QSettings> |
38 | 39 | #include <iostream>
|
39 | 40 | #include <cmath>
|
40 | 41 |
|
@@ -278,6 +279,68 @@ void QgsComposerMap::moveContent( double dx, double dy )
|
278 | 279 | }
|
279 | 280 | }
|
280 | 281 |
|
| 282 | +void QgsComposerMap::zoomContent( int delta, double x, double y) |
| 283 | +{ |
| 284 | + QSettings settings; |
| 285 | + |
| 286 | + //read zoom mode |
| 287 | + //0: zoom, 1: zoom and recenter, 2: zoom to cursor, 3: nothing |
| 288 | + int zoomMode = settings.value("/qgis/wheel_action", 0 ).toInt(); |
| 289 | + if(zoomMode == 3) //do nothing |
| 290 | + { |
| 291 | + return; |
| 292 | + } |
| 293 | + |
| 294 | + double zoomFactor = settings.value("/qgis/zoom_factor", 2.0).toDouble(); |
| 295 | + |
| 296 | + //find out new center point |
| 297 | + double centerX = (mExtent.xMax() + mExtent.xMin()) / 2; |
| 298 | + double centerY = (mExtent.yMax() + mExtent.yMin()) / 2; |
| 299 | + |
| 300 | + if(zoomMode != 0) |
| 301 | + { |
| 302 | + //find out map coordinates of mouse position |
| 303 | + double mapMouseX = mExtent.xMin() + (x / rect().width()) * (mExtent.xMax() - mExtent.xMin()); |
| 304 | + double mapMouseY = mExtent.yMin() + (1 - (y / rect().height())) * (mExtent.yMax() - mExtent.yMin()); |
| 305 | + if(zoomMode == 1) //zoom and recenter |
| 306 | + { |
| 307 | + centerX = mapMouseX; |
| 308 | + centerY = mapMouseY; |
| 309 | + } |
| 310 | + else if(zoomMode == 2) //zoom to cursor |
| 311 | + { |
| 312 | + centerX = mapMouseX + (centerX - mapMouseX) * (1.0 / zoomFactor); |
| 313 | + centerY = mapMouseY + (centerY - mapMouseY) * (1.0 / zoomFactor); |
| 314 | + } |
| 315 | + } |
| 316 | + |
| 317 | + double newIntervalX, newIntervalY; |
| 318 | + |
| 319 | + if(delta > 0) |
| 320 | + { |
| 321 | + newIntervalX = (mExtent.xMax() - mExtent.xMin()) / zoomFactor; |
| 322 | + newIntervalY = (mExtent.yMax() - mExtent.yMin()) / zoomFactor; |
| 323 | + } |
| 324 | + else if(delta < 0) |
| 325 | + { |
| 326 | + newIntervalX = (mExtent.xMax() - mExtent.xMin()) * zoomFactor; |
| 327 | + newIntervalY = (mExtent.yMax() - mExtent.yMin()) * zoomFactor; |
| 328 | + } |
| 329 | + else //no need to zoom |
| 330 | + { |
| 331 | + return; |
| 332 | + } |
| 333 | + |
| 334 | + mExtent.setXMaximum(centerX + newIntervalX / 2); |
| 335 | + mExtent.setXMinimum(centerX - newIntervalX / 2); |
| 336 | + mExtent.setYMaximum(centerY + newIntervalY / 2); |
| 337 | + mExtent.setYMinimum(centerY - newIntervalY / 2); |
| 338 | + |
| 339 | + emit extentChanged(); |
| 340 | + cache(); |
| 341 | + update(); |
| 342 | +} |
| 343 | + |
281 | 344 | void QgsComposerMap::setSceneRect( const QRectF& rectangle )
|
282 | 345 | {
|
283 | 346 | double w = rectangle.width();
|
|
0 commit comments