ginebra2/Charms/ExternalEventCharm.cpp
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
parent 9 b39122337a00
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
*
hgs
parents:
diff changeset
     5
* This program is free software: you can redistribute it and/or modify
hgs
parents:
diff changeset
     6
* it under the terms of the GNU Lesser General Public License as published by
hgs
parents:
diff changeset
     7
* the Free Software Foundation, version 2.1 of the License.
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* This program is distributed in the hope that it will be useful,
hgs
parents:
diff changeset
    10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
hgs
parents:
diff changeset
    11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
hgs
parents:
diff changeset
    12
* GNU Lesser General Public License for more details.
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* You should have received a copy of the GNU Lesser General Public License
hgs
parents:
diff changeset
    15
* along with this program.  If not,
hgs
parents:
diff changeset
    16
* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
* Description:
hgs
parents:
diff changeset
    19
*/
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include "ExternalEventCharm.h"
16
hgs
parents: 9
diff changeset
    22
#include "qstmgestureevent.h"
9
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
namespace GVA {
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
const QString ExternalEventCharm::s_mouseClick = "MouseClick";
hgs
parents:
diff changeset
    27
static const int KLongPressThreshold = 30;
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
inline QGraphicsScene *ExternalEventCharm::scene() {
hgs
parents:
diff changeset
    30
    QGraphicsObject *item = static_cast<QGraphicsObject*>(m_object);
hgs
parents:
diff changeset
    31
    return item->scene();
hgs
parents:
diff changeset
    32
}
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
ExternalEventCharm::ExternalEventCharm(QGraphicsObject *object)
hgs
parents:
diff changeset
    35
  : ObjectCharm(object),
hgs
parents:
diff changeset
    36
    m_pressed(false)
hgs
parents:
diff changeset
    37
{
hgs
parents:
diff changeset
    38
}
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
bool ExternalEventCharm::eventFilter(QObject *object, QEvent *event) {
hgs
parents:
diff changeset
    41
    checkForExternalEvent(this, event);
16
hgs
parents: 9
diff changeset
    42
    checkForExternalGesture(event);
9
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
    switch (event->type()) {
hgs
parents:
diff changeset
    45
      case QEvent::Show:
hgs
parents:
diff changeset
    46
      {
16
hgs
parents: 9
diff changeset
    47
          if(scene())
hgs
parents: 9
diff changeset
    48
          	scene()->installEventFilter(this);
9
hgs
parents:
diff changeset
    49
          break;
hgs
parents:
diff changeset
    50
      }
hgs
parents:
diff changeset
    51
      case QEvent::Hide:
hgs
parents:
diff changeset
    52
      {
16
hgs
parents: 9
diff changeset
    53
          if(scene())
hgs
parents: 9
diff changeset
    54
          	scene()->removeEventFilter(this);
9
hgs
parents:
diff changeset
    55
          break;
hgs
parents:
diff changeset
    56
      }
hgs
parents:
diff changeset
    57
      default: break;
hgs
parents:
diff changeset
    58
    }
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
    // standard event processing
hgs
parents:
diff changeset
    61
    return object->eventFilter(object, event);
hgs
parents:
diff changeset
    62
}
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
void ExternalEventCharm::checkForExternalEvent(QObject * o, QEvent * e)
hgs
parents:
diff changeset
    65
{
hgs
parents:
diff changeset
    66
    Q_UNUSED(o);
hgs
parents:
diff changeset
    67
    bool emitClick = false;
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
    switch (e->type()) {
hgs
parents:
diff changeset
    70
        case QEvent::GraphicsSceneMousePress: {
hgs
parents:
diff changeset
    71
            QGraphicsSceneMouseEvent * me = static_cast<QGraphicsSceneMouseEvent*>(e);
hgs
parents:
diff changeset
    72
            m_pressPos = me->scenePos();
hgs
parents:
diff changeset
    73
            m_pressed = true;
hgs
parents:
diff changeset
    74
            break;
hgs
parents:
diff changeset
    75
        }
hgs
parents:
diff changeset
    76
        case QEvent::GraphicsSceneMouseRelease: {
hgs
parents:
diff changeset
    77
            // See if we need to send a mouse-click signal.
hgs
parents:
diff changeset
    78
            // TODO: When gesture handling is implemented this should be replaced.
hgs
parents:
diff changeset
    79
            if(m_pressed) {
hgs
parents:
diff changeset
    80
                QGraphicsSceneMouseEvent * me = static_cast<QGraphicsSceneMouseEvent*>(e);
hgs
parents:
diff changeset
    81
                QPointF diff = m_pressPos - me->scenePos();
hgs
parents:
diff changeset
    82
                if(diff.manhattanLength() < KLongPressThreshold) {
hgs
parents:
diff changeset
    83
                    emitClick = true;
hgs
parents:
diff changeset
    84
                }
hgs
parents:
diff changeset
    85
                m_pressed = false;
hgs
parents:
diff changeset
    86
            }
hgs
parents:
diff changeset
    87
            break;
hgs
parents:
diff changeset
    88
        }
hgs
parents:
diff changeset
    89
        case QEvent::GraphicsSceneMouseDoubleClick:
hgs
parents:
diff changeset
    90
            m_pressed = false;
hgs
parents:
diff changeset
    91
            break;
hgs
parents:
diff changeset
    92
        default:
hgs
parents:
diff changeset
    93
            // Ignore other events.
hgs
parents:
diff changeset
    94
            return;
hgs
parents:
diff changeset
    95
    }
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
    QGraphicsSceneMouseEvent * me = static_cast<QGraphicsSceneMouseEvent*>(e);
hgs
parents:
diff changeset
    98
    QGraphicsObject *item = static_cast<QGraphicsObject*>(m_object);
hgs
parents:
diff changeset
    99
    QRectF itemGeometry = item->sceneBoundingRect();
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
    if (!itemGeometry.contains(me->scenePos())) {
hgs
parents:
diff changeset
   102
        if(emitClick)
hgs
parents:
diff changeset
   103
            emit externalMouseEvent(me, s_mouseClick, "");
hgs
parents:
diff changeset
   104
        else
hgs
parents:
diff changeset
   105
            emitExternalEvent(e);
hgs
parents:
diff changeset
   106
    }
hgs
parents:
diff changeset
   107
}
hgs
parents:
diff changeset
   108
16
hgs
parents: 9
diff changeset
   109
hgs
parents: 9
diff changeset
   110
bool ExternalEventCharm::checkForExternalGesture(QEvent* event)
hgs
parents: 9
diff changeset
   111
{
hgs
parents: 9
diff changeset
   112
    if (event->type() != QEvent::Gesture) return false;
hgs
parents: 9
diff changeset
   113
    bool emitClick = false;
hgs
parents: 9
diff changeset
   114
    bool isGestureStarted = false;
hgs
parents: 9
diff changeset
   115
    bool isGestureEnded = false;
hgs
parents: 9
diff changeset
   116
    QStm_Gesture* gesture = getQStmGesture(event);
hgs
parents: 9
diff changeset
   117
    if (gesture) {
hgs
parents: 9
diff changeset
   118
        QStm_GestureType gtype = gesture->getGestureStmType();
hgs
parents: 9
diff changeset
   119
        QPoint gpos = gesture->position();
hgs
parents: 9
diff changeset
   120
        isGestureStarted = (gtype == QStmTouchGestureType);
hgs
parents: 9
diff changeset
   121
        isGestureEnded = (gtype == QStmMaybeTapGestureType ||
hgs
parents: 9
diff changeset
   122
                               gesture->isGestureEnded());
hgs
parents: 9
diff changeset
   123
hgs
parents: 9
diff changeset
   124
        if (isGestureStarted || isGestureEnded) {
hgs
parents: 9
diff changeset
   125
            QGraphicsObject *item = static_cast<QGraphicsObject*>(m_object);
hgs
parents: 9
diff changeset
   126
            QPointF pos = qstmMapToScene(gpos, item);
hgs
parents: 9
diff changeset
   127
            if (isGestureStarted) {
hgs
parents: 9
diff changeset
   128
                m_pressed = true;
hgs
parents: 9
diff changeset
   129
            }
hgs
parents: 9
diff changeset
   130
            else if (isGestureEnded) {
hgs
parents: 9
diff changeset
   131
                if (m_pressed) {
hgs
parents: 9
diff changeset
   132
                    emitClick = true;
hgs
parents: 9
diff changeset
   133
                    m_pressed = false;
hgs
parents: 9
diff changeset
   134
                }
hgs
parents: 9
diff changeset
   135
            }
hgs
parents: 9
diff changeset
   136
hgs
parents: 9
diff changeset
   137
            if (!item->sceneBoundingRect().contains(pos)) {
hgs
parents: 9
diff changeset
   138
hgs
parents: 9
diff changeset
   139
                QGraphicsSceneMouseEvent me(emitClick ? QEvent::GraphicsSceneMouseRelease :
hgs
parents: 9
diff changeset
   140
                                                        QEvent::GraphicsSceneMousePress);
hgs
parents: 9
diff changeset
   141
hgs
parents: 9
diff changeset
   142
                qstmSetGraphicsSceneMouseEvent(pos, item, me);
hgs
parents: 9
diff changeset
   143
                if(emitClick) {
hgs
parents: 9
diff changeset
   144
                    emit externalMouseEvent(&me, s_mouseClick, "");
hgs
parents: 9
diff changeset
   145
                }
hgs
parents: 9
diff changeset
   146
                else {
hgs
parents: 9
diff changeset
   147
                    emitExternalEvent(&me);
hgs
parents: 9
diff changeset
   148
                }
hgs
parents: 9
diff changeset
   149
            }
hgs
parents: 9
diff changeset
   150
        }
hgs
parents: 9
diff changeset
   151
    }
hgs
parents: 9
diff changeset
   152
    return isGestureStarted || isGestureEnded;
hgs
parents: 9
diff changeset
   153
}
hgs
parents: 9
diff changeset
   154
9
hgs
parents:
diff changeset
   155
void ExternalEventCharm::emitExternalEvent(QEvent * e)
hgs
parents:
diff changeset
   156
{
hgs
parents:
diff changeset
   157
    QString description;
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
    QDebug stream(&description);
hgs
parents:
diff changeset
   160
    stream << e;
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
    QString name = description;
hgs
parents:
diff changeset
   163
    name.truncate(name.indexOf('('));
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
    emit externalMouseEvent(e, name, description.trimmed());
hgs
parents:
diff changeset
   166
}
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
}   // end GVA namepace