summaryrefslogtreecommitdiffstats
path: root/src/declarative/fx
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2009-09-08 05:30:38 (GMT)
committerAaron Kennedy <aaron.kennedy@nokia.com>2009-09-08 05:30:38 (GMT)
commitcad3b0bdacdbdf407dfbdda5f6dc9cb7d96fa709 (patch)
tree37a16ff73fe102ac0cd169b20f9b12135903d33a /src/declarative/fx
parent5305831c3b0d58a61efadc1c1d3ce9ce4d6e8c77 (diff)
parentb9a924a1e77faeeba595d0619afb14e8fdbb2dd4 (diff)
downloadQt-cad3b0bdacdbdf407dfbdda5f6dc9cb7d96fa709.zip
Qt-cad3b0bdacdbdf407dfbdda5f6dc9cb7d96fa709.tar.gz
Qt-cad3b0bdacdbdf407dfbdda5f6dc9cb7d96fa709.tar.bz2
Merge branch 'kinetic-declarativeui' of git@scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
Diffstat (limited to 'src/declarative/fx')
-rw-r--r--src/declarative/fx/qfxflickable.cpp88
-rw-r--r--src/declarative/fx/qfxflickable.h5
-rw-r--r--src/declarative/fx/qfxflickable_p.h7
-rw-r--r--src/declarative/fx/qfxitem.cpp11
-rw-r--r--src/declarative/fx/qfxlistview.cpp3
-rw-r--r--src/declarative/fx/qfxloader.cpp65
-rw-r--r--src/declarative/fx/qfxloader.h13
-rw-r--r--src/declarative/fx/qfxpathview.cpp3
-rw-r--r--src/declarative/fx/qfxtextinput.cpp54
-rw-r--r--src/declarative/fx/qfxvisualitemmodel.cpp19
10 files changed, 226 insertions, 42 deletions
diff --git a/src/declarative/fx/qfxflickable.cpp b/src/declarative/fx/qfxflickable.cpp
index 007fa0e..5fe9617 100644
--- a/src/declarative/fx/qfxflickable.cpp
+++ b/src/declarative/fx/qfxflickable.cpp
@@ -148,6 +148,7 @@ QFxFlickablePrivate::QFxFlickablePrivate()
, vWidth(-1), vHeight(-1), overShoot(true), flicked(false), moving(false), stealMouse(false)
, pressed(false), atXEnd(false), atXBeginning(true), atYEnd(false), atYBeginning(true)
, interactive(true), maxVelocity(-1), reportedVelocitySmoothing(100)
+ , delayedPressEvent(0), delayedPressTarget(0), pressDelay(0)
, horizontalVelocity(this), verticalVelocity(this), vTime(0), visibleArea(0)
{
fixupXEvent = QmlTimeLineEvent::timeLineEvent<QFxFlickablePrivate, &QFxFlickablePrivate::fixupX>(&_moveX, this);
@@ -707,11 +708,57 @@ void QFxFlickable::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
void QFxFlickable::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
Q_D(QFxFlickable);
+ d->clearDelayedPress();
d->handleMouseReleaseEvent(event);
event->accept();
ungrabMouse();
}
+void QFxFlickablePrivate::captureDelayedPress(QGraphicsSceneMouseEvent *event)
+{
+ Q_Q(QFxFlickable);
+ if (!q->scene() || pressDelay <= 0)
+ return;
+ delayedPressTarget = q->scene()->mouseGrabberItem();
+ delayedPressEvent = new QGraphicsSceneMouseEvent(event->type());
+ delayedPressEvent->setAccepted(false);
+ for (int i = 0x1; i <= 0x10; i <<= 1) {
+ if (event->buttons() & i) {
+ Qt::MouseButton button = Qt::MouseButton(i);
+ delayedPressEvent->setButtonDownPos(button, event->buttonDownPos(button));
+ }
+ }
+ delayedPressEvent->setScenePos(event->scenePos());
+ delayedPressEvent->setLastScenePos(event->lastScenePos());
+ delayedPressEvent->setPos(event->pos());
+ delayedPressEvent->setLastPos(event->lastPos());
+ delayedPressTimer.start(pressDelay, q);
+}
+
+void QFxFlickablePrivate::clearDelayedPress()
+{
+ if (delayedPressEvent) {
+ delayedPressTimer.stop();
+ delete delayedPressEvent;
+ delayedPressEvent = 0;
+ }
+}
+
+void QFxFlickable::timerEvent(QTimerEvent *event)
+{
+ Q_D(QFxFlickable);
+ if (event->timerId() == d->delayedPressTimer.timerId()) {
+ d->delayedPressTimer.stop();
+ if (d->delayedPressEvent) {
+ QFxItem *grabber = scene() ? qobject_cast<QFxItem*>(scene()->mouseGrabberItem()) : 0;
+ if (!grabber || grabber != this)
+ scene()->sendEvent(d->delayedPressTarget, d->delayedPressEvent);
+ delete d->delayedPressEvent;
+ d->delayedPressEvent = 0;
+ }
+ }
+}
+
qreal QFxFlickable::minYExtent() const
{
return 0.0;
@@ -996,22 +1043,34 @@ bool QFxFlickable::sendMouseEvent(QGraphicsSceneMouseEvent *event)
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) {
+ scene()->sendEvent(d->delayedPressTarget, d->delayedPressEvent);
+ d->clearDelayedPress();
+ }
d->handleMouseReleaseEvent(&mouseEvent);
break;
default:
break;
}
grabber = qobject_cast<QFxItem*>(s->mouseGrabberItem());
- if (grabber && d->stealMouse && !grabber->keepMouseGrab() && grabber != this)
+ if (grabber && d->stealMouse && !grabber->keepMouseGrab() && grabber != this) {
+ d->clearDelayedPress();
grabMouse();
+ }
- return d->stealMouse;
+ return d->stealMouse || d->delayedPressEvent;
} else if (!d->lastPosTime.isNull()) {
d->lastPosTime = QTime();
}
+ if (mouseEvent.type() == QEvent::GraphicsSceneMouseRelease)
+ d->clearDelayedPress();
return false;
}
@@ -1055,6 +1114,31 @@ bool QFxFlickable::isFlicking() const
return d->flicked;
}
+/*!
+ \qmlproperty int Flickable::pressDelay
+
+ This property holds the time to delay (ms) delivering a press to
+ children of the Flickable. This can be useful where reacting
+ to a press before a flicking action has undesireable effects.
+
+ If the flickable is dragged/flicked before the delay times out
+ the press event will not be delivered. If the button is released
+ within the timeout, both the press and release will be delivered.
+*/
+int QFxFlickable::pressDelay() const
+{
+ Q_D(const QFxFlickable);
+ return d->pressDelay;
+}
+
+void QFxFlickable::setPressDelay(int delay)
+{
+ Q_D(QFxFlickable);
+ if (d->pressDelay == delay)
+ return;
+ d->pressDelay = delay;
+}
+
qreal QFxFlickable::reportedVelocitySmoothing() const
{
Q_D(const QFxFlickable);
diff --git a/src/declarative/fx/qfxflickable.h b/src/declarative/fx/qfxflickable.h
index 4905101..b3339b0 100644
--- a/src/declarative/fx/qfxflickable.h
+++ b/src/declarative/fx/qfxflickable.h
@@ -71,6 +71,7 @@ class Q_DECLARATIVE_EXPORT QFxFlickable : public QFxItem
Q_PROPERTY(bool flicking READ isFlicking NOTIFY flickingChanged)
Q_PROPERTY(bool interactive READ isInteractive WRITE setInteractive)
+ Q_PROPERTY(int pressDelay READ pressDelay WRITE setPressDelay)
Q_PROPERTY(bool atXEnd READ isAtXEnd NOTIFY isAtBoundaryChanged)
Q_PROPERTY(bool atYEnd READ isAtYEnd NOTIFY isAtBoundaryChanged)
@@ -108,6 +109,9 @@ public:
bool isMoving() const;
bool isFlicking() const;
+ int pressDelay() const;
+ void setPressDelay(int delay);
+
qreal reportedVelocitySmoothing() const;
void setReportedVelocitySmoothing(qreal);
@@ -148,6 +152,7 @@ protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+ void timerEvent(QTimerEvent *event);
qreal visibleX() const;
qreal visibleY() const;
diff --git a/src/declarative/fx/qfxflickable_p.h b/src/declarative/fx/qfxflickable_p.h
index a506027..7224f21 100644
--- a/src/declarative/fx/qfxflickable_p.h
+++ b/src/declarative/fx/qfxflickable_p.h
@@ -76,6 +76,9 @@ public:
virtual void fixupY();
void updateBeginningEnd();
+ void captureDelayedPress(QGraphicsSceneMouseEvent *event);
+ void clearDelayedPress();
+
public:
QFxItem *viewport;
QmlTimeLineValueProxy<QFxItem> _moveX;
@@ -109,6 +112,10 @@ public:
qreal reportedVelocitySmoothing;
int flickTargetX;
int flickTargetY;
+ QGraphicsSceneMouseEvent *delayedPressEvent;
+ QGraphicsItem *delayedPressTarget;
+ QBasicTimer delayedPressTimer;
+ int pressDelay;
void updateVelocity();
struct Velocity : public QmlTimeLineValue
diff --git a/src/declarative/fx/qfxitem.cpp b/src/declarative/fx/qfxitem.cpp
index 88a0854..3429010 100644
--- a/src/declarative/fx/qfxitem.cpp
+++ b/src/declarative/fx/qfxitem.cpp
@@ -336,6 +336,7 @@ public:
virtual void keyReleased(QKeyEvent *event);
virtual void inputMethodEvent(QInputMethodEvent *event);
virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
+ virtual void componentComplete();
private:
QFxItemKeyFilter *m_next;
@@ -377,6 +378,11 @@ QVariant QFxItemKeyFilter::inputMethodQuery(Qt::InputMethodQuery query) const
return QVariant();
}
+void QFxItemKeyFilter::componentComplete()
+{
+ if (m_next) m_next->componentComplete();
+}
+
class QFxKeyNavigationAttachedPrivate : public QObjectPrivate
{
public:
@@ -912,11 +918,10 @@ public:
QFxItem *item;
};
-class QFxKeysAttached : public QObject, public QFxItemKeyFilter, public QmlParserStatus
+class QFxKeysAttached : public QObject, public QFxItemKeyFilter
{
Q_OBJECT
Q_DECLARE_PRIVATE(QFxKeysAttached)
- Q_INTERFACES(QmlParserStatus)
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
Q_PROPERTY(QList<QFxItem *> *forwardTo READ forwardTo)
@@ -2496,6 +2501,8 @@ void QFxItem::componentComplete()
d->_anchors->componentComplete();
d->_anchors->d_func()->updateOnComplete();
}
+ if (d->keyHandler)
+ d->keyHandler->componentComplete();
}
QmlStateGroup *QFxItemPrivate::states()
diff --git a/src/declarative/fx/qfxlistview.cpp b/src/declarative/fx/qfxlistview.cpp
index c24610f..6c0a83e 100644
--- a/src/declarative/fx/qfxlistview.cpp
+++ b/src/declarative/fx/qfxlistview.cpp
@@ -1507,7 +1507,8 @@ void QFxListView::itemsInserted(int modelIndex, int count)
// Update the indexes of the following visible items.
for (; index < d->visibleItems.count(); ++index) {
FxListItem *listItem = d->visibleItems.at(index);
- listItem->setPosition(listItem->position() + (pos - initialPos));
+ if (listItem->item != d->currentItem->item)
+ listItem->setPosition(listItem->position() + (pos - initialPos));
if (listItem->index != -1)
listItem->index += count;
}
diff --git a/src/declarative/fx/qfxloader.cpp b/src/declarative/fx/qfxloader.cpp
index 95ddae3..869a5b0 100644
--- a/src/declarative/fx/qfxloader.cpp
+++ b/src/declarative/fx/qfxloader.cpp
@@ -111,9 +111,12 @@ void QFxLoader::setSource(const QUrl &url)
d->source = url;
d->item = 0;
+ emit itemChanged();
if (d->source.isEmpty()) {
emit sourceChanged();
+ emit statusChanged();
+ emit progressChanged();
return;
}
@@ -122,14 +125,22 @@ void QFxLoader::setSource(const QUrl &url)
(*iter)->setOpacity(1.);
d->item = (*iter);
emit sourceChanged();
+ emit statusChanged();
+ emit progressChanged();
+ emit itemChanged();
} else {
d->qmlcomp =
new QmlComponent(qmlEngine(this), d->source, this);
- if (!d->qmlcomp->isLoading())
+ if (!d->qmlcomp->isLoading()) {
d->_q_sourceLoaded();
- else
+ } else {
connect(d->qmlcomp, SIGNAL(statusChanged(QmlComponent::Status)),
this, SLOT(_q_sourceLoaded()));
+ connect(d->qmlcomp, SIGNAL(progressChanged(qreal)),
+ this, SIGNAL(progressChanged()));
+ emit statusChanged();
+ emit progressChanged();
+ }
}
}
@@ -146,6 +157,8 @@ void QFxLoaderPrivate::_q_sourceLoaded()
delete qmlcomp;
qmlcomp = 0;
emit q->sourceChanged();
+ emit q->statusChanged();
+ emit q->progressChanged();
return;
}
QObject *obj = qmlcomp->create(ctxt);
@@ -163,10 +176,58 @@ void QFxLoaderPrivate::_q_sourceLoaded()
delete qmlcomp;
qmlcomp = 0;
emit q->sourceChanged();
+ emit q->statusChanged();
+ emit q->progressChanged();
+ emit q->itemChanged();
}
}
/*!
+ \qmlproperty enum Loader::status
+
+ This property holds the status of QML loading. It can be one of:
+ \list
+ \o Null - no QML source has been set
+ \o Ready - the QML source has been loaded
+ \o Loading - the QML source is currently being loaded
+ \o Error - an error occurred while loading the QML source
+ \endlist
+
+ \sa progress
+*/
+
+/*!
+ \qmlproperty real Loader::progress
+
+ This property holds the progress of QML data loading, from 0.0 (nothing loaded)
+ to 1.0 (finished).
+
+ \sa status
+*/
+QFxLoader::Status QFxLoader::status() const
+{
+ Q_D(const QFxLoader);
+
+ if (d->qmlcomp)
+ return static_cast<QFxLoader::Status>(d->qmlcomp->status());
+
+ if (d->item)
+ return Ready;
+
+ return d->source.isEmpty() ? Null : Error;
+}
+
+qreal QFxLoader::progress() const
+{
+ Q_D(const QFxLoader);
+
+ if (d->qmlcomp)
+ return d->qmlcomp->progress();
+
+ return d->item ? 1.0 : 0.0;
+}
+
+/*!
\qmlproperty Item Loader::item
This property holds the top-level item created from source.
*/
diff --git a/src/declarative/fx/qfxloader.h b/src/declarative/fx/qfxloader.h
index 8c555c6..132c8f4 100644
--- a/src/declarative/fx/qfxloader.h
+++ b/src/declarative/fx/qfxloader.h
@@ -54,12 +54,14 @@ class QFxLoaderPrivate;
class Q_DECLARATIVE_EXPORT QFxLoader : public QFxItem
{
Q_OBJECT
+ Q_ENUMS(Status)
Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
- Q_PROPERTY(QFxItem *item READ item) //### NOTIFY itemChanged
+ Q_PROPERTY(QFxItem *item READ item NOTIFY itemChanged)
+ Q_PROPERTY(Status status READ status NOTIFY statusChanged)
+ Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged)
//### sourceItem
//### sourceComponent
- //### status, progress
//### resizeMode { NoResize, SizeLoaderToItem (default), SizeItemToLoader }
public:
@@ -69,10 +71,17 @@ public:
QUrl source() const;
void setSource(const QUrl &);
+ enum Status { Null, Ready, Loading, Error };
+ Status status() const;
+ qreal progress() const;
+
QFxItem *item() const;
Q_SIGNALS:
+ void itemChanged();
void sourceChanged();
+ void statusChanged();
+ void progressChanged();
private:
Q_DISABLE_COPY(QFxLoader)
diff --git a/src/declarative/fx/qfxpathview.cpp b/src/declarative/fx/qfxpathview.cpp
index 469e9f3..62f9db0 100644
--- a/src/declarative/fx/qfxpathview.cpp
+++ b/src/declarative/fx/qfxpathview.cpp
@@ -128,6 +128,9 @@ QFxPathView::QFxPathView(QFxPathViewPrivate &dd, QFxItem *parent)
QFxPathView::~QFxPathView()
{
+ Q_D(QFxPathView);
+ if (d->ownModel)
+ delete d->model;
}
/*!
diff --git a/src/declarative/fx/qfxtextinput.cpp b/src/declarative/fx/qfxtextinput.cpp
index 9718321..4dd29cd 100644
--- a/src/declarative/fx/qfxtextinput.cpp
+++ b/src/declarative/fx/qfxtextinput.cpp
@@ -555,33 +555,33 @@ void QFxTextInput::selectAll()
void QFxTextInputPrivate::init()
{
- Q_Q(QFxTextInput);
- control->setCursorWidth(1);
- control->setPasswordCharacter(QLatin1Char('*'));
- control->setLayoutDirection(Qt::LeftToRight);
- q->setSmoothTransform(smooth);
- q->setAcceptedMouseButtons(Qt::LeftButton);
- q->setFlag(QGraphicsItem::ItemHasNoContents, false);
- q->setFlag(QGraphicsItem::ItemAcceptsInputMethod);
- q->connect(control, SIGNAL(cursorPositionChanged(int,int)),
- q, SLOT(cursorPosChanged()));
- q->connect(control, SIGNAL(selectionChanged()),
- q, SLOT(selectionChanged()));
- q->connect(control, SIGNAL(textChanged(const QString &)),
- q, SLOT(q_textChanged()));
- q->connect(control, SIGNAL(accepted()),
- q, SIGNAL(accepted()));
- q->connect(control, SIGNAL(updateNeeded(const QRect &)),
- // q, SLOT(dirtyCache(const QRect &)));
- q, SLOT(updateAll()));
- q->connect(control, SIGNAL(cursorPositionChanged(int,int)),
- q, SLOT(updateAll()));
- q->connect(control, SIGNAL(selectionChanged()),
- q, SLOT(updateAll()));
- q->updateSize();
- oldValidity = control->hasAcceptableInput();
- lastSelectionStart = 0;
- lastSelectionEnd = 0;
+ Q_Q(QFxTextInput);
+ control->setCursorWidth(1);
+ control->setPasswordCharacter(QLatin1Char('*'));
+ control->setLayoutDirection(Qt::LeftToRight);
+ q->setSmoothTransform(smooth);
+ q->setAcceptedMouseButtons(Qt::LeftButton);
+ q->setFlag(QGraphicsItem::ItemHasNoContents, false);
+ q->setFlag(QGraphicsItem::ItemAcceptsInputMethod);
+ q->connect(control, SIGNAL(cursorPositionChanged(int,int)),
+ q, SLOT(cursorPosChanged()));
+ q->connect(control, SIGNAL(selectionChanged()),
+ q, SLOT(selectionChanged()));
+ q->connect(control, SIGNAL(textChanged(const QString &)),
+ q, SLOT(q_textChanged()));
+ q->connect(control, SIGNAL(accepted()),
+ q, SIGNAL(accepted()));
+ q->connect(control, SIGNAL(updateNeeded(const QRect &)),
+ // q, SLOT(dirtyCache(const QRect &)));
+ q, SLOT(updateAll()));
+ q->connect(control, SIGNAL(cursorPositionChanged(int,int)),
+ q, SLOT(updateAll()));
+ q->connect(control, SIGNAL(selectionChanged()),
+ q, SLOT(updateAll()));
+ q->updateSize();
+ oldValidity = control->hasAcceptableInput();
+ lastSelectionStart = 0;
+ lastSelectionEnd = 0;
}
void QFxTextInput::cursorPosChanged()
diff --git a/src/declarative/fx/qfxvisualitemmodel.cpp b/src/declarative/fx/qfxvisualitemmodel.cpp
index 82bec09..cac8b8d 100644
--- a/src/declarative/fx/qfxvisualitemmodel.cpp
+++ b/src/declarative/fx/qfxvisualitemmodel.cpp
@@ -243,6 +243,16 @@ public:
QmlContext *m_context;
QList<int> m_roles;
QHash<int,QString> m_roleNames;
+ void ensureRoles() {
+ if (m_roles.isEmpty()) {
+ if (m_listModelInterface) {
+ m_roles = m_listModelInterface->roles();
+ for (int ii = 0; ii < m_roles.count(); ++ii)
+ m_roleNames.insert(m_roles.at(ii),
+ m_listModelInterface->toString(m_roles.at(ii)));
+ }
+ }
+ }
struct ObjectRef {
ObjectRef(QObject *object=0) : obj(object), ref(1) {}
@@ -375,6 +385,7 @@ int QFxVisualDataModelDataMetaObject::createProperty(const char *name, const cha
return QmlOpenMetaObject::createProperty(name, type);
} else {
const QLatin1String sname(name);
+ data->m_model->ensureRoles();
for (QHash<int, QString>::ConstIterator iter = data->m_model->m_roleNames.begin();
iter != data->m_model->m_roleNames.end(); ++iter) {
@@ -397,6 +408,7 @@ QFxVisualDataModelDataMetaObject::propertyCreated(int, QMetaPropertyBuilder &pro
&& data->m_model->m_modelList) {
return data->m_model->m_modelList->at(data->m_index);
} else if (data->m_model->m_listModelInterface) {
+ data->m_model->ensureRoles();
for (QHash<int, QString>::ConstIterator iter = data->m_model->m_roleNames.begin();
iter != data->m_model->m_roleNames.end(); ++iter) {
@@ -410,6 +422,7 @@ QFxVisualDataModelDataMetaObject::propertyCreated(int, QMetaPropertyBuilder &pro
}
}
} else if (data->m_model->m_abstractItemModel) {
+ data->m_model->ensureRoles();
for (QHash<int, QString>::ConstIterator iter = data->m_model->m_roleNames.begin();
iter != data->m_model->m_roleNames.end(); ++iter) {
@@ -560,12 +573,6 @@ void QFxVisualDataModel::setModel(const QVariant &model)
if (object && (d->m_listModelInterface = qobject_cast<QListModelInterface *>(object))) {
d->m_roles.clear();
d->m_roleNames.clear();
- if (d->m_listModelInterface) {
- d->m_roles = d->m_listModelInterface->roles();
- for (int ii = 0; ii < d->m_roles.count(); ++ii)
- d->m_roleNames.insert(d->m_roles.at(ii),
- d->m_listModelInterface->toString(d->m_roles.at(ii)));
- }
QObject::connect(d->m_listModelInterface, SIGNAL(itemsChanged(int,int,QList<int>)),
this, SLOT(_q_itemsChanged(int,int,QList<int>)));