aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Junnonen <tomas.junnonen@nokia.com>2010-08-09 15:30:53 +0300
committerTomas Junnonen <tomas.junnonen@nokia.com>2010-08-09 16:16:48 +0300
commiteda42d011efad4096963b010bd799a032474db8e (patch)
tree588b7f8379248df746024bb4458fb1d445ff32f5
parent97b0923517529967f6ea97ad7cbd127f4a07a4db (diff)
Changes: Improved pinch emulation
RevBy: MichaƂ Guminiak Details: Hold down ctrl, press and drag with left mouse button. Removed option to simulate two finger gestures, now always enabled. Removed pan emulation, no longer necessary.
-rw-r--r--doc/src/gestures.dox6
-rw-r--r--doc/src/news.dox1
-rw-r--r--examples/gestures/gestures.pro2
-rw-r--r--examples/gestures/main.cpp3
-rw-r--r--examples/insrc.pri6
-rw-r--r--src/corelib/core/mcomponentdata.cpp6
-rw-r--r--src/corelib/scene/mscene.cpp134
-rw-r--r--src/corelib/scene/mscene_p.h5
8 files changed, 67 insertions, 96 deletions
diff --git a/doc/src/gestures.dox b/doc/src/gestures.dox
index 7d494d3e..5cf47a97 100644
--- a/doc/src/gestures.dox
+++ b/doc/src/gestures.dox
@@ -73,6 +73,12 @@ In Qt, multitouch input is delivered through the QTouchEvent class, through whic
all the currently touched screen points. Note that by default multitouch events are not delivered
to widgets, delivery must explicitly be enabled using the QGraphicsItem::setAcceptTouchEvents method.
+\section simulatingmultitouch Simulating multitouch
+
+You can simulate the multitouch pinch gesture without needing real multitouch hardware,
+for example in a development environment on a standard PC. Simply hold down the
+<Ctrl> key on the keyboard, then press and drag with the left mouse button.
+
\section gesturesinmtf Gestures related API in MeeGo Touch
MeeGo Touch provides several event handlers for gestures:
diff --git a/doc/src/news.dox b/doc/src/news.dox
index 420d11f9..26a78367 100644
--- a/doc/src/news.dox
+++ b/doc/src/news.dox
@@ -5,6 +5,7 @@
\subsection New
- Updated \subpage rotation document.
+- You can now simulate the multitouch pinch gesture by holding down the Ctrl key, then pressing and dragging with the left mouse button.
- MSceneWindow::appear(QGraphicsScene *scene, MSceneWindow::DeletionPolicy policy);
\subsection Deprecated
diff --git a/examples/gestures/gestures.pro b/examples/gestures/gestures.pro
index bd17fd61..95fbaed8 100644
--- a/examples/gestures/gestures.pro
+++ b/examples/gestures/gestures.pro
@@ -11,3 +11,5 @@ HEADERS += \
mypage.h
RESOURCES = images.qrc
+
+include(../insrc.pri)
diff --git a/examples/gestures/main.cpp b/examples/gestures/main.cpp
index fcb115c7..45325e8e 100644
--- a/examples/gestures/main.cpp
+++ b/examples/gestures/main.cpp
@@ -23,6 +23,9 @@
* The application shows one image at a time, which can be pinched and
* rotated. By swiping left or right (or using the arrow keys), the image
* can be changed.
+ *
+ * You can simulate the pinch on your PC by holding down Ctrl on your keyboard
+ * while pressing and dragging with the left mouse button.
*/
#include <MApplication>
diff --git a/examples/insrc.pri b/examples/insrc.pri
new file mode 100644
index 00000000..ee7571be
--- /dev/null
+++ b/examples/insrc.pri
@@ -0,0 +1,6 @@
+# The following lines are only to allow building the
+# example inside the source tree without installing
+# libmeegotouch first:
+INCLUDEPATH += ../../src/include
+QMAKE_LIBDIR += ../../lib/
+LIBS += -lmeegotouchcore -lmeegotouchviews
diff --git a/src/corelib/core/mcomponentdata.cpp b/src/corelib/core/mcomponentdata.cpp
index 1fe6c8b8..d914e15c 100644
--- a/src/corelib/core/mcomponentdata.cpp
+++ b/src/corelib/core/mcomponentdata.cpp
@@ -148,7 +148,7 @@ MComponentDataPrivate::MComponentDataPrivate()
#endif
reverseLayout(false),
prestarted(false),
- emulateTwoFingerGestures(false),
+ emulateTwoFingerGestures(true),
prestartMode(M::NoPrestart),
forcedOrientationAngle(M::Angle0),
isOrientationForced(false),
@@ -488,8 +488,6 @@ void MComponentDataPrivate::parseArguments(int &argc, char **argv,
showCursor = true;
else if (s == "-show-object-names")
q->setShowObjectNames(true);
- else if (s == "-emulate-two-finger-gestures")
- q->setEmulateTwoFingerGestures(true);
else if (s == "-dev") {
showSize = true;
showPosition = true;
@@ -626,8 +624,6 @@ void MComponentDataPrivate::parseArguments(int &argc, char **argv,
<< " [-no-output-prefix <prefix>] Only show debug messages that do not start with the given prefix\n"
<< " [-target <name>] Use the target device profile\n"
<< " [-prestart] Prestart the application (if supported)\n"
- << " [-emulate-two-finger-gestures] Emulate pinch gesture (alt + mid mouse button + mouse movement)\n"
- << " and two finger pan gesture (ctrl + mid mouse button + mouse movement)\n"
<< " [-fixed-orientation 0|90|180|270] Start application in fixed orientation. \n "
<< " This overrides keyboard state, as well as a device profile"
<< "\n";
diff --git a/src/corelib/scene/mscene.cpp b/src/corelib/scene/mscene.cpp
index f670d219..fce74142 100644
--- a/src/corelib/scene/mscene.cpp
+++ b/src/corelib/scene/mscene.cpp
@@ -33,6 +33,7 @@
#include "mwidget.h"
#include "mapplicationpage.h"
#include "mscene_p.h"
+#include "mdeviceprofile.h"
const QFont TextFont = QFont("Sans", 10);
const QSize FpsBoxSize = QSize(100, 40);
@@ -47,8 +48,9 @@ const qreal BoundingRectOpacity = 0.1;
const qreal MarginBackgroundOpacity = 0.4;
const QColor MarginColor = QColor(Qt::red);
const int MarginBorderWidth = 2;
-const QColor GesturePointColor = QColor(0xEE7621);
-const int GesturePointSize = 4;
+const qreal GesturePointOpacity = 0.70;
+const QColor GesturePointColor = QColor(0x7b7b7b);
+const int GesturePointSize = 15;
MScenePrivate::MScenePrivate() :
@@ -56,7 +58,6 @@ MScenePrivate::MScenePrivate() :
manager(0),
emuPoint1(1),
emuPoint2(2),
- panEmulationEnabled(false),
pinchEmulationEnabled(false)
{
}
@@ -172,22 +173,44 @@ void MScenePrivate::touchPointCopyPosToLastPos(QTouchEvent::TouchPoint &point)
void MScenePrivate::touchPointCopyMousePosToPointPos(QTouchEvent::TouchPoint &point, const QGraphicsSceneMouseEvent *event)
{
- point.setPos(event->pos());
+ point.setPos(event->scenePos());
point.setScenePos(event->scenePos());
- point.setScreenPos(event->screenPos());
+ point.setScreenPos(event->scenePos());
}
void MScenePrivate::touchPointCopyMousePosToPointStartPos(QTouchEvent::TouchPoint &point, const QGraphicsSceneMouseEvent *event)
{
- point.setStartPos(event->pos());
+ point.setStartPos(event->scenePos());
point.setStartScenePos(event->scenePos());
- point.setStartScreenPos(event->screenPos());
+ point.setStartScreenPos(event->scenePos());
+}
+
+void MScenePrivate::touchPointMirrorMousePosToPointPos(QTouchEvent::TouchPoint &point, const QGraphicsSceneMouseEvent *event)
+{
+ QSize resolution = MDeviceProfile::instance()->resolution();
+ QPointF centerPoint(resolution.width() / 2, resolution.height() / 2);
+ QPointF mirrorPoint = centerPoint + (centerPoint - event->scenePos());
+
+ point.setPos(mirrorPoint);
+ point.setScenePos(mirrorPoint);
+ point.setScreenPos(mirrorPoint);
+}
+
+void MScenePrivate::touchPointMirrorMousePosToPointStartPos(QTouchEvent::TouchPoint &point, const QGraphicsSceneMouseEvent *event)
+{
+ QSize resolution = MDeviceProfile::instance()->resolution();
+ QPointF centerPoint(resolution.width() / 2, resolution.height() / 2);
+ QPointF mirrorPoint = centerPoint + (centerPoint - event->scenePos());
+
+ point.setStartPos(mirrorPoint);
+ point.setStartScenePos(mirrorPoint);
+ point.setStartScreenPos(mirrorPoint);
}
bool MScenePrivate::eventEmulateTwoFingerGestures(QEvent *event)
{
if (MApplication::emulateTwoFingerGestures() &&
- (eventEmulatePinch(event) || eventEmulatePan(event))) {
+ eventEmulatePinch(event)) {
return true;
}
@@ -205,11 +228,11 @@ bool MScenePrivate::eventEmulatePinch(QEvent *event)
Qt::TouchPointState touchPointState;
if (QEvent::GraphicsSceneMousePress == event->type()) {
- if (Qt::MidButton == e->button() && Qt::AltModifier == e->modifiers()) {
+ if (Qt::LeftButton == e->button() && Qt::ControlModifier == e->modifiers()) {
pinchEmulationEnabled = true;
- touchPointCopyMousePosToPointPos(emuPoint1,e);
- touchPointCopyMousePosToPointStartPos(emuPoint1,e);
+ touchPointMirrorMousePosToPointPos(emuPoint1,e);
+ touchPointMirrorMousePosToPointStartPos(emuPoint1,e);
emuPoint1.setState(Qt::TouchPointPressed);
touchPointCopyMousePosToPointPos(emuPoint2,e);
@@ -225,6 +248,7 @@ bool MScenePrivate::eventEmulatePinch(QEvent *event)
if (pinchEmulationEnabled && QEvent::GraphicsSceneMouseMove == event->type()) {
touchPointCopyPosToLastPos(emuPoint1);
+ touchPointMirrorMousePosToPointPos(emuPoint1,e);
emuPoint1.setState(Qt::TouchPointMoved);
touchPointCopyPosToLastPos(emuPoint2);
@@ -237,7 +261,7 @@ bool MScenePrivate::eventEmulatePinch(QEvent *event)
}
if (pinchEmulationEnabled && QEvent::GraphicsSceneMouseRelease == event->type()) {
- if (Qt::MidButton == e->button()) {
+ if (Qt::LeftButton == e->button()) {
touchPointCopyPosToLastPos(emuPoint1);
emuPoint1.setState(Qt::TouchPointReleased);
@@ -267,82 +291,6 @@ bool MScenePrivate::eventEmulatePinch(QEvent *event)
return false;
}
-bool MScenePrivate::eventEmulatePan(QEvent *event)
-{
- Q_Q(MScene);
-
- bool sendTouchEvent = false;
- QGraphicsSceneMouseEvent *e = static_cast<QGraphicsSceneMouseEvent*>(event);
-
- QEvent::Type touchEventType;
- Qt::TouchPointState touchPointState;
-
- if (QEvent::GraphicsSceneMousePress == event->type()) {
- if (Qt::MidButton == e->button() && Qt::ControlModifier == e->modifiers()) {
-
- touchPointCopyMousePosToPointPos(emuPoint1,e);
- touchPointCopyMousePosToPointStartPos(emuPoint1,e);
- emuPoint1.setState(Qt::TouchPointPressed);
-
- touchPointCopyMousePosToPointPos(emuPoint2,e);
- touchPointCopyMousePosToPointStartPos(emuPoint2,e);
- emuPoint2.setState(Qt::TouchPointPressed);
-
- touchEventType = QEvent::TouchBegin;
- touchPointState = Qt::TouchPointPressed;
- sendTouchEvent = true;
- panEmulationEnabled = true;
- }
- }
-
- if (panEmulationEnabled && QEvent::GraphicsSceneMouseMove == event->type()) {
-
- touchPointCopyPosToLastPos(emuPoint1);
- touchPointCopyMousePosToPointPos(emuPoint1,e);
- emuPoint1.setState(Qt::TouchPointMoved);
-
- touchPointCopyPosToLastPos(emuPoint2);
- touchPointCopyMousePosToPointPos(emuPoint2,e);
- emuPoint2.setState(Qt::TouchPointMoved);
-
- touchEventType = QEvent::TouchUpdate;
- touchPointState = Qt::TouchPointPressed;
- sendTouchEvent = true;
- }
-
- if (panEmulationEnabled && QEvent::GraphicsSceneMouseRelease == event->type()) {
- if (Qt::MidButton == e->button()) {
-
- touchPointCopyPosToLastPos(emuPoint1);
- touchPointCopyMousePosToPointPos(emuPoint1,e);
- emuPoint1.setState(Qt::TouchPointReleased);
-
- touchPointCopyPosToLastPos(emuPoint2);
- touchPointCopyMousePosToPointPos(emuPoint2,e);
- emuPoint2.setState(Qt::TouchPointReleased);
-
- touchEventType = QEvent::TouchEnd;
- touchPointState = Qt::TouchPointReleased;
-
- panEmulationEnabled = false;
- sendTouchEvent = true;
- }
- }
-
- if (sendTouchEvent) {
- QList<QTouchEvent::TouchPoint> touchList;
- touchList.append(emuPoint1);
- touchList.append(emuPoint2);
-
- QTouchEvent touchEvent(touchEventType, QTouchEvent::TouchPad, Qt::NoModifier, touchPointState, touchList);
- QApplication::sendEvent(q, &touchEvent);
- event->accept();
- q->update();
- return true;
- }
-
- return false;
-}
void MScenePrivate::showFpsCounter(QPainter *painter, float fps)
{
@@ -604,9 +552,17 @@ void MScene::drawForeground(QPainter *painter, const QRectF &rect)
}
if (MApplication::emulateTwoFingerGestures() &&
- (d->panEmulationEnabled || d->pinchEmulationEnabled))
+ d->pinchEmulationEnabled)
{
+ painter->setPen(Qt::NoPen);
+ painter->setBrush(Qt::black);
+ painter->setOpacity(0.2);
+ painter->drawEllipse(d->emuPoint1.screenPos() + QPointF(3, 2),GesturePointSize,GesturePointSize);
+ painter->drawEllipse(d->emuPoint2.screenPos() + QPointF(3, 2),GesturePointSize,GesturePointSize);
+
+ painter->setPen(Qt::black);
painter->setBrush(GesturePointColor);
+ painter->setOpacity(GesturePointOpacity);
painter->drawEllipse(d->emuPoint1.screenPos(),GesturePointSize,GesturePointSize);
painter->drawEllipse(d->emuPoint2.screenPos(),GesturePointSize,GesturePointSize);
}
diff --git a/src/corelib/scene/mscene_p.h b/src/corelib/scene/mscene_p.h
index d9fd628d..aa71312c 100644
--- a/src/corelib/scene/mscene_p.h
+++ b/src/corelib/scene/mscene_p.h
@@ -63,9 +63,11 @@ public:
void touchPointCopyPosToLastPos(QTouchEvent::TouchPoint &point);
void touchPointCopyMousePosToPointPos(QTouchEvent::TouchPoint &point, const QGraphicsSceneMouseEvent *event);
void touchPointCopyMousePosToPointStartPos(QTouchEvent::TouchPoint &point, const QGraphicsSceneMouseEvent *event);
+ void touchPointMirrorMousePosToPointPos(QTouchEvent::TouchPoint &point, const QGraphicsSceneMouseEvent *event);
+ void touchPointMirrorMousePosToPointStartPos(QTouchEvent::TouchPoint &point, const QGraphicsSceneMouseEvent *event);
+
bool eventEmulateTwoFingerGestures(QEvent *event);
bool eventEmulatePinch(QEvent *event);
- bool eventEmulatePan(QEvent *event);
void fillMarginRectWithPattern(QPainter *painter, const QRectF& rect, int thickness);
protected:
@@ -74,7 +76,6 @@ protected:
//Two finger gestures emulation variables
QTouchEvent::TouchPoint emuPoint1, emuPoint2;
- bool panEmulationEnabled;
bool pinchEmulationEnabled;
Fps fps;