ginebra2/ObjectCharm.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 23 Jun 2010 17:59:43 +0300
changeset 5 0f2326c2a325
permissions -rw-r--r--
Revision: 201024 Kit: 2010125


#include <QtGui>
#include <QObject>
#include <QDebug>
#include <QApplication>
#include <QTimer>

#include "ObjectCharm.h"

namespace GVA {

// ----------------------------
// ObjectCharm
// ----------------------------

ObjectCharm::ObjectCharm(QObject *object)
  : m_object(object)
{
    m_object->installEventFilter(this);
    connect(m_object, SIGNAL(destroyed()), this, SLOT(onObjectDestroyed()));
}

void ObjectCharm::onObjectDestroyed() {
    deleteLater();
}

// ----------------------------
// ExternalEventCharm
// ----------------------------

inline QGraphicsScene *ExternalEventCharm::scene() {
    QGraphicsObject *item = static_cast<QGraphicsObject*>(m_object);
    return item->scene();
}

ExternalEventCharm::ExternalEventCharm(QGraphicsObject *object)
  : ObjectCharm(object)
{
}

bool ExternalEventCharm::eventFilter(QObject *object, QEvent *event) {
    //qDebug() << "ExternalEventCharm::eventFilter: " << object << event;
    // Check for external events grabbed by this item.

    checkForExternalEvent(this, event);

    switch (event->type()) {
      case QEvent::Show:
      {
          scene()->installEventFilter(this);
          break;
      }
      case QEvent::Hide:
      {
          scene()->removeEventFilter(this);
          break;
      }
      default: break;
    }

    // standard event processing
    return object->eventFilter(object, event);
}

void ExternalEventCharm::checkForExternalEvent(QObject * o, QEvent * e)
{
    Q_UNUSED(o);

    // Ignore all but a few mouse press events.

    switch (e->type()) {
    case QEvent::GraphicsSceneMousePress:
    case QEvent::GraphicsSceneMouseRelease:
    case QEvent::GraphicsSceneMouseDoubleClick:
        break;
    default:
        return;
    }

    QGraphicsSceneMouseEvent * me = static_cast<QGraphicsSceneMouseEvent*>(e);

    QPointF eventPosition = me->scenePos();

    QGraphicsObject *item = static_cast<QGraphicsObject*>(m_object);

    QRectF itemGeometry = item->sceneBoundingRect();

    if (!itemGeometry.contains(eventPosition)) {
        emitExternalEvent(e);
    }
}

void ExternalEventCharm::emitExternalEvent(QEvent * e)
{
    QString description;

    QDebug stream(&description);
    stream << e;

    QString name = description;
    name.truncate(name.indexOf('('));

    emit externalMouseEvent(e->type(), name, description.trimmed());
}

// ----------------------------
// TouchCircleCharm
// ----------------------------

TouchCircleCharm::TouchCircleCharm(QObject *object, QGraphicsItem *parent)
    : ObjectCharm(object),
      m_timer(new QTimer())
{
    m_item = new QGraphicsEllipseItem(QRect(0,0,20,20), parent);
    m_item->hide();
    m_item->setPen(QPen(QColor(Qt::black)));
    m_item->setBrush(QBrush(QColor(200, 0, 0)));
    m_item->setZValue(100);  // make sure it isn't obscured

    m_timer->setSingleShot(true);
    connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimer()));
}

TouchCircleCharm::~TouchCircleCharm() {
    delete m_item;
    delete m_timer;
}

bool TouchCircleCharm::eventFilter(QObject *object, QEvent *event) {
    switch (event->type()) {
        case QEvent::GraphicsSceneMousePress: {
            // Show the item.
            QGraphicsSceneMouseEvent * me = static_cast<QGraphicsSceneMouseEvent*>(event);
            m_item->setPos(me->scenePos().x() - m_item->rect().width()/2,
                           me->scenePos().y() - m_item->rect().height()/2);

            // Change the color to indicate click.
            m_item->setBrush(QBrush(QColor(0, 0, 200)));

            m_item->show();
            m_timer->stop();
            break;
        }
        case QEvent::GraphicsSceneMouseMove: {
            if(m_item->isVisible()) {
                // Move it to new position.
                QGraphicsSceneMouseEvent * me = static_cast<QGraphicsSceneMouseEvent*>(event);
                m_item->setPos(me->scenePos().x() - m_item->rect().width()/2,
                               me->scenePos().y() - m_item->rect().height()/2);

                // Change the color to indicate drag.
                m_item->setBrush(QBrush(QColor(200, 0, 0)));
            }
            break;
        }
        case QEvent::GraphicsSceneMouseDoubleClick: {
            if(m_item->isVisible()) {
                // Change the color to indicate double click.
                m_item->setBrush(QBrush(QColor(0, 200, 0)));

                m_timer->stop();
            }
            break;
        }
        case QEvent::GraphicsSceneMouseRelease: {
            if(m_item->isVisible()) {
                // Start timer to hide it.
                m_timer->start(2000);
            }
            break;
        }
    }
    return object->eventFilter(object, event);
}

void TouchCircleCharm::onTimer() {   // slot
    m_item->hide();
}

}   // namespace GVA