diff options
Diffstat (limited to 'src/graphicsitems/qxitem.cpp')
-rw-r--r-- | src/graphicsitems/qxitem.cpp | 61 |
1 files changed, 46 insertions, 15 deletions
diff --git a/src/graphicsitems/qxitem.cpp b/src/graphicsitems/qxitem.cpp index 7d6ca35..5b135c4 100644 --- a/src/graphicsitems/qxitem.cpp +++ b/src/graphicsitems/qxitem.cpp @@ -67,6 +67,7 @@ #include <QGraphicsSceneMouseEvent> #include <QtCore/qnumeric.h> #include <QtScript/qscriptengine.h> +#include <QtGui/qapplication.h> #ifndef FLT_MAX #define FLT_MAX 1E+37 @@ -559,13 +560,12 @@ void QxKeysAttached::keyPressed(QKeyEvent *event, bool post) // first process forwards // XXX akennedy - /* - if (d->item && d->item->scene()) { + if (d->item) { d->inPress = true; for (int ii = 0; ii < d->targets.count(); ++ii) { - QGraphicsItem *i = d->finalFocusProxy(d->targets.at(ii)); + QxItem *i = d->finalFocusProxy(d->targets.at(ii)); if (i) { - d->item->scene()->sendEvent(i, event); + QCoreApplication::sendEvent(i, event); if (event->isAccepted()) { d->inPress = false; return; @@ -590,7 +590,6 @@ void QxKeysAttached::keyPressed(QKeyEvent *event, bool post) emit pressed(&ke); event->setAccepted(ke.isAccepted()); - */ if (!event->isAccepted()) QxItemKeyFilter::keyPressed(event, post); } @@ -604,13 +603,12 @@ void QxKeysAttached::keyReleased(QKeyEvent *event, bool post) } // XXX akennedy - /* - if (d->item && d->item->scene()) { + if (d->item) { d->inRelease = true; for (int ii = 0; ii < d->targets.count(); ++ii) { - QGraphicsItem *i = d->finalFocusProxy(d->targets.at(ii)); + QxItem *i = d->finalFocusProxy(d->targets.at(ii)); if (i) { - d->item->scene()->sendEvent(i, event); + QCoreApplication::sendEvent(i, event); if (event->isAccepted()) { d->inRelease = false; return; @@ -619,7 +617,6 @@ void QxKeysAttached::keyReleased(QKeyEvent *event, bool post) } d->inRelease = false; } - */ QxKeyEvent ke(*event); emit released(&ke); @@ -1332,10 +1329,13 @@ void QxItem::grabMouse() { Q_D(QxItem); - QxGraphicsViewPrivate *v = QxGraphicsViewPrivate::get(d->view); + QxGraphicsView *view = d->view; + if (!view && qApp) + view = qobject_cast<QxGraphicsView *>(QApplication::focusWidget()); - if (mouseGrabberItem()) { - QxItem *grabber = v->mouseGrabber; + QxGraphicsViewPrivate *v = QxGraphicsViewPrivate::get(view); + + if (QxItem *grabber = mouseGrabberItem()) { v->mouseFilters.clear(); QEvent e(QEvent::UngrabMouse); grabber->sceneEvent(&e); @@ -1349,7 +1349,10 @@ void QxItem::ungrabMouse() Q_D(QxItem); if (this == mouseGrabberItem()) { - QxGraphicsViewPrivate *v = QxGraphicsViewPrivate::get(d->view); + QxGraphicsView *view = d->view; + if (!view && qApp) + view = qobject_cast<QxGraphicsView *>(QApplication::focusWidget()); + QxGraphicsViewPrivate *v = QxGraphicsViewPrivate::get(view); QxItem *grabber = v->mouseGrabber; v->mouseFilters.clear(); QEvent e(QEvent::UngrabMouse); @@ -1361,7 +1364,10 @@ void QxItem::ungrabMouse() QxItem *QxItem::mouseGrabberItem() const { Q_D(const QxItem); - return d->view?QxGraphicsViewPrivate::get(d->view)->mouseGrabber:0; + QxGraphicsView *view = d->view; + if (!view && qApp) + view = qobject_cast<QxGraphicsView *>(QApplication::focusWidget()); + return view ? QxGraphicsViewPrivate::get(view)->mouseGrabber : 0; } static void children_append(QDeclarativeListProperty<QxItem> *p, QxItem *o) @@ -2315,6 +2321,22 @@ QScriptValue QxItem::mapToItem(const QScriptValue &item, qreal x, qreal y) const return sv; } +QxItem *QxItem::childAt(qreal x, qreal y) const +{ + // Copied from QDeclarativeItem + const QList<QxItem *> children = childItems(); + for (int i = children.count() - 1; i >= 0; --i) { + if (QxItem *child = children.at(i)) { + if (child->isVisible() && child->x() <= x + && child->x() + child->width() >= x + && child->y() <= y + && child->y() + child->height() >= y) + return child; + } + } + return 0; +} + void QxItem::forceFocus() { setFocus(true); @@ -2579,6 +2601,15 @@ bool QxItem::event(QEvent *ev) case QEvent::FocusOut: d->focusChanged(hasFocus()); break; + case QEvent::GraphicsSceneMousePress: + mousePressEvent(static_cast<QGraphicsSceneMouseEvent *>(ev)); + break; + case QEvent::GraphicsSceneMouseRelease: + mouseReleaseEvent(static_cast<QGraphicsSceneMouseEvent *>(ev)); + break; + case QEvent::GraphicsSceneMouseMove: + mouseMoveEvent(static_cast<QGraphicsSceneMouseEvent *>(ev)); + break; default: break; } |