ginebra2/Charms/ExternalEventCharm.cpp
author hgs
Fri, 06 Aug 2010 17:23:08 -0400
changeset 9 b39122337a00
child 16 3c88a81ff781
permissions -rw-r--r--
201031
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"
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
namespace GVA {
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
const QString ExternalEventCharm::s_mouseClick = "MouseClick";
hgs
parents:
diff changeset
    26
static const int KLongPressThreshold = 30;
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
inline QGraphicsScene *ExternalEventCharm::scene() {
hgs
parents:
diff changeset
    29
    QGraphicsObject *item = static_cast<QGraphicsObject*>(m_object);
hgs
parents:
diff changeset
    30
    return item->scene();
hgs
parents:
diff changeset
    31
}
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
ExternalEventCharm::ExternalEventCharm(QGraphicsObject *object)
hgs
parents:
diff changeset
    34
  : ObjectCharm(object),
hgs
parents:
diff changeset
    35
    m_pressed(false)
hgs
parents:
diff changeset
    36
{
hgs
parents:
diff changeset
    37
}
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
bool ExternalEventCharm::eventFilter(QObject *object, QEvent *event) {
hgs
parents:
diff changeset
    40
    checkForExternalEvent(this, event);
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
    switch (event->type()) {
hgs
parents:
diff changeset
    43
      case QEvent::Show:
hgs
parents:
diff changeset
    44
      {
hgs
parents:
diff changeset
    45
          scene()->installEventFilter(this);
hgs
parents:
diff changeset
    46
          break;
hgs
parents:
diff changeset
    47
      }
hgs
parents:
diff changeset
    48
      case QEvent::Hide:
hgs
parents:
diff changeset
    49
      {
hgs
parents:
diff changeset
    50
          scene()->removeEventFilter(this);
hgs
parents:
diff changeset
    51
          break;
hgs
parents:
diff changeset
    52
      }
hgs
parents:
diff changeset
    53
      default: break;
hgs
parents:
diff changeset
    54
    }
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
    // standard event processing
hgs
parents:
diff changeset
    57
    return object->eventFilter(object, event);
hgs
parents:
diff changeset
    58
}
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
void ExternalEventCharm::checkForExternalEvent(QObject * o, QEvent * e)
hgs
parents:
diff changeset
    61
{
hgs
parents:
diff changeset
    62
    Q_UNUSED(o);
hgs
parents:
diff changeset
    63
    bool emitClick = false;
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
    switch (e->type()) {
hgs
parents:
diff changeset
    66
        case QEvent::GraphicsSceneMousePress: {
hgs
parents:
diff changeset
    67
            QGraphicsSceneMouseEvent * me = static_cast<QGraphicsSceneMouseEvent*>(e);
hgs
parents:
diff changeset
    68
            m_pressPos = me->scenePos();
hgs
parents:
diff changeset
    69
            m_pressed = true;
hgs
parents:
diff changeset
    70
            break;
hgs
parents:
diff changeset
    71
        }
hgs
parents:
diff changeset
    72
        case QEvent::GraphicsSceneMouseRelease: {
hgs
parents:
diff changeset
    73
            // See if we need to send a mouse-click signal.
hgs
parents:
diff changeset
    74
            // TODO: When gesture handling is implemented this should be replaced.
hgs
parents:
diff changeset
    75
            if(m_pressed) {
hgs
parents:
diff changeset
    76
                QGraphicsSceneMouseEvent * me = static_cast<QGraphicsSceneMouseEvent*>(e);
hgs
parents:
diff changeset
    77
                QPointF diff = m_pressPos - me->scenePos();
hgs
parents:
diff changeset
    78
                if(diff.manhattanLength() < KLongPressThreshold) {
hgs
parents:
diff changeset
    79
                    emitClick = true;
hgs
parents:
diff changeset
    80
                }
hgs
parents:
diff changeset
    81
                m_pressed = false;
hgs
parents:
diff changeset
    82
            }
hgs
parents:
diff changeset
    83
            break;
hgs
parents:
diff changeset
    84
        }
hgs
parents:
diff changeset
    85
        case QEvent::GraphicsSceneMouseDoubleClick:
hgs
parents:
diff changeset
    86
            m_pressed = false;
hgs
parents:
diff changeset
    87
            break;
hgs
parents:
diff changeset
    88
        default:
hgs
parents:
diff changeset
    89
            // Ignore other events.
hgs
parents:
diff changeset
    90
            return;
hgs
parents:
diff changeset
    91
    }
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
    QGraphicsSceneMouseEvent * me = static_cast<QGraphicsSceneMouseEvent*>(e);
hgs
parents:
diff changeset
    94
    QGraphicsObject *item = static_cast<QGraphicsObject*>(m_object);
hgs
parents:
diff changeset
    95
    QRectF itemGeometry = item->sceneBoundingRect();
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
    if (!itemGeometry.contains(me->scenePos())) {
hgs
parents:
diff changeset
    98
        if(emitClick)
hgs
parents:
diff changeset
    99
            emit externalMouseEvent(me, s_mouseClick, "");
hgs
parents:
diff changeset
   100
        else
hgs
parents:
diff changeset
   101
            emitExternalEvent(e);
hgs
parents:
diff changeset
   102
    }
hgs
parents:
diff changeset
   103
}
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
void ExternalEventCharm::emitExternalEvent(QEvent * e)
hgs
parents:
diff changeset
   106
{
hgs
parents:
diff changeset
   107
    QString description;
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
    QDebug stream(&description);
hgs
parents:
diff changeset
   110
    stream << e;
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
    QString name = description;
hgs
parents:
diff changeset
   113
    name.truncate(name.indexOf('('));
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
    emit externalMouseEvent(e, name, description.trimmed());
hgs
parents:
diff changeset
   116
}
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
}   // end GVA namepace