ginebra2/ObjectCharm.cpp
changeset 6 1c3b8676e58c
parent 5 0f2326c2a325
child 8 2e16851ffecd
child 10 232fbd5a2dcb
equal deleted inserted replaced
5:0f2326c2a325 6:1c3b8676e58c
     1 
       
     2 #include <QtGui>
       
     3 #include <QObject>
       
     4 #include <QDebug>
       
     5 #include <QApplication>
       
     6 #include <QTimer>
       
     7 
       
     8 #include "ObjectCharm.h"
       
     9 
       
    10 namespace GVA {
       
    11 
       
    12 // ----------------------------
       
    13 // ObjectCharm
       
    14 // ----------------------------
       
    15 
       
    16 ObjectCharm::ObjectCharm(QObject *object)
       
    17   : m_object(object)
       
    18 {
       
    19     m_object->installEventFilter(this);
       
    20     connect(m_object, SIGNAL(destroyed()), this, SLOT(onObjectDestroyed()));
       
    21 }
       
    22 
       
    23 void ObjectCharm::onObjectDestroyed() {
       
    24     deleteLater();
       
    25 }
       
    26 
       
    27 // ----------------------------
       
    28 // ExternalEventCharm
       
    29 // ----------------------------
       
    30 
       
    31 inline QGraphicsScene *ExternalEventCharm::scene() {
       
    32     QGraphicsObject *item = static_cast<QGraphicsObject*>(m_object);
       
    33     return item->scene();
       
    34 }
       
    35 
       
    36 ExternalEventCharm::ExternalEventCharm(QGraphicsObject *object)
       
    37   : ObjectCharm(object)
       
    38 {
       
    39 }
       
    40 
       
    41 bool ExternalEventCharm::eventFilter(QObject *object, QEvent *event) {
       
    42     //qDebug() << "ExternalEventCharm::eventFilter: " << object << event;
       
    43     // Check for external events grabbed by this item.
       
    44 
       
    45     checkForExternalEvent(this, event);
       
    46 
       
    47     switch (event->type()) {
       
    48       case QEvent::Show:
       
    49       {
       
    50           scene()->installEventFilter(this);
       
    51           break;
       
    52       }
       
    53       case QEvent::Hide:
       
    54       {
       
    55           scene()->removeEventFilter(this);
       
    56           break;
       
    57       }
       
    58       default: break;
       
    59     }
       
    60 
       
    61     // standard event processing
       
    62     return object->eventFilter(object, event);
       
    63 }
       
    64 
       
    65 void ExternalEventCharm::checkForExternalEvent(QObject * o, QEvent * e)
       
    66 {
       
    67     Q_UNUSED(o);
       
    68 
       
    69     // Ignore all but a few mouse press events.
       
    70 
       
    71     switch (e->type()) {
       
    72     case QEvent::GraphicsSceneMousePress:
       
    73     case QEvent::GraphicsSceneMouseRelease:
       
    74     case QEvent::GraphicsSceneMouseDoubleClick:
       
    75         break;
       
    76     default:
       
    77         return;
       
    78     }
       
    79 
       
    80     QGraphicsSceneMouseEvent * me = static_cast<QGraphicsSceneMouseEvent*>(e);
       
    81 
       
    82     QPointF eventPosition = me->scenePos();
       
    83 
       
    84     QGraphicsObject *item = static_cast<QGraphicsObject*>(m_object);
       
    85 
       
    86     QRectF itemGeometry = item->sceneBoundingRect();
       
    87 
       
    88     if (!itemGeometry.contains(eventPosition)) {
       
    89         emitExternalEvent(e);
       
    90     }
       
    91 }
       
    92 
       
    93 void ExternalEventCharm::emitExternalEvent(QEvent * e)
       
    94 {
       
    95     QString description;
       
    96 
       
    97     QDebug stream(&description);
       
    98     stream << e;
       
    99 
       
   100     QString name = description;
       
   101     name.truncate(name.indexOf('('));
       
   102 
       
   103     emit externalMouseEvent(e->type(), name, description.trimmed());
       
   104 }
       
   105 
       
   106 // ----------------------------
       
   107 // TouchCircleCharm
       
   108 // ----------------------------
       
   109 
       
   110 TouchCircleCharm::TouchCircleCharm(QObject *object, QGraphicsItem *parent)
       
   111     : ObjectCharm(object),
       
   112       m_timer(new QTimer())
       
   113 {
       
   114     m_item = new QGraphicsEllipseItem(QRect(0,0,20,20), parent);
       
   115     m_item->hide();
       
   116     m_item->setPen(QPen(QColor(Qt::black)));
       
   117     m_item->setBrush(QBrush(QColor(200, 0, 0)));
       
   118     m_item->setZValue(100);  // make sure it isn't obscured
       
   119 
       
   120     m_timer->setSingleShot(true);
       
   121     connect(m_timer, SIGNAL(timeout()), this, SLOT(onTimer()));
       
   122 }
       
   123 
       
   124 TouchCircleCharm::~TouchCircleCharm() {
       
   125     delete m_item;
       
   126     delete m_timer;
       
   127 }
       
   128 
       
   129 bool TouchCircleCharm::eventFilter(QObject *object, QEvent *event) {
       
   130     switch (event->type()) {
       
   131         case QEvent::GraphicsSceneMousePress: {
       
   132             // Show the item.
       
   133             QGraphicsSceneMouseEvent * me = static_cast<QGraphicsSceneMouseEvent*>(event);
       
   134             m_item->setPos(me->scenePos().x() - m_item->rect().width()/2,
       
   135                            me->scenePos().y() - m_item->rect().height()/2);
       
   136 
       
   137             // Change the color to indicate click.
       
   138             m_item->setBrush(QBrush(QColor(0, 0, 200)));
       
   139 
       
   140             m_item->show();
       
   141             m_timer->stop();
       
   142             break;
       
   143         }
       
   144         case QEvent::GraphicsSceneMouseMove: {
       
   145             if(m_item->isVisible()) {
       
   146                 // Move it to new position.
       
   147                 QGraphicsSceneMouseEvent * me = static_cast<QGraphicsSceneMouseEvent*>(event);
       
   148                 m_item->setPos(me->scenePos().x() - m_item->rect().width()/2,
       
   149                                me->scenePos().y() - m_item->rect().height()/2);
       
   150 
       
   151                 // Change the color to indicate drag.
       
   152                 m_item->setBrush(QBrush(QColor(200, 0, 0)));
       
   153             }
       
   154             break;
       
   155         }
       
   156         case QEvent::GraphicsSceneMouseDoubleClick: {
       
   157             if(m_item->isVisible()) {
       
   158                 // Change the color to indicate double click.
       
   159                 m_item->setBrush(QBrush(QColor(0, 200, 0)));
       
   160 
       
   161                 m_timer->stop();
       
   162             }
       
   163             break;
       
   164         }
       
   165         case QEvent::GraphicsSceneMouseRelease: {
       
   166             if(m_item->isVisible()) {
       
   167                 // Start timer to hide it.
       
   168                 m_timer->start(2000);
       
   169             }
       
   170             break;
       
   171         }
       
   172     }
       
   173     return object->eventFilter(object, event);
       
   174 }
       
   175 
       
   176 void TouchCircleCharm::onTimer() {   // slot
       
   177     m_item->hide();
       
   178 }
       
   179 
       
   180 }   // namespace GVA