emailuis/nmailui/src/nmviewerwebview.cpp
changeset 47 f83bd4ae1fe3
parent 44 c2d07d913565
child 48 10eaf342f539
equal deleted inserted replaced
45:780f926bc26c 47:f83bd4ae1fe3
    19 
    19 
    20 /*!
    20 /*!
    21     Constructor.
    21     Constructor.
    22 */
    22 */
    23 NmMailViewerWK::NmMailViewerWK()
    23 NmMailViewerWK::NmMailViewerWK()
    24 : QGraphicsWebView()
    24 : QGraphicsWebView(),
       
    25   mContent(),
       
    26   mParentView(NULL),
       
    27   mSuppressRelease(false)
    25 {
    28 {
       
    29     // Subscribe this widget to tap and pinch gestures.
       
    30     grabGesture(Qt::TapGesture);
    26     grabGesture(Qt::PinchGesture);
    31     grabGesture(Qt::PinchGesture);
    27     installEventFilter(new NmEventFilterWK(this));
    32     // Prevent this widget from accepting focus.
    28     setFlag(QGraphicsItem::ItemIsFocusable,false);
    33     setFocusPolicy(Qt::NoFocus);
    29 }
    34 }
    30 
    35 
    31 /*!
    36 /*!
    32     Destructor.
    37     Destructor.
    33  */
    38  */
    73     }
    78     }
    74     return 0;
    79     return 0;
    75 }
    80 }
    76 
    81 
    77 /*!
    82 /*!
    78     Filter class' constructor.
    83     This is the main event handler that processes all incoming events in an
       
    84     appropriate manner.
    79  */
    85  */
    80 NmEventFilterWK::NmEventFilterWK(QObject* parent)
    86 bool NmMailViewerWK::event(QEvent* event)
    81 : QObject(parent)
       
    82 {
    87 {
    83 }
       
    84 
       
    85 /*
       
    86     Filters events if this object has been installed as an event filter.
       
    87  */
       
    88 bool NmEventFilterWK::eventFilter(QObject* object, QEvent* event) {
       
    89     Q_UNUSED(object);
       
    90     bool consumed = false;
    88     bool consumed = false;
    91     if (event) {
    89     if (event) {
    92         switch (event->type()) {
    90         switch (event->type()) {
    93         case QEvent::Gesture:
    91         case QEvent::Gesture:
    94             consumed = gestureEvent(static_cast<QGestureEvent*>(event));
    92             // Handle gesture events.
    95             break;
    93             gestureEvent(static_cast<QGestureEvent*>(event));
    96         case QEvent::GraphicsSceneMouseDoubleClick:
    94             consumed = event->isAccepted();
    97             // Handle double click (instant zoom).
       
    98             // At the moment we simply consume the event.
       
    99             event->accept();
       
   100             consumed = true;
       
   101             break;
    95             break;
   102         case QEvent::GraphicsSceneContextMenu:
    96         case QEvent::GraphicsSceneContextMenu:
   103         case QEvent::GraphicsSceneMouseMove:
    97             // Handle context-menu events.
   104             event->accept();
    98             // contextMenuEvent() is invoked directly in order to override
   105             consumed = true;
    99             // text selection in QWebPage.
       
   100             contextMenuEvent(static_cast<QGraphicsSceneContextMenuEvent*>(event));
       
   101             consumed = event->isAccepted();
   106             break;
   102             break;
   107         default:
   103         default:
       
   104             // Invoke base class' event handler.
       
   105             consumed = QGraphicsWebView::event(event);
   108             break;
   106             break;
   109         }
   107         }
   110     }
   108     }
   111     return consumed;
   109     return consumed;
   112 }
   110 }
   113 
   111 
   114 /*!
   112 /*!
   115     Handles gesture events. This function is invoked by the eventFilter()
   113     Handles context-menu events.
   116     function in case of gesture events.
       
   117  */
   114  */
   118 bool NmEventFilterWK::gestureEvent(QGestureEvent* event) {
   115 void NmMailViewerWK::contextMenuEvent(QGraphicsSceneContextMenuEvent* event)
   119     bool consumed = false;
   116 {
   120     if (event) {
   117     if (event) {
       
   118         // Suppress context-menu invocations.
       
   119         event->accept();
       
   120     }
       
   121 }
       
   122 
       
   123 /*!
       
   124     Handles gesture events.
       
   125  */
       
   126 void NmMailViewerWK::gestureEvent(QGestureEvent* event)
       
   127 {
       
   128     if (event) {
       
   129         if (QTapGesture* tap = static_cast<QTapGesture*>(event->gesture(Qt::TapGesture))) {
       
   130             switch (tap->state()) {
       
   131             case Qt::GestureCanceled:
       
   132                 // Tap cancellation suppresses the following mouse release.
       
   133                 mSuppressRelease = true;
       
   134                 break;
       
   135             default:
       
   136                 // Other states disclose the following mouse release.
       
   137                 mSuppressRelease = false;
       
   138                 break;
       
   139             }
       
   140             event->accept();
       
   141         }
   121         if (QPinchGesture* pinch = static_cast<QPinchGesture*>(event->gesture(Qt::PinchGesture))) {
   142         if (QPinchGesture* pinch = static_cast<QPinchGesture*>(event->gesture(Qt::PinchGesture))) {
   122             // Handle pinch (zoom).
   143             // Handle pinch (zoom).
   123             // At the moment we simply consume the event.
   144             // At the moment we simply consume the event.
   124             event->accept();
   145             event->accept();
   125             consumed = true;
       
   126         }
   146         }
   127     }
   147     }
   128     return consumed;
       
   129 }
   148 }
       
   149 
       
   150 /*!
       
   151     Handles double-click events.
       
   152  */
       
   153 void NmMailViewerWK::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
       
   154 {
       
   155     if (event) {
       
   156         // Handle double clicks (instant zoom).
       
   157         // At the moment we simply consume the event.
       
   158         event->accept();
       
   159     }
       
   160 }
       
   161 
       
   162 /*!
       
   163     Handles mouse-move events.
       
   164  */
       
   165 void NmMailViewerWK::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
       
   166 {
       
   167     if (event) {
       
   168         // Suppress drag selection.
       
   169         event->accept();
       
   170     }
       
   171 }
       
   172 
       
   173 /*!
       
   174     Handles mouse-release events.
       
   175  */
       
   176 void NmMailViewerWK::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
       
   177 {
       
   178     if (event) {
       
   179         // Suppress mouse release if the previous tap was cancelled.
       
   180         // Otherwise, invoke the base class' event handler.
       
   181         if (mSuppressRelease) {
       
   182             event->accept();
       
   183         } else {
       
   184             QGraphicsWebView::mouseReleaseEvent(event);
       
   185         }
       
   186     }
       
   187 }