--- a/emailuis/nmailui/src/nmviewerwebview.cpp Wed Jun 23 18:00:21 2010 +0300
+++ b/emailuis/nmailui/src/nmviewerwebview.cpp Tue Jul 06 14:04:34 2010 +0300
@@ -11,8 +11,8 @@
*
* Contributors:
*
- * Description:
- *
+ * Description: NMailUI web viewer. Inherits from
+ * QGrapohicsWebView and handles gestures, etc.
*/
#include "nmuiheaders.h"
@@ -21,11 +21,15 @@
Constructor.
*/
NmMailViewerWK::NmMailViewerWK()
-: QGraphicsWebView()
+: QGraphicsWebView(),
+ mContent(),
+ mSuppressRelease(false)
{
+ // Subscribe this widget to tap and pinch gestures.
+ grabGesture(Qt::TapGesture);
grabGesture(Qt::PinchGesture);
- installEventFilter(new NmEventFilterWK(this));
- setFlag(QGraphicsItem::ItemIsFocusable,false);
+ // Prevent this widget from accepting focus.
+ setFocusPolicy(Qt::NoFocus);
}
/*!
@@ -37,14 +41,6 @@
}
/*!
- Sets the parent view.
- */
-void NmMailViewerWK::setParentView(NmViewerView *parentView)
-{
- mParentView = parentView;
-}
-
-/*!
Adds content into web view.
*/
void NmMailViewerWK::addContent(QString key, QVariant val, NmId partId, bool isFetched)
@@ -69,42 +65,34 @@
isFetched = mContent[key].mIsFetched;
return mContent[key].mData;
}
- return 0;
}
return 0;
}
/*!
- Filter class' constructor.
+ This is the main event handler that processes all incoming events in an
+ appropriate manner.
*/
-NmEventFilterWK::NmEventFilterWK(QObject* parent)
-: QObject(parent)
+bool NmMailViewerWK::event(QEvent* event)
{
-}
-
-/*
- Filters events if this object has been installed as an event filter.
- */
-bool NmEventFilterWK::eventFilter(QObject* object, QEvent* event) {
- Q_UNUSED(object);
bool consumed = false;
if (event) {
switch (event->type()) {
case QEvent::Gesture:
- consumed = gestureEvent(static_cast<QGestureEvent*>(event));
- break;
- case QEvent::GraphicsSceneMouseDoubleClick:
- // Handle double click (instant zoom).
- // At the moment we simply consume the event.
- event->accept();
- consumed = true;
+ // Handle gesture events.
+ gestureEvent(static_cast<QGestureEvent*>(event));
+ consumed = event->isAccepted();
break;
case QEvent::GraphicsSceneContextMenu:
- case QEvent::GraphicsSceneMouseMove:
- event->accept();
- consumed = true;
+ // Handle context-menu events.
+ // contextMenuEvent() is invoked directly in order to override
+ // text selection in QWebPage.
+ contextMenuEvent(static_cast<QGraphicsSceneContextMenuEvent*>(event));
+ consumed = event->isAccepted();
break;
default:
+ // Invoke base class' event handler.
+ consumed = QGraphicsWebView::event(event);
break;
}
}
@@ -112,18 +100,78 @@
}
/*!
- Handles gesture events. This function is invoked by the eventFilter()
- function in case of gesture events.
+ Handles context-menu events.
+ */
+void NmMailViewerWK::contextMenuEvent(QGraphicsSceneContextMenuEvent* event)
+{
+ if (event) {
+ // Suppress context-menu invocations.
+ event->accept();
+ }
+}
+
+/*!
+ Handles gesture events.
*/
-bool NmEventFilterWK::gestureEvent(QGestureEvent* event) {
- bool consumed = false;
+void NmMailViewerWK::gestureEvent(QGestureEvent* event)
+{
if (event) {
+ if (QTapGesture* tap = static_cast<QTapGesture*>(event->gesture(Qt::TapGesture))) {
+ switch (tap->state()) {
+ case Qt::GestureCanceled:
+ // Tap cancellation suppresses the following mouse release.
+ mSuppressRelease = true;
+ break;
+ default:
+ // Other states disclose the following mouse release.
+ mSuppressRelease = false;
+ break;
+ }
+ event->accept();
+ }
if (QPinchGesture* pinch = static_cast<QPinchGesture*>(event->gesture(Qt::PinchGesture))) {
// Handle pinch (zoom).
// At the moment we simply consume the event.
event->accept();
- consumed = true;
}
}
- return consumed;
+}
+
+/*!
+ Handles double-click events.
+ */
+void NmMailViewerWK::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
+{
+ if (event) {
+ // Handle double clicks (instant zoom).
+ // At the moment we simply consume the event.
+ event->accept();
+ }
}
+
+/*!
+ Handles mouse-move events.
+ */
+void NmMailViewerWK::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
+{
+ if (event) {
+ // Suppress drag selection.
+ event->accept();
+ }
+}
+
+/*!
+ Handles mouse-release events.
+ */
+void NmMailViewerWK::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
+{
+ if (event) {
+ // Suppress mouse release if the previous tap was cancelled.
+ // Otherwise, invoke the base class' event handler.
+ if (mSuppressRelease) {
+ event->accept();
+ } else {
+ QGraphicsWebView::mouseReleaseEvent(event);
+ }
+ }
+}