diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2009-09-08 05:30:38 (GMT) |
---|---|---|
committer | Aaron Kennedy <aaron.kennedy@nokia.com> | 2009-09-08 05:30:38 (GMT) |
commit | cad3b0bdacdbdf407dfbdda5f6dc9cb7d96fa709 (patch) | |
tree | 37a16ff73fe102ac0cd169b20f9b12135903d33a /src/declarative/fx | |
parent | 5305831c3b0d58a61efadc1c1d3ce9ce4d6e8c77 (diff) | |
parent | b9a924a1e77faeeba595d0619afb14e8fdbb2dd4 (diff) | |
download | Qt-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.cpp | 88 | ||||
-rw-r--r-- | src/declarative/fx/qfxflickable.h | 5 | ||||
-rw-r--r-- | src/declarative/fx/qfxflickable_p.h | 7 | ||||
-rw-r--r-- | src/declarative/fx/qfxitem.cpp | 11 | ||||
-rw-r--r-- | src/declarative/fx/qfxlistview.cpp | 3 | ||||
-rw-r--r-- | src/declarative/fx/qfxloader.cpp | 65 | ||||
-rw-r--r-- | src/declarative/fx/qfxloader.h | 13 | ||||
-rw-r--r-- | src/declarative/fx/qfxpathview.cpp | 3 | ||||
-rw-r--r-- | src/declarative/fx/qfxtextinput.cpp | 54 | ||||
-rw-r--r-- | src/declarative/fx/qfxvisualitemmodel.cpp | 19 |
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>))); |