diff -r bf7eb7911fc5 -r 997a02608b3a emailuis/nmailui/src/nmviewerwebview.cpp --- 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(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(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(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(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(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); + } + } +}