28 #include <QWebHitTestResult> |
31 #include <QWebHitTestResult> |
29 #include <QWebFrame> |
32 #include <QWebFrame> |
30 #include <QGraphicsView> |
33 #include <QGraphicsView> |
31 #include <QDebug> |
34 #include <QDebug> |
32 |
35 |
33 namespace GVA { |
36 namespace GVA |
|
37 { |
34 #ifndef NO_QSTM_GESTURE |
38 #ifndef NO_QSTM_GESTURE |
35 using namespace qstmGesture; |
39 using namespace qstmGesture; |
36 #endif |
40 #endif |
37 WebChromeItem::WebChromeItem(const QRectF& ownerArea, ChromeWidget *chrome, const QWebElement & element, QGraphicsItem* parent) |
41 WebChromeItem::WebChromeItem(ChromeWidget *chrome, const QWebElement & element, QGraphicsItem* parent) : |
38 : QGraphicsWidget(parent), |
42 ChromeItem(NULL, parent) |
39 m_ownerArea(ownerArea), |
43 , m_chrome(chrome) |
40 m_chrome(chrome), |
44 , m_element(element) |
41 m_element(element), |
45 , m_painting(false) |
42 m_painting(false) |
46 { |
43 { |
47 setFlags(QGraphicsItem::ItemIsFocusable); |
44 |
48 //Adjust the element size to match the element rectangle |
45 |
49 updateSizes(); |
46 // G1: Prevent hover events from passing through to the underlying widget. |
50 #ifndef NO_QSTM_GESTURE |
47 //setAcceptHoverEvents(true); ? |
51 grabGesture(QStm_Gesture::assignedType()); |
48 |
52 #endif |
49 //setFocusPolicy(Qt::ClickFocus); |
53 //Use QGraphicsScene cached rendering NB: This might degrade rendering quality for some animation transforms |
50 //setOpacity(0.50); |
54 setCacheMode(QGraphicsItem::ItemCoordinateCache); |
|
55 } |
|
56 |
|
57 WebChromeItem::~WebChromeItem() |
|
58 { |
|
59 |
|
60 } |
|
61 |
|
62 void WebChromeItem::init(WebChromeSnippet * snippet) |
|
63 { |
|
64 //TODO: revisit this, don't use owner area |
|
65 //setCachedHandlers(chrome()->dom()->getCachedHandlers(snippet->elementId(), ownerArea())); |
|
66 m_snippet = snippet; |
|
67 |
|
68 //When chrome is resized owner areas for snippets may change |
|
69 //NB: Maybe this needs to be done on chromeRepainted too? |
|
70 |
|
71 QObject::connect(renderer(), SIGNAL(chromeResized()), snippet, SLOT(updateOwnerArea())); |
|
72 |
|
73 QObject::connect(this, SIGNAL(contextMenu(QGraphicsSceneContextMenuEvent *)), snippet, |
|
74 SLOT(onContextMenuEvent(QGraphicsSceneContextMenuEvent *))); |
|
75 } |
|
76 |
|
77 QGraphicsScene * WebChromeItem::scene() |
|
78 { |
|
79 return m_chrome->layout()->scene(); |
|
80 } |
|
81 |
|
82 ChromeRenderer * WebChromeItem::renderer() |
|
83 { |
|
84 return m_chrome->renderer(); |
|
85 } |
|
86 |
|
87 //Adjust size to match the element rectangle |
|
88 void WebChromeItem::updateSizes() |
|
89 { |
51 //Set preferred size so item will resize as part of anchor layout |
90 //Set preferred size so item will resize as part of anchor layout |
52 setFlags(QGraphicsItem::ItemIsFocusable); |
91 setPreferredSize(m_element.geometry().width(), m_element.geometry().height()); |
53 setPreferredSize(ownerArea.width(), ownerArea.height()); |
|
54 //Also resize in case item is not part of anchor layout |
92 //Also resize in case item is not part of anchor layout |
55 resize(preferredSize()); |
93 resize(preferredSize()); |
56 #ifndef NO_QSTM_GESTURE |
94 } |
57 grabGesture(QStm_Gesture::assignedType()); |
95 |
58 #endif |
96 // NB: For now we only handle onclick (actually mouseUp). Fix this |
59 //Use QGraphicsScene cached rendering NB: This might degrade rendering quality for some animation transforms |
97 // NB: Modify for multiple cached handlers: mouse click, long press |
60 setCacheMode(QGraphicsItem::ItemCoordinateCache); |
98 // and support handlers not executed in js engine. |
61 } |
99 |
62 |
100 void WebChromeItem::cachedHandlerEvent(QGraphicsSceneMouseEvent * ev) |
63 WebChromeItem::~WebChromeItem() |
101 { |
64 { |
102 for (int i = 0; i < m_handlers.size(); i++) { |
65 |
103 const CachedHandler & handler = m_handlers.at(i); |
66 } |
104 if (handler.rect().contains(ev->pos())) { |
67 |
105 //m_chrome->evalWithEngineContext(handler.script()); |
68 void WebChromeItem::init(WebChromeSnippet * snippet) |
106 handler.invoke(); |
69 { |
107 return; |
70 setCachedHandlers(chrome()->dom()->getCachedHandlers(snippet->elementId(), ownerArea())); |
108 } |
71 |
|
72 //QObject::connect( |
|
73 // renderer(), |
|
74 // SIGNAL(chromeRepainted(const QRectF&)), |
|
75 // this, |
|
76 // SLOT(repaintFromChrome(const QRectF&))/*, Qt::QueuedConnection*/); |
|
77 |
|
78 |
|
79 //When chrome is resized owner areas for snippets may change |
|
80 //NB: Maybe this needs to be done on chromeRepainted too? |
|
81 QObject::connect( |
|
82 renderer(), |
|
83 SIGNAL(chromeResized()), |
|
84 snippet, |
|
85 SLOT(updateOwnerArea())); |
|
86 |
|
87 |
|
88 QObject::connect( |
|
89 this, |
|
90 SIGNAL(contextMenu(QGraphicsSceneContextMenuEvent *)), |
|
91 snippet, |
|
92 SLOT(onContextMenuEvent(QGraphicsSceneContextMenuEvent *))); |
|
93 } |
|
94 |
|
95 QGraphicsScene * WebChromeItem::scene() |
|
96 { |
|
97 return m_chrome->getScene(); |
|
98 } |
|
99 |
|
100 ChromeRenderer * WebChromeItem::renderer() |
|
101 { |
|
102 return m_chrome->renderer(); |
|
103 } |
|
104 |
|
105 void WebChromeItem::setOwnerArea(const QRectF& ownerArea) |
|
106 { |
|
107 m_ownerArea = ownerArea; |
|
108 //Set preferred size so item will resize as part of anchor layout |
|
109 setPreferredSize(ownerArea.width(), ownerArea.height()); |
|
110 //Also resize in case item is not part of anchor layout |
|
111 resize(preferredSize()); |
|
112 } |
|
113 |
|
114 //NB: Not used. Updates now come from renderer directly |
|
115 void WebChromeItem::repaintFromChrome(const QRectF & rect) // slot |
|
116 { |
|
117 QPainter painter; |
|
118 Q_UNUSED(rect) |
|
119 qDebug() << "WebChromeItem::repaintFromChrome: dirtyRect: " << rect << " ownerArea: " << m_ownerArea << " elemGeom: " << m_element.geometry(); |
|
120 // Update if this is our rect |
|
121 if(rect.intersects(m_ownerArea)) |
|
122 update(); |
|
123 } |
|
124 |
|
125 // NB: For now we only handle onclick (actually mouseUp). Fix this |
|
126 // NB: Modify for multiple cached handlers: mouse click, long press |
|
127 // and support handlers not executed in js engine. |
|
128 |
|
129 void WebChromeItem::cachedHandlerEvent(QGraphicsSceneMouseEvent * ev) |
|
130 { |
|
131 for(int i = 0; i < m_handlers.size(); i++){ |
|
132 const CachedHandler & handler = m_handlers.at(i); |
|
133 if(handler.rect().contains(ev->pos())){ |
|
134 qDebug() << "Invoking cached handler: " << handler.script(); |
|
135 //m_chrome->evalWithEngineContext(handler.script()); |
|
136 handler.invoke(); |
|
137 return; |
|
138 } |
|
139 } |
109 } |
140 } |
110 } |
141 |
111 |
142 void WebChromeItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* opt, QWidget* widget) |
112 void WebChromeItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* opt, QWidget* widget) |
143 { |
113 { |
144 Q_UNUSED(opt) |
114 Q_UNUSED(opt) |
145 Q_UNUSED(widget) |
115 Q_UNUSED(widget) |
146 //For debugging |
116 |
147 //painter->fillRect(QRectF(0,0, m_ownerArea.width(), m_ownerArea.height()), Qt::yellow); |
|
148 qDebug() << " WebChromeItem::paint: " << m_element.attribute("id"); |
|
149 m_painting = true; |
117 m_painting = true; |
150 m_element.render(painter); |
118 m_element.render(painter); |
151 m_painting = false; |
119 m_painting = false; |
152 } |
120 ChromeItem::paint(painter, opt, widget); |
153 |
121 } |
154 |
122 |
155 void WebChromeItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * ev) |
123 void WebChromeItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * ev) |
156 { |
124 { |
157 |
|
158 // qDebug() << "ChromeRenderer::contextMenuEvent"; |
|
159 ev->setAccepted(true); |
125 ev->setAccepted(true); |
160 //Signal context menu event |
126 //Signal context menu event |
161 emit contextMenu(ev); |
127 emit contextMenu(ev); |
162 } |
128 } |
163 |
129 |
164 void WebChromeItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent * ev) |
130 void WebChromeItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent * ev) |
165 { |
131 { |
166 |
|
167 forwardMouseEvent(QEvent::MouseButtonDblClick, ev); |
132 forwardMouseEvent(QEvent::MouseButtonDblClick, ev); |
168 } |
133 } |
169 |
134 |
170 void WebChromeItem::grabFocus() |
135 void WebChromeItem::grabFocus() |
171 { |
136 { |
172 setFocusProxy(m_chrome->renderer()); |
137 //setFocusProxy(m_chrome->renderer()); |
173 setFocus(); |
138 setFocus(); |
174 } |
139 } |
175 |
140 |
176 void WebChromeItem::mousePressEvent(QGraphicsSceneMouseEvent * ev) |
141 void WebChromeItem::mousePressEvent(QGraphicsSceneMouseEvent * ev) |
177 { |
142 { |
178 //On mouse press, first invoke any cached handlers. |
143 //On mouse press, first invoke any cached handlers. |
179 cachedHandlerEvent(ev); |
144 cachedHandlerEvent(ev); |
180 //Then do normal mouse press handling |
145 //Then do normal mouse press handling |
181 setFocus(); |
146 setFocus(); |
182 setFocusProxy(m_chrome->renderer()); |
147 // setFocusProxy(m_chrome->renderer()); |
183 forwardMouseEvent(QEvent::MouseButtonPress, ev); |
148 forwardMouseEvent(QEvent::MouseButtonPress, ev); |
184 } |
149 } |
185 |
150 |
186 void WebChromeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * ev) |
151 void WebChromeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * ev) |
187 { |
152 { |
188 forwardMouseEvent(QEvent::MouseButtonRelease, ev); |
153 forwardMouseEvent(QEvent::MouseButtonRelease, ev); |
189 #if defined __SYMBIAN32__ |
154 #if defined __SYMBIAN32__ |
190 // FIXME Remove this, it will be fixed Qt 4.6.3 ? |
155 // FIXME Remove this, it will be fixed Qt 4.6.3 ? |
191 if (ev->button() == Qt::LeftButton) { |
156 /* |
192 QPoint p = QPoint(int(m_ownerArea.x()), int(m_ownerArea.y())) + ev->pos().toPoint(); |
157 if (ev->button() == Qt::LeftButton) { |
193 QWebFrame* frame = m_chrome->renderer()->page()->mainFrame(); |
158 QRectF elementRectangle = m_element.geometry(); |
194 QWebHitTestResult htr = frame->hitTestContent(p); |
159 QPoint p = QPoint(int(elementRectangle.x()), int(elementRectangle.y())) + ev->pos().toPoint(); |
195 if (htr.isContentEditable()) { |
160 QWebFrame* frame = m_chrome->renderer()->page()->mainFrame(); |
196 QEvent vkbEvent(QEvent::RequestSoftwareInputPanel); |
161 QWebHitTestResult htr = frame->hitTestContent(p); |
197 QList<QGraphicsView*> views = m_chrome->renderer()->scene()->views(); |
162 if (htr.isContentEditable()) { |
198 QWidget* view = qobject_cast<QWidget*>(views.value(0)); |
163 QEvent vkbEvent(QEvent::RequestSoftwareInputPanel); |
199 if (view) |
164 QList<QGraphicsView*> views = m_chrome->renderer()->scene()->views(); |
200 QApplication::sendEvent(view, &vkbEvent); |
165 QWidget* view = qobject_cast<QWidget*>(views.value(0)); |
|
166 if (view) |
|
167 QApplication::sendEvent(view, &vkbEvent); |
|
168 } |
|
169 } |
|
170 */ |
|
171 #endif |
|
172 } |
|
173 |
|
174 void WebChromeItem::mouseMoveEvent(QGraphicsSceneMouseEvent * ev) |
|
175 { |
|
176 forwardMouseEvent(QEvent::MouseMove, ev); |
|
177 } |
|
178 |
|
179 void WebChromeItem::forwardMouseEvent(QEvent::Type type, QGraphicsSceneMouseEvent *ev) |
|
180 { |
|
181 |
|
182 emit mouseEvent(type); |
|
183 QRectF elementRectangle = m_element.geometry(); |
|
184 QMouseEvent shiftedEv(type, QPoint(int(elementRectangle.x()), int(elementRectangle.y())) |
|
185 + ev->pos().toPoint(), ev->button(), ev->buttons(), ev->modifiers()); |
|
186 //qDebug() << "elementRectangle: " << elementRectangle << "ev->pos(): " << ev->pos() << |
|
187 // "shiftedEv.pos(): " << shiftedEv.pos(); |
|
188 QApplication::sendEvent(m_chrome->renderer()->page(), &shiftedEv); |
|
189 } |
|
190 |
|
191 void WebChromeItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) |
|
192 { |
|
193 // Translate to a mouse move event. |
|
194 /* |
|
195 QRectF elementRectangle = m_element.geometry(); |
|
196 QMouseEvent shiftedEv( QEvent::MouseMove, QPoint(int(elementRectangle.x()), int(elementRectangle.y()))+event->pos().toPoint(), |
|
197 Qt::NoButton, Qt::NoButton, Qt::NoModifier); |
|
198 QApplication::sendEvent(m_chrome->renderer(), &shiftedEv); */ |
|
199 } |
|
200 /* |
|
201 void WebChromeItem::keyPressEvent ( QKeyEvent * event ) { |
|
202 QApplication::sendEvent(m_chrome->renderer(), event); |
|
203 } |
|
204 |
|
205 void WebChromeItem::keyReleaseEvent ( QKeyEvent * event ) { |
|
206 QApplication::sendEvent(m_chrome->renderer(), event); |
|
207 } |
|
208 */ |
|
209 |
|
210 bool WebChromeItem::event(QEvent* event) |
|
211 { |
|
212 #ifndef NO_QSTM_GESTURE |
|
213 if (event->type() == QEvent::Gesture) { |
|
214 QStm_Gesture* gesture = getQStmGesture(event); |
|
215 if (gesture) { |
|
216 QStm_GestureType gtype = gesture->getGestureStmType(); |
|
217 if (gtype == QStmTouchGestureType || gtype == QStmReleaseGestureType) { |
|
218 gesture->sendMouseEvents(); |
|
219 return true; |
|
220 } |
201 } |
221 } |
202 } |
222 } |
203 #endif |
223 #endif |
204 } |
224 return QGraphicsWidget::event(event); |
205 |
225 } |
206 |
226 |
207 void WebChromeItem::mouseMoveEvent(QGraphicsSceneMouseEvent * ev) |
|
208 { |
|
209 forwardMouseEvent(QEvent::MouseMove, ev); |
|
210 } |
|
211 |
|
212 |
|
213 void WebChromeItem::forwardMouseEvent(QEvent::Type type, QGraphicsSceneMouseEvent *ev) { |
|
214 |
|
215 emit mouseEvent(type); |
|
216 // m_chrome->renderer()->setFocus(); |
|
217 QMouseEvent shiftedEv( type, QPoint(int(m_ownerArea.x()), int(m_ownerArea.y()))+ev->pos().toPoint(), |
|
218 ev->button(), ev->buttons(), ev->modifiers() ); |
|
219 //qDebug() << "m_ownerArea: " << m_ownerArea << "ev->pos(): " << ev->pos() << |
|
220 // "shiftedEv.pos(): " << shiftedEv.pos(); |
|
221 QApplication::sendEvent(m_chrome->renderer()->page(),&shiftedEv); |
|
222 } |
|
223 |
|
224 void WebChromeItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event ) { |
|
225 // Translate to a mouse move event. |
|
226 QMouseEvent shiftedEv( QEvent::MouseMove, QPoint(int(m_ownerArea.x()), int(m_ownerArea.y()))+event->pos().toPoint(), |
|
227 Qt::NoButton, Qt::NoButton, Qt::NoModifier); |
|
228 QApplication::sendEvent(m_chrome->renderer(), &shiftedEv); |
|
229 } |
|
230 /* |
|
231 void WebChromeItem::keyPressEvent ( QKeyEvent * event ) { |
|
232 qDebug() << "WebChromeItem: keyPressEvent " << event->type(); |
|
233 QApplication::sendEvent(m_chrome->renderer(), event); |
|
234 } |
|
235 |
|
236 void WebChromeItem::keyReleaseEvent ( QKeyEvent * event ) { |
|
237 qDebug() << "WebChromeItem: keyReleaseEvent " << event->type(); |
|
238 QApplication::sendEvent(m_chrome->renderer(), event); |
|
239 } |
|
240 */ |
|
241 |
|
242 bool WebChromeItem::event(QEvent* event) |
|
243 { |
|
244 #ifndef NO_QSTM_GESTURE |
|
245 if (event->type() == QEvent::Gesture) { |
|
246 QStm_Gesture* gesture = getQStmGesture(event); |
|
247 if (gesture) { |
|
248 QStm_GestureType gtype = gesture->getGestureStmType(); |
|
249 if (gtype == QStmTouchGestureType || gtype == QStmReleaseGestureType) { |
|
250 gesture->sendMouseEvents(); |
|
251 return true; |
|
252 } |
|
253 } |
|
254 } |
|
255 #endif |
|
256 return QGraphicsWidget::event(event); |
|
257 } |
|
258 |
|
259 } // endof namespace GVA |
227 } // endof namespace GVA |