1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
/***************************************************************************
qgsmaptooltouch.cpp - map tool for zooming and panning using qgestures
----------------------
begin : February 2012
copyright : (C) 2012 by Marco Bernasocchi
email : marco at bernawebdesign.ch
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgsmaptooltouch.h"
#include "qgsmapcanvas.h"
#include "qgscursors.h"
#include "qgsmaptopixel.h"
#include <QBitmap>
#include <QCursor>
#include <QMouseEvent>
#include <qgslogger.h>
QgsMapToolTouch::QgsMapToolTouch( QgsMapCanvas* canvas )
: QgsMapTool( canvas ), mDragging( false ), mPinching( false )
{
// set cursor
// QBitmap panBmp = QBitmap::fromData( QSize( 16, 16 ), pan_bits );
// QBitmap panBmpMask = QBitmap::fromData( QSize( 16, 16 ), pan_mask_bits );
// mCursor = QCursor( panBmp, panBmpMask, 5, 5 );
}
QgsMapToolTouch::~QgsMapToolTouch()
{
mCanvas->ungrabGesture( Qt::PinchGesture );
}
void QgsMapToolTouch::activate()
{
mCanvas->grabGesture( Qt::PinchGesture );
QgsMapTool::activate();
}
void QgsMapToolTouch::deactivate()
{
mCanvas->ungrabGesture( Qt::PinchGesture );
QgsMapTool::deactivate();
}
void QgsMapToolTouch::canvasMoveEvent( QMouseEvent * e )
{
if ( !mPinching )
{
if (( e->buttons() & Qt::LeftButton ) )
{
mDragging = true;
// move map and other canvas items
mCanvas->panAction( e );
}
}
}
void QgsMapToolTouch::canvasReleaseEvent( QMouseEvent * e )
{
if ( !mPinching )
{
if ( e->button() == Qt::LeftButton )
{
if ( mDragging )
{
mCanvas->panActionEnd( e->pos() );
mDragging = false;
}
else // add pan to mouse cursor
{
// transform the mouse pos to map coordinates
QgsPoint center = mCanvas->getCoordinateTransform()->toMapPoint( e->x(), e->y() );
mCanvas->setExtent( QgsRectangle( center, center ) );
mCanvas->refresh();
}
}
}
}
void QgsMapToolTouch::canvasDoubleClickEvent( QMouseEvent *e )
{
if ( !mPinching )
{
mCanvas->zoomWithCenter( e->x(), e->y(), true );
}
}
bool QgsMapToolTouch::gestureEvent( QGestureEvent *event )
{
qDebug() << "gesture " << event;
if ( QGesture *gesture = event->gesture( Qt::PinchGesture ) )
{
mPinching = true;
pinchTriggered( static_cast<QPinchGesture *>( gesture ) );
}
return true;
}
void QgsMapToolTouch::pinchTriggered( QPinchGesture *gesture )
{
if ( gesture->state() == Qt::GestureFinished )
{
//a very small totalScaleFactor indicates a two finger tap (pinch gesture without pinching)
if ( 0.98 < gesture->totalScaleFactor() && gesture->totalScaleFactor() < 1.02 )
{
mCanvas->zoomOut();
}
else
{
//Transfor global coordinates to widget coordinates
QPoint pos = gesture->centerPoint().toPoint();
pos = mCanvas->mapFromGlobal( pos );
// transform the mouse pos to map coordinates
QgsPoint center = mCanvas->getCoordinateTransform()->toMapPoint( pos.x(), pos.y() );
QgsRectangle r = mCanvas->extent();
r.scale( 1 / gesture->totalScaleFactor(), ¢er );
mCanvas->setExtent( r );
mCanvas->refresh();
}
mPinching = false;
}
}
|