summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@nokia.com>2011-01-06 07:39:30 +0100
committerGunnar Sletta <gunnar.sletta@nokia.com>2011-01-06 07:39:30 +0100
commit4fbca8d74443bd8575b67c2471a69ccf0864c41d (patch)
tree70a7419fab897b025bab0b5e2cfad2ee4c0ab934
parent44f202549efd0d53cbe25dd581f837de1d3d3c8b (diff)
parente8a9d34705f2d6d4f5929cfd5ed9c64ef5c60fc7 (diff)
Merge branch 'master' of scm.dev.nokia.troll.no:research/qt-scene-graph
-rw-r--r--.gitignore9
-rw-r--r--src/canvas/qxgraphicsview.cpp10
-rw-r--r--src/canvas/qxgraphicsview_p.h2
-rw-r--r--src/graphicsitems/qxflickable.cpp217
-rw-r--r--src/graphicsitems/qxflickable_p_p.h1
-rw-r--r--src/graphicsitems/qxflipable.cpp4
-rw-r--r--src/graphicsitems/qxflipable_p.h6
-rw-r--r--src/graphicsitems/qxitem.cpp61
-rw-r--r--src/graphicsitems/qxitem.h1
-rw-r--r--src/graphicsitems/qxitem_p.h6
-rw-r--r--src/graphicsitems/qxpathview.cpp31
-rw-r--r--src/graphicsitems/qxpathview_p.h7
-rw-r--r--src/graphicsitems/qxpathview_p_p.h3
-rw-r--r--src/graphicsitems/qxtextinput.cpp19
14 files changed, 242 insertions, 135 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..39fcf9c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+Makefile
+*.o
+*.moc
+moc_*.cpp
+bin/qmlscene
+lib/*.so*
+examples/paintitem/paintitem
+examples/scenegraphitem/scenegraphitem
+tests/auto/texturemanager/tst_texturemanager
diff --git a/src/canvas/qxgraphicsview.cpp b/src/canvas/qxgraphicsview.cpp
index 6c3e257..321f138 100644
--- a/src/canvas/qxgraphicsview.cpp
+++ b/src/canvas/qxgraphicsview.cpp
@@ -165,6 +165,8 @@ QxGraphicsView::QxGraphicsView(QWidget *parent)
d->animationDriver.install();
else
printf("Not using VSync Animation Driver\n");
+
+ setFocusPolicy(Qt::StrongFocus);
}
QxGraphicsView::~QxGraphicsView()
@@ -290,6 +292,7 @@ QGraphicsSceneMouseEvent *QxGraphicsViewPrivate::sceneMouseEvent(QMouseEvent *e,
g->setButtons(e->buttons());
g->setButton(e->button());
g->setModifiers(e->modifiers());
+ g->setAccepted(false);
return g;
}
@@ -321,7 +324,8 @@ bool QxGraphicsViewPrivate::deliverInitialMouseEvent(QxItem *o, QMouseEvent *e)
children = QxItemPrivate::get(children)->nextSibling;
}
- if (filter) mouseFilters.removeLast();
+ if (filter && !mouseFilters.isEmpty())
+ mouseFilters.removeLast();
if (op->acceptedButtons & e->button()) {
bool ok = false;
@@ -362,6 +366,8 @@ bool QxGraphicsViewPrivate::deliverInitialMouseEvent(QxItem *o, QMouseEvent *e)
void QxGraphicsView::mousePressEvent(QMouseEvent *e)
{
if (d->deliverInitialMouseEvent(d->root, e)) {
+ if (d->mouseGrabber && d->mouseGrabber->focusItem())
+ d->setFocusItem(d->mouseGrabber->focusItem());
e->accept();
} else {
#ifdef Q_WS_QPA
@@ -502,6 +508,7 @@ void QxGraphicsViewPrivate::setFocusItem(QxItem *item)
focusItem = 0;
QFocusEvent event(QEvent::FocusOut, Qt::OtherFocusReason);
QCoreApplication::sendEvent(prevFocusItem, &event);
+ prevFocusItem->d_func()->view = 0;
}
QxItem *fi = item;
@@ -517,6 +524,7 @@ void QxGraphicsViewPrivate::setFocusItem(QxItem *item)
//give focus to new focus item
if (focusItem) {
+ focusItem->d_func()->view = q;
focusItem->d_func()->inActiveFocusChain = true;
QFocusEvent event(QEvent::FocusOut, Qt::OtherFocusReason);
QCoreApplication::sendEvent(focusItem, &event);
diff --git a/src/canvas/qxgraphicsview_p.h b/src/canvas/qxgraphicsview_p.h
index ce62a35..a9987e3 100644
--- a/src/canvas/qxgraphicsview_p.h
+++ b/src/canvas/qxgraphicsview_p.h
@@ -77,7 +77,7 @@ public:
QxItem *mouseGrabber;
QList<QxItem *> mouseFilters;
- QxItem *focusItem;
+ QPointer<QxItem> focusItem;
QxGraphicsView::ResizeMode resizeMode;
diff --git a/src/graphicsitems/qxflickable.cpp b/src/graphicsitems/qxflickable.cpp
index 78c0e7a..7055c2c 100644
--- a/src/graphicsitems/qxflickable.cpp
+++ b/src/graphicsitems/qxflickable.cpp
@@ -634,14 +634,18 @@ void QxFlickable::setFlickDirection(FlickableDirection direction)
void QxFlickablePrivate::handleMousePressEvent(QGraphicsSceneMouseEvent *event)
{
+ Q_Q(QxFlickable);
if (interactive && timeline.isActive() && (qAbs(hData.velocity) > 10 || qAbs(vData.velocity) > 10))
stealMouse = true; // If we've been flicked then steal the click.
else
stealMouse = false;
+ q->setKeepMouseGrab(stealMouse);
pressed = true;
timeline.clear();
hData.velocity = 0;
vData.velocity = 0;
+ hData.dragStartOffset = 0;
+ vData.dragStartOffset = 0;
lastPos = QPoint();
lastPosTime.start();
pressPos = event->pos();
@@ -660,11 +664,15 @@ void QxFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event)
return;
bool rejectY = false;
bool rejectX = false;
+ bool stealY = stealMouse;
+ bool stealX = stealMouse;
if (q->yflick()) {
int dy = int(event->pos().y() - pressPos.y());
if (qAbs(dy) > QApplication::startDragDistance() || pressTime.elapsed() > 200) {
- qreal newY = dy + vData.pressPos;
+ if (!vMoved)
+ vData.dragStartOffset = dy;
+ qreal newY = dy + vData.pressPos - vData.dragStartOffset;
const qreal minY = q->minYExtent();
const qreal maxY = q->maxYExtent();
if (newY > minY)
@@ -672,26 +680,31 @@ void QxFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event)
if (newY < maxY && maxY - minY <= 0)
newY = maxY + (newY - maxY) / 2;
if (boundsBehavior == QxFlickable::StopAtBounds && (newY > minY || newY < maxY)) {
- if (newY > minY)
- newY = minY;
- else if (newY < maxY)
+ rejectY = true;
+ if (newY < maxY) {
newY = maxY;
- else
- rejectY = true;
+ rejectY = false;
+ }
+ if (newY > minY) {
+ newY = minY;
+ rejectY = false;
+ }
}
if (!rejectY && stealMouse) {
vData.move.setValue(qRound(newY));
vMoved = true;
}
if (qAbs(dy) > QApplication::startDragDistance())
- stealMouse = true;
+ stealY = true;
}
}
if (q->xflick()) {
int dx = int(event->pos().x() - pressPos.x());
if (qAbs(dx) > QApplication::startDragDistance() || pressTime.elapsed() > 200) {
- qreal newX = dx + hData.pressPos;
+ if (!hMoved)
+ hData.dragStartOffset = dx;
+ qreal newX = dx + hData.pressPos - hData.dragStartOffset;
const qreal minX = q->minXExtent();
const qreal maxX = q->maxXExtent();
if (newX > minX)
@@ -699,12 +712,15 @@ void QxFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event)
if (newX < maxX && maxX - minX <= 0)
newX = maxX + (newX - maxX) / 2;
if (boundsBehavior == QxFlickable::StopAtBounds && (newX > minX || newX < maxX)) {
- if (newX > minX)
- newX = minX;
- else if (newX < maxX)
+ rejectX = true;
+ if (newX < maxX) {
newX = maxX;
- else
- rejectX = true;
+ rejectX = false;
+ }
+ if (newX > minX) {
+ newX = minX;
+ rejectX = false;
+ }
}
if (!rejectX && stealMouse) {
hData.move.setValue(qRound(newX));
@@ -712,10 +728,15 @@ void QxFlickablePrivate::handleMouseMoveEvent(QGraphicsSceneMouseEvent *event)
}
if (qAbs(dx) > QApplication::startDragDistance())
- stealMouse = true;
+ stealX = true;
+
}
}
+ stealMouse = stealX || stealY;
+ if (stealMouse)
+ q->setKeepMouseGrab(true);
+
if (!lastPos.isNull()) {
qreal elapsed = qreal(lastPosTime.restart()) / 1000.;
if (elapsed <= 0)
@@ -762,23 +783,15 @@ void QxFlickablePrivate::handleMouseReleaseEvent(QGraphicsSceneMouseEvent *event
}
vTime = timeline.time();
- if (qAbs(vData.velocity) > 10 && qAbs(event->pos().y() - pressPos.y()) > FlickThreshold) {
- qreal velocity = vData.velocity;
- if (qAbs(velocity) < minimumFlickVelocity) // Minimum velocity to avoid annoyingly slow flicks.
- velocity = velocity < 0 ? -minimumFlickVelocity : minimumFlickVelocity;
- flickY(velocity);
- } else {
+ if (qAbs(vData.velocity) > 10 && qAbs(event->pos().y() - pressPos.y()) > FlickThreshold)
+ flickY(vData.velocity);
+ else
fixupY();
- }
- if (qAbs(hData.velocity) > 10 && qAbs(event->pos().x() - pressPos.x()) > FlickThreshold) {
- qreal velocity = hData.velocity;
- if (qAbs(velocity) < minimumFlickVelocity) // Minimum velocity to avoid annoyingly slow flicks.
- velocity = velocity < 0 ? -minimumFlickVelocity : minimumFlickVelocity;
- flickX(velocity);
- } else {
+ if (qAbs(hData.velocity) > 10 && qAbs(event->pos().x() - pressPos.x()) > FlickThreshold)
+ flickX(hData.velocity);
+ else
fixupX();
- }
lastPosTime.invalidate();
@@ -801,9 +814,8 @@ void QxFlickable::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
Q_D(QxFlickable);
if (d->interactive) {
+ d->clearDelayedPress();
d->handleMouseMoveEvent(event);
- if (d->stealMouse)
- setKeepMouseGrab(true);
event->accept();
} else {
QxItem::mouseMoveEvent(event);
@@ -814,7 +826,15 @@ void QxFlickable::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
Q_D(QxFlickable);
if (d->interactive) {
- d->clearDelayedPress();
+ if (d->delayedPressEvent) {
+ d->stealMouse = false;
+ d->pressed = false;
+ setKeepMouseGrab(false);
+ QApplication::sendEvent(d->delayedPressTarget, d->delayedPressEvent);
+ QApplication::sendEvent(d->delayedPressTarget, event);
+ d->clearDelayedPress();
+ return;
+ }
d->handleMouseReleaseEvent(event);
event->accept();
ungrabMouse();
@@ -907,19 +927,20 @@ void QxFlickablePrivate::setRoundedViewportY(qreal y)
void QxFlickable::timerEvent(QTimerEvent *event)
{
Q_D(QxFlickable);
+
if (event->timerId() == d->delayedPressTimer.timerId()) {
d->delayedPressTimer.stop();
if (d->delayedPressEvent) {
- // XXX akennedy
- /*
- QxItem *grabber = qobject_cast<QxItem *>(mouseGrabberItem());
- if (!grabber || grabber != this)
- scene()->sendEvent(d->delayedPressTarget, d->delayedPressEvent);
- */
+ d->stealMouse = false;
+ d->pressed = false;
+ setKeepMouseGrab(false);
+ d->delayedPressTarget->grabMouse();
+ QApplication::sendEvent(d->delayedPressTarget, d->delayedPressEvent);
delete d->delayedPressEvent;
d->delayedPressEvent = 0;
}
}
+
}
qreal QxFlickable::minYExtent() const
@@ -1173,64 +1194,72 @@ bool QxFlickable::yflick() const
bool QxFlickable::sendMouseEvent(QGraphicsSceneMouseEvent *event)
{
Q_D(QxFlickable);
- QGraphicsSceneMouseEvent mouseEvent(event->type());
- QRectF myRect = mapToScene(QRectF(0, 0, width(), height()));
-
- QxItem *grabber = qobject_cast<QxItem *>(mouseGrabberItem());
- bool stealThisEvent = d->stealMouse;
-
- if ((stealThisEvent || myRect.contains(event->scenePos().toPoint())) && (!grabber || !grabber->keepMouseGrab())) {
- mouseEvent.setAccepted(false);
- for (int i = 0x1; i <= 0x10; i <<= 1) {
- if (event->buttons() & i) {
- Qt::MouseButton button = Qt::MouseButton(i);
- mouseEvent.setButtonDownPos(button, mapFromScene(event->buttonDownPos(button)));
- }
- }
- mouseEvent.setScenePos(event->scenePos());
- mouseEvent.setLastScenePos(event->lastScenePos());
- mouseEvent.setPos(mapFromScene(event->scenePos()));
- mouseEvent.setLastPos(mapFromScene(event->lastScenePos()));
-
- switch(mouseEvent.type()) {
- case QEvent::GraphicsSceneMouseMove:
- d->handleMouseMoveEvent(&mouseEvent);
- break;
- case QEvent::GraphicsSceneMousePress:
- if (d->delayedPressEvent)
- return false;
-
- d->handleMousePressEvent(&mouseEvent);
- d->captureDelayedPress(event);
- break;
- case QEvent::GraphicsSceneMouseRelease:
- if (d->delayedPressEvent) {
- // XXX akennedy
- /*
- scene()->sendEvent(d->delayedPressTarget, d->delayedPressEvent);
- d->clearDelayedPress();
- */
- }
- d->handleMouseReleaseEvent(&mouseEvent);
- break;
- default:
- break;
- }
- grabber = qobject_cast<QxItem*>(mouseGrabberItem());
- if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this) {
- d->clearDelayedPress();
- grabMouse();
- }
- return stealThisEvent || d->delayedPressEvent;
- } else if (d->lastPosTime.isValid()) {
- d->lastPosTime.invalidate();
- }
- if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease) {
- d->clearDelayedPress();
- d->stealMouse = false;
- }
- return false;
+ QGraphicsSceneMouseEvent mouseEvent(event->type());
+ QRectF myRect = mapToScene(QRectF(0, 0, width(), height()));
+
+ QxItem *grabber = mouseGrabberItem();
+ bool stealThisEvent = d->stealMouse;
+ if ((stealThisEvent || myRect.contains(event->scenePos().toPoint())) && (!grabber || !grabber->keepMouseGrab())) {
+ mouseEvent.setAccepted(false);
+ for (int i = 0x1; i <= 0x10; i <<= 1) {
+ if (event->buttons() & i) {
+ Qt::MouseButton button = Qt::MouseButton(i);
+ mouseEvent.setButtonDownPos(button, mapFromScene(event->buttonDownPos(button)));
+ }
+ }
+ mouseEvent.setScenePos(event->scenePos());
+ mouseEvent.setLastScenePos(event->lastScenePos());
+ mouseEvent.setPos(mapFromScene(event->scenePos()));
+ mouseEvent.setLastPos(mapFromScene(event->lastScenePos()));
+
+ switch(mouseEvent.type()) {
+ case QEvent::GraphicsSceneMouseMove:
+ d->handleMouseMoveEvent(&mouseEvent);
+ break;
+ case QEvent::GraphicsSceneMousePress:
+ if (d->delayedPressEvent)
+ return false;
+
+ d->handleMousePressEvent(&mouseEvent);
+ d->captureDelayedPress(event);
+ stealThisEvent = d->stealMouse; // Update stealThisEvent in case changed by function call above
+ break;
+ case QEvent::GraphicsSceneMouseRelease:
+ if (d->delayedPressEvent) {
+ // We replay the mouse press but the grabber we had might not be interessted by the event (e.g. overlay)
+ // so we reset the grabber
+ if (mouseGrabberItem() == d->delayedPressTarget)
+ d->delayedPressTarget->ungrabMouse();
+ //Use the event handler that will take care of finding the proper item to propagate the event
+ QApplication::sendEvent(QApplication::focusWidget(), d->delayedPressEvent);
+ d->clearDelayedPress();
+ // We send the release
+ QApplication::sendEvent(mouseGrabberItem(), event);
+ // And the event has been consumed
+ return true;
+ }
+ d->handleMouseReleaseEvent(&mouseEvent);
+ break;
+ default:
+ break;
+ }
+ grabber = qobject_cast<QxItem*>(mouseGrabberItem());
+ if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this) {
+ d->clearDelayedPress();
+ grabMouse();
+ }
+
+ return stealThisEvent || d->delayedPressEvent;
+ } else if (d->lastPosTime.isValid()) {
+ d->lastPosTime.invalidate();
+ }
+ if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease) {
+ d->clearDelayedPress();
+ d->stealMouse = false;
+ d->pressed = false;
+ }
+ return false;
}
bool QxFlickable::sceneEventFilter(QxItem *i, QEvent *e)
diff --git a/src/graphicsitems/qxflickable_p_p.h b/src/graphicsitems/qxflickable_p_p.h
index fa28be4..264bddc 100644
--- a/src/graphicsitems/qxflickable_p_p.h
+++ b/src/graphicsitems/qxflickable_p_p.h
@@ -94,6 +94,7 @@ public:
QDeclarativeTimeLineValueProxy<QxFlickablePrivate> move;
qreal viewSize;
qreal pressPos;
+ qreal dragStartOffset;
qreal velocity;
qreal flickTarget;
QxFlickablePrivate::Velocity smoothVelocity;
diff --git a/src/graphicsitems/qxflipable.cpp b/src/graphicsitems/qxflipable.cpp
index 892ac52..87d7b4e 100644
--- a/src/graphicsitems/qxflipable.cpp
+++ b/src/graphicsitems/qxflipable.cpp
@@ -90,6 +90,8 @@ void QxFlipable::setFront(QxItem *front)
d->front->setParentItem(this);
if (Back == d->current)
d->front->setOpacity(0.);
+
+ emit frontChanged();
}
QxItem *QxFlipable::back()
@@ -113,6 +115,8 @@ void QxFlipable::setBack(QxItem *back)
this, SLOT(retransformBack()));
connect(back, SIGNAL(heightChanged()),
this, SLOT(retransformBack()));
+
+ emit backChanged();
}
void QxFlipable::retransformBack()
diff --git a/src/graphicsitems/qxflipable_p.h b/src/graphicsitems/qxflipable_p.h
index 0d548e2..506cd22 100644
--- a/src/graphicsitems/qxflipable_p.h
+++ b/src/graphicsitems/qxflipable_p.h
@@ -54,8 +54,8 @@ class QxFlipable : public QxItem
Q_OBJECT
Q_ENUMS(Side)
- Q_PROPERTY(QxItem *front READ front WRITE setFront)
- Q_PROPERTY(QxItem *back READ back WRITE setBack)
+ Q_PROPERTY(QxItem *front READ front WRITE setFront NOTIFY frontChanged)
+ Q_PROPERTY(QxItem *back READ back WRITE setBack NOTIFY backChanged)
Q_PROPERTY(Side side READ side NOTIFY sideChanged)
//### flipAxis
//### flipRotation
@@ -74,6 +74,8 @@ public:
Q_SIGNALS:
void sideChanged();
+ void backChanged();
+ void frontChanged();
protected:
virtual void transformChanged(const QTransform &newTransform, const QTransform &oldTransform);
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;
}
diff --git a/src/graphicsitems/qxitem.h b/src/graphicsitems/qxitem.h
index 0345023..19bdf1d 100644
--- a/src/graphicsitems/qxitem.h
+++ b/src/graphicsitems/qxitem.h
@@ -234,6 +234,7 @@ public:
Q_INVOKABLE QScriptValue mapFromItem(const QScriptValue &item, qreal x, qreal y) const;
Q_INVOKABLE QScriptValue mapToItem(const QScriptValue &item, qreal x, qreal y) const;
Q_INVOKABLE void forceFocus();
+ Q_INVOKABLE QxItem *childAt(qreal x, qreal y) const;
Q_SIGNALS:
void xChanged();
diff --git a/src/graphicsitems/qxitem_p.h b/src/graphicsitems/qxitem_p.h
index bf623b5..2a6c3b2 100644
--- a/src/graphicsitems/qxitem_p.h
+++ b/src/graphicsitems/qxitem_p.h
@@ -492,10 +492,10 @@ public:
bool isConnected(const char *signalName);
- QGraphicsItem *finalFocusProxy(QGraphicsItem *item) const
+ QxItem *finalFocusProxy(QxItem *item) const
{
- QGraphicsItem *fp;
- while ((fp = item->focusProxy()))
+ QxItem *fp;
+ while ((fp = item->focusItem()))
item = fp;
return item;
}
diff --git a/src/graphicsitems/qxpathview.cpp b/src/graphicsitems/qxpathview.cpp
index 19c8b50..52060cb 100644
--- a/src/graphicsitems/qxpathview.cpp
+++ b/src/graphicsitems/qxpathview.cpp
@@ -824,6 +824,12 @@ void QxPathView::setInteractive(bool interactive)
}
}
+bool QxPathView::isMoving() const
+{
+ Q_D(const QxPathView);
+ return d->moving;
+}
+
/*!
\qmlproperty Component PathView::delegate
@@ -953,16 +959,18 @@ void QxPathView::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
if (!d->interactive || !d->lastPosTime.isValid())
return;
+ qreal newPc;
+ QPointF pathPoint = d->pointNear(event->pos(), &newPc);
if (!d->stealMouse) {
- QPointF delta = event->pos() - d->startPoint;
- if (qAbs(delta.x()) > QApplication::startDragDistance() && qAbs(delta.y()) > QApplication::startDragDistance())
+ QPointF delta = pathPoint - d->startPoint;
+ if (qAbs(delta.x()) > QApplication::startDragDistance() || qAbs(delta.y()) > QApplication::startDragDistance()) {
d->stealMouse = true;
+ d->startPc = newPc;
+ }
}
if (d->stealMouse) {
d->moveReason = QxPathViewPrivate::Mouse;
- qreal newPc;
- d->pointNear(event->pos(), &newPc);
qreal diff = (newPc - d->startPc)*d->model->count()*d->mappedRange;
if (diff) {
setOffset(d->offset + diff);
@@ -976,6 +984,11 @@ void QxPathView::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
d->lastDist = diff;
d->startPc = newPc;
}
+ if (!d->moving) {
+ d->moving = true;
+ emit movingChanged();
+ emit movementStarted();
+ }
}
}
@@ -1348,6 +1361,16 @@ void QxPathView::ticked()
d->updateCurrent();
}
+void QxPathView::onTimeLineCompleted()
+{
+ Q_D(QxPathView);
+ if (d->moving && !d->stealMouse) {
+ d->moving = false;
+ emit movingChanged();
+ emit movementEnded();
+ }
+}
+
// find the item closest to the snap position
int QxPathViewPrivate::calcCurrentIndex()
{
diff --git a/src/graphicsitems/qxpathview_p.h b/src/graphicsitems/qxpathview_p.h
index f1958b8..9c8dee0 100644
--- a/src/graphicsitems/qxpathview_p.h
+++ b/src/graphicsitems/qxpathview_p.h
@@ -67,6 +67,7 @@ class QxPathView : public QxItem
Q_PROPERTY(qreal dragMargin READ dragMargin WRITE setDragMargin NOTIFY dragMarginChanged)
Q_PROPERTY(qreal flickDeceleration READ flickDeceleration WRITE setFlickDeceleration NOTIFY flickDecelerationChanged)
Q_PROPERTY(bool interactive READ isInteractive WRITE setInteractive NOTIFY interactiveChanged)
+ Q_PROPERTY(bool moving READ isMoving NOTIFY movingChanged)
Q_PROPERTY(int count READ count NOTIFY countChanged)
Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
@@ -116,6 +117,8 @@ public:
bool isInteractive() const;
void setInteractive(bool);
+ bool isMoving() const;
+
int count() const;
QDeclarativeComponent *delegate() const;
@@ -136,6 +139,9 @@ Q_SIGNALS:
void modelChanged();
void countChanged();
void pathChanged();
+ void movingChanged();
+ void movementStarted();
+ void movementEnded();
void preferredHighlightBeginChanged();
void preferredHighlightEndChanged();
void highlightRangeModeChanged();
@@ -161,6 +167,7 @@ protected:
private Q_SLOTS:
void refill();
void ticked();
+ void onTimeLineCompleted();
void itemsInserted(int index, int count);
void itemsRemoved(int index, int count);
void itemsMoved(int,int,int);
diff --git a/src/graphicsitems/qxpathview_p_p.h b/src/graphicsitems/qxpathview_p_p.h
index 290e091..210cc7c 100644
--- a/src/graphicsitems/qxpathview_p_p.h
+++ b/src/graphicsitems/qxpathview_p_p.h
@@ -77,6 +77,7 @@ public:
, lastElapsed(0), mappedRange(1.0)
, stealMouse(false), ownModel(false), interactive(true), haveHighlightRange(true)
, autoHighlight(true), highlightUp(false), layoutScheduled(false)
+ , moving(false)
, dragMargin(0), deceleration(100)
, moveOffset(this, &QxPathViewPrivate::setOffset)
, firstIndex(-1), pathItems(-1), requestedIndex(-1)
@@ -96,6 +97,7 @@ public:
isFocusScope = true;
q->setFiltersChildEvents(true);
q->connect(&tl, SIGNAL(updated()), q, SLOT(ticked()));
+ q->connect(&tl, SIGNAL(completed()), q, SLOT(onTimeLineCompleted()));
lastPosTime.invalidate();
}
@@ -154,6 +156,7 @@ public:
bool autoHighlight : 1;
bool highlightUp : 1;
bool layoutScheduled : 1;
+ bool moving;
QElapsedTimer lastPosTime;
QPointF lastPos;
qreal dragMargin;
diff --git a/src/graphicsitems/qxtextinput.cpp b/src/graphicsitems/qxtextinput.cpp
index 45cdadf..0ed4563 100644
--- a/src/graphicsitems/qxtextinput.cpp
+++ b/src/graphicsitems/qxtextinput.cpp
@@ -1334,15 +1334,10 @@ void QxTextInput::moveCursorSelection(int position)
void QxTextInput::openSoftwareInputPanel()
{
QEvent event(QEvent::RequestSoftwareInputPanel);
- /* XXX
if (qApp) {
- if (QGraphicsView * view = qobject_cast<QGraphicsView*>(qApp->focusWidget())) {
- if (view->scene() && view->scene() == scene()) {
- QApplication::sendEvent(view, &event);
- }
- }
+ if (QxGraphicsView *view = qobject_cast<QxGraphicsView *>(qApp->focusWidget()))
+ QApplication::sendEvent(view, &event);
}
- */
}
/*!
@@ -1387,16 +1382,10 @@ void QxTextInput::openSoftwareInputPanel()
void QxTextInput::closeSoftwareInputPanel()
{
QEvent event(QEvent::CloseSoftwareInputPanel);
- /* XXX
if (qApp) {
- QEvent event(QEvent::CloseSoftwareInputPanel);
- if (QGraphicsView * view = qobject_cast<QGraphicsView*>(qApp->focusWidget())) {
- if (view->scene() && view->scene() == scene()) {
- QApplication::sendEvent(view, &event);
- }
- }
+ if (QxGraphicsView *view = qobject_cast<QxGraphicsView *>(qApp->focusWidget()))
+ QApplication::sendEvent(view, &event);
}
- */
}
void QxTextInput::focusInEvent(QFocusEvent *event)