summaryrefslogtreecommitdiffstats
path: root/src/graphicsitems/qxitem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphicsitems/qxitem.cpp')
-rw-r--r--src/graphicsitems/qxitem.cpp61
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;
}