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 |
|